Web3js

對部署合約時使用的建構子參數進行編碼

  • January 9, 2019

部署合約時如何編碼建構子參數?

這是我的部署功能:

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);
}

在此函式中,我可以執行以下操作:

  1. console.log(transaction.arguments);
  2. 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 編碼的開始。

引用自:https://ethereum.stackexchange.com/questions/65272