手动构造Qtum合约交易的说明

2023-10-30 19:30

本文主要是介绍手动构造Qtum合约交易的说明,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Qtum的交易结构和比特币基本一致,由version、inputs、outputs、locktime等组成,其中合约的部分是通过在outputs中的scriptPubKey中实现的。

opcode

Qtum在比特币的基础上新增了OP_CREATE和OP_CALL这两个指令,

OP_CREATE = 0xc1,用于创建合约时使用;

OP_CALL = 0xc2,用于调用合约时使用,即sendtocontract的时候。

OP_CALL的使用

一笔调用合约的交易,他的scriptPubKey内容为: vm_version + gas_limit + gas_price + datahex + contract_address + OP_CALL

其中datahex为编码后的合约函数+参数,我们可以通过 ethabi来生成

比如 调用function foo(uint) 就可以通过 ethabi encode function test.json foo -p 100 -l 得到datahex。

  • https://github.com/ethereum/wiki/wiki/Ethereum-Contract-ABI
  • eth-abi python
  • ethabi-js

实例解析

以测试网络上一笔token转账交易为例,txid:f7eac4a0e40599d7c094353eb139aa2076be02535d66e221799d67d01054c27a

他的scriptPubKey内容为:01040390d003012844a9059cbb00000000000000000000000081f9fc3ee3667397b58f3a53c60e7556e98cf595000000000000000000000000000000000000000000000000000009184e72a00014e21bc819674c8f7cc7d76b618914ecff082107b3c2

其中 0104 // vm_version

0390d003 // gas_limit,16进制的03d090等于250000

0128 // gas_price,16进制的28等于40

44a9059cbb00000000000000000000000081f9fc3ee3667397b58f3a53c60e7556e98cf595000000000000000000000000000000000000000000000000000009184e72a000 //datahex

14e21bc819674c8f7cc7d76b618914ecff082107b3 // contract address

c2 // OP_CALL

谁是合约的调用者

一笔合约交易vin里的首个UTXO对应的拥有者会被视为合约的调用者。

GAS找零

gas_price * gas_limit 就是用户调用合约支付的GAS总数,当交易得到确认之后,矿工会在coinstake交易里面加上一笔output用于返还多支付的GAS,返还的对象是合约的调用者。

对于交易所来说,需要对GAS找零和正常的用户充值加以区分

参考实现代码

  • https://github.com/qtumproject/qtumjs-lib/blob/master/src/utils.js#L132
  • https://github.com/qtumproject/qtum-electrum/blob/master/gui/qt/main_window.py#L3212
  • https://github.com/wangh09/bitcoincashj/blob/master/core/src/main/java/org/bitcoincashj/wallet/Wallet.java#L3821

这篇关于手动构造Qtum合约交易的说明的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/310098

相关文章

Redis中哨兵机制和集群的区别及说明

《Redis中哨兵机制和集群的区别及说明》Redis哨兵通过主从复制实现高可用,适用于中小规模数据;集群采用分布式分片,支持动态扩展,适合大规模数据,哨兵管理简单但扩展性弱,集群性能更强但架构复杂,根... 目录一、架构设计与节点角色1. 哨兵机制(Sentinel)2. 集群(Cluster)二、数据分片

Springboot项目构建时各种依赖详细介绍与依赖关系说明详解

《Springboot项目构建时各种依赖详细介绍与依赖关系说明详解》SpringBoot通过spring-boot-dependencies统一依赖版本管理,spring-boot-starter-w... 目录一、spring-boot-dependencies1.简介2. 内容概览3.核心内容结构4.

redis和redission分布式锁原理及区别说明

《redis和redission分布式锁原理及区别说明》文章对比了synchronized、乐观锁、Redis分布式锁及Redission锁的原理与区别,指出在集群环境下synchronized失效,... 目录Redis和redission分布式锁原理及区别1、有的同伴想到了synchronized关键字

MySQL 临时表创建与使用详细说明

《MySQL临时表创建与使用详细说明》MySQL临时表是存储在内存或磁盘的临时数据表,会话结束时自动销毁,适合存储中间计算结果或临时数据集,其名称以#开头(如#TempTable),本文给大家介绍M... 目录mysql 临时表详细说明1.定义2.核心特性3.创建与使用4.典型应用场景5.生命周期管理6.注

Java中数组与栈和堆之间的关系说明

《Java中数组与栈和堆之间的关系说明》文章讲解了Java数组的初始化方式、内存存储机制、引用传递特性及遍历、排序、拷贝技巧,强调引用数据类型方法调用时形参可能修改实参,但需注意引用指向单一对象的特性... 目录Java中数组与栈和堆的关系遍历数组接下来是一些编程小技巧总结Java中数组与栈和堆的关系关于

Python实现网格交易策略的过程

《Python实现网格交易策略的过程》本文讲解Python网格交易策略,利用ccxt获取加密货币数据及backtrader回测,通过设定网格节点,低买高卖获利,适合震荡行情,下面跟我一起看看我们的第一... 网格交易是一种经典的量化交易策略,其核心思想是在价格上下预设多个“网格”,当价格触发特定网格时执行买

2025版mysql8.0.41 winx64 手动安装详细教程

《2025版mysql8.0.41winx64手动安装详细教程》本文指导Windows系统下MySQL安装配置,包含解压、设置环境变量、my.ini配置、初始化密码获取、服务安装与手动启动等步骤,... 目录一、下载安装包二、配置环境变量三、安装配置四、启动 mysql 服务,修改密码一、下载安装包安装地

mybatis-plus QueryWrapper中or,and的使用及说明

《mybatis-plusQueryWrapper中or,and的使用及说明》使用MyBatisPlusQueryWrapper时,因同时添加角色权限固定条件和多字段模糊查询导致数据异常展示,排查发... 目录QueryWrapper中or,and使用列表中还要同时模糊查询多个字段经过排查这就导致只要whe

SpringBoot改造MCP服务器的详细说明(StreamableHTTP 类型)

《SpringBoot改造MCP服务器的详细说明(StreamableHTTP类型)》本文介绍了SpringBoot如何实现MCPStreamableHTTP服务器,并且使用CherryStudio... 目录SpringBoot改造MCP服务器(StreamableHTTP)1 项目说明2 使用说明2.1

JAVA覆盖和重写的区别及说明

《JAVA覆盖和重写的区别及说明》非静态方法的覆盖即重写,具有多态性;静态方法无法被覆盖,但可被重写(仅通过类名调用),二者区别在于绑定时机与引用类型关联性... 目录Java覆盖和重写的区别经常听到两种话认真读完上面两份代码JAVA覆盖和重写的区别经常听到两种话1.覆盖=重写。2.静态方法可andro