Web3js

從地址訪問已部署合約的建構子參數

  • February 10, 2019

我正在使用ethers.js,但任何答案都可以!

我正在嘗試訪問部署時使用的契約的建構子參數,以確保契約在被使用者部署之前沒有被修改。

我可以從帶有ethers.js函式的合約中獲取程式碼,provider.getCode(_address)但它不包括在合約的建構子中傳遞的參數。

任何人都知道如何做到這一點?

如果您有原始碼,您可以從 getCode 中確定參數。將帶有建構子參數的合約部署到網路的方式實際上只是將合約的字節碼與 ABI 編碼參數連接起來。

例如,查看AirDropToken 程式碼部署它的事務

您會注意到交易中的數據以合約字節碼開頭,最後還有一些額外的內容:

00000000000000000000000000000000000000000000000000000000000000a0
00000000000000000000000000000000000000000000000000000000000000e0
0000000000000000000000000000000000000000000000000000000000000012
dc03b7993bad736ad595eb9e3ba51877ac17ecc31d2355f8f270125b9427ece7
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000011
506920446179204e30306220546f6b656e000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000003
5049450000000000000000000000000000000000000000000000000000000000

如果我們對此進行解碼(使用原始碼,我們知道建構子參數):

var ethers = require('ethers');

// Types from the constructor
var types = [ 'string', 'string', 'uint8', 'bytes32', 'uint256' ];

// data is '0x' + the above lines
ethers.utils.AbiCoder.defaultCoder.decode(types, data);
/* [ 'Pi Day N00b Token',
*   'PIE',
*   18,
*   '0xdc03b7993bad736ad595eb9e3ba51877ac17ecc31d2355f8f270125b9427ece7',
*   BigNumber { _bn: <BN: 0> } ]
*/

在第三方部署通用智能合約後,無法訪問這些參數。

根據您要完成的具體目標以及您對正在部署的智能合約的控製程度,這裡有幾個選項:

  • 檢查這些參數影響的值,例如totalSupply您是否正在部署 ERC20 智能合約。我在想,如果一個參數不會以任何方式影響智能合約的狀態,那麼它就不是一個重要的參數,所以你實際上並不關心檢查它。
  • 如果您可以影響要觀看的智能合約程式碼,請創建一個自定義事件,比如說ContractDeployed,使用您想要的參數從建構子中觸發它,然後檢查該智能合約生成的事件

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