Web3js
對部署合約時使用的建構子參數進行編碼
部署合約時如何編碼建構子參數?
這是我的部署功能:
async function deploy(abi, bin, args) { let contract = new this.web3.eth.Contract(JSON.parse(abi)); let transaction = contract.deploy({data: "0x" + bin, arguments: args}); let handle = await this.send(transaction); return new this.web3.eth.Contract(JSON.parse(abi), handle.contractAddress); }
在此函式中,我可以執行以下操作:
console.log(transaction.arguments);
console.log(transaction.encodeABI());
第一個選項只是按原樣列印參數的值。
第二個選項列印整個字節碼。
我的編碼參數確實出現在這個字節碼的末尾。
但由於我不知道這個後綴的長度,我不能輕易地從字節碼中“剪掉”它。
我想到的一個選項是,這個後綴的長度是
64 * args.length
,因為每個參數都被填充到 256 位(64 個十六進制數字)。但我不認為當某些參數是字元串或數組時這會起作用。
web3.js 中是否有任何標準解決方案?
謝謝!
好的,找到了一種方法:
如果 的值以
bin
開頭0x
:let encodedArgs = transaction.encodeABI().slice(bin.length)
如果 的值
bin
不以 開頭0x
:let encodedArgs = transaction.encodeABI().slice(2 + bin.length)
我不知道標準解決方案,但 Solidity 編譯器可以為您提供將通過bin-runtime命令放置在區塊鏈上的二進制數據。這就像
bin
沒有建構子(bin
輸出的第一部分)和建構子參數(輸出的最後部分bin
)。因此,您應該能夠查看結尾bin-runtime
並找到bin
輸出中出現這種情況的位置。此位置之後的第一個字節應該是建構子參數的 ABI 編碼的開始。