手动构造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

相关文章

MybatisPlus中几种条件构造器运用方式

《MybatisPlus中几种条件构造器运用方式》QueryWrapper是Mybatis-Plus提供的一个用于构建SQL查询条件的工具类,提供了各种方法如eq、ne、gt、ge、lt、le、lik... 目录版本介绍QueryWrapperLambdaQueryWrapperUpdateWrapperL

Linux内核定时器使用及说明

《Linux内核定时器使用及说明》文章详细介绍了Linux内核定时器的特性、核心数据结构、时间相关转换函数以及操作API,通过示例展示了如何编写和使用定时器,包括按键消抖的应用... 目录1.linux内核定时器特征2.Linux内核定时器核心数据结构3.Linux内核时间相关转换函数4.Linux内核定时

Java之ServerSocket使用及说明

《Java之ServerSocket使用及说明》本文介绍了Java中ServerSocket类的使用方法,包括创建ServerSocket对象、绑定端口、监听连接请求、接受连接、关闭连接等常用方法,还... 目录前言常用方法使用案例1.实现TCP2.实现UDP总结前言Java中的ServerSocket

Java Exception与RuntimeException使用及说明

《JavaException与RuntimeException使用及说明》:本文主要介绍JavaException与RuntimeException使用及说明,具有很好的参考价值,希望对大家有所... 目录简介ExceptionRuntimeException自定义异常选择继承Exception(受检异常)

MySQL中存储过程(procedure)的使用及说明

《MySQL中存储过程(procedure)的使用及说明》存储过程是预先定义的SQL语句集合,可在数据库中重复调用,它们提供事务性、高效性和安全性,MySQL和Java中均可创建和调用存储过程,示例展... 目录概念示例1示例2总结概念存储过程:在数据库中预先定义好一组SQL语句,可以被程序反复调用。

Linux join命令的使用及说明

《Linuxjoin命令的使用及说明》`join`命令用于在Linux中按字段将两个文件进行连接,类似于SQL的JOIN,它需要两个文件按用于匹配的字段排序,并且第一个文件的换行符必须是LF,`jo... 目录一. 基本语法二. 数据准备三. 指定文件的连接key四.-a输出指定文件的所有行五.-o指定输出

Linux云服务器手动配置DNS的方法步骤

《Linux云服务器手动配置DNS的方法步骤》在Linux云服务器上手动配置DNS(域名系统)是确保服务器能够正常解析域名的重要步骤,以下是详细的配置方法,包括系统文件的修改和常见问题的解决方案,需要... 目录1. 为什么需要手动配置 DNS?2. 手动配置 DNS 的方法方法 1:修改 /etc/res

Redis中Hash从使用过程到原理说明

《Redis中Hash从使用过程到原理说明》RedisHash结构用于存储字段-值对,适合对象数据,支持HSET、HGET等命令,采用ziplist或hashtable编码,通过渐进式rehash优化... 目录一、开篇:Hash就像超市的货架二、Hash的基本使用1. 常用命令示例2. Java操作示例三

Redis中Set结构使用过程与原理说明

《Redis中Set结构使用过程与原理说明》本文解析了RedisSet数据结构,涵盖其基本操作(如添加、查找)、集合运算(交并差)、底层实现(intset与hashtable自动切换机制)、典型应用场... 目录开篇:从购物车到Redis Set一、Redis Set的基本操作1.1 编程常用命令1.2 集

Python sys模块的使用及说明

《Pythonsys模块的使用及说明》Pythonsys模块是核心工具,用于解释器交互与运行时控制,涵盖命令行参数处理、路径修改、强制退出、I/O重定向、系统信息获取等功能,适用于脚本开发与调试,需... 目录python sys 模块详解常用功能与代码示例获取命令行参数修改模块搜索路径强制退出程序标准输入