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找零和正常的使用者充值加以區分