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

相关文章

zookeeper端口说明及介绍

《zookeeper端口说明及介绍》:本文主要介绍zookeeper端口说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、zookeeper有三个端口(可以修改)aVNMqvZ二、3个端口的作用三、部署时注意总China编程结一、zookeeper有三个端口(可以

Go语言中make和new的区别及说明

《Go语言中make和new的区别及说明》:本文主要介绍Go语言中make和new的区别及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1 概述2 new 函数2.1 功能2.2 语法2.3 初始化案例3 make 函数3.1 功能3.2 语法3.3 初始化

java中新生代和老生代的关系说明

《java中新生代和老生代的关系说明》:本文主要介绍java中新生代和老生代的关系说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、内存区域划分新生代老年代二、对象生命周期与晋升流程三、新生代与老年代的协作机制1. 跨代引用处理2. 动态年龄判定3. 空间分

MySQL之InnoDB存储引擎中的索引用法及说明

《MySQL之InnoDB存储引擎中的索引用法及说明》:本文主要介绍MySQL之InnoDB存储引擎中的索引用法及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录1、背景2、准备3、正篇【1】存储用户记录的数据页【2】存储目录项记录的数据页【3】聚簇索引【4】二

mysql中的数据目录用法及说明

《mysql中的数据目录用法及说明》:本文主要介绍mysql中的数据目录用法及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、背景2、版本3、数据目录4、总结1、背景安装mysql之后,在安装目录下会有一个data目录,我们创建的数据库、创建的表、插入的

Maven中的profiles使用及说明

《Maven中的profiles使用及说明》:本文主要介绍Maven中的profiles使用及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录主要用途定义 Profiles示例:多环境配置激活 Profiles示例:资源过滤示例:依赖管理总结Maven 中的

如何在Mac上彻底删除Edge账户? 手动卸载Edge浏览器并清理残留文件技巧

《如何在Mac上彻底删除Edge账户?手动卸载Edge浏览器并清理残留文件技巧》Mac上的Edge账户里存了不少网站密码和个人信息,结果同事一不小心打开了,简直尴尬到爆炸,想要卸载edge浏览器并清... 如果你遇到 Microsoft Edge 浏览器运行迟缓、频繁崩溃或网页加载异常等问题,可以尝试多种方

Before和BeforeClass的区别及说明

《Before和BeforeClass的区别及说明》:本文主要介绍Before和BeforeClass的区别及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Before和BeforeClass的区别一个简单的例子当运行这个测试类时总结Before和Befor

Python pip下载包及所有依赖到指定文件夹的步骤说明

《Pythonpip下载包及所有依赖到指定文件夹的步骤说明》为了方便开发和部署,我们常常需要将Python项目所依赖的第三方包导出到本地文件夹中,:本文主要介绍Pythonpip下载包及所有依... 目录步骤说明命令格式示例参数说明离线安装方法注意事项总结要使用pip下载包及其所有依赖到指定文件夹,请按照以

Spring中管理bean对象的方式(专业级说明)

《Spring中管理bean对象的方式(专业级说明)》在Spring框架中,Bean的管理是核心功能,主要通过IoC(控制反转)容器实现,下面给大家介绍Spring中管理bean对象的方式,感兴趣的朋... 目录1.Bean的声明与注册1.1 基于XML配置1.2 基于注解(主流方式)1.3 基于Java