手動構造Qtum合約交易的說明

QTUM量子鏈開發團隊發表於2018-07-16

手動構造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。

例項解析

以測試網路上一筆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找零和正常的使用者充值加以區分

參考實現程式碼


相關文章