Contract-Deployment

etherscan 的“建構子參數(ABI 編碼,是上述契約創建程式碼的最後一個字節)”是什麼意思?

  • January 8, 2019

我正在檢查 etherscan 上的契約,網址如下:

https://etherscan.io/address/0x5cb5f46a655c02889172323760d12d0e5d83cdaf#code

在網頁底部,我看到兩個部分:

  1. 合約創建程式碼
  2. 建構子參數(ABI 編碼,是上述合約創建程式碼的最後一個字節)

第二部分的內容肯定不等於第一部分的最後一個字節。

那麼“上面的合約創建程式碼的最後一個字節”到底是什麼意思呢?

我的最終目標實際上是獲取其他合約的建構子參數。

然而,當我在 etherscan 上檢查這份合約時,第二部分根本沒有出現。

所以我希望我能以某種方式從第一部分中提取它,但我無法弄清楚它們之間的關係(如果有的話)。

可以通過以下 URL 在 etherscan 上檢查其他合約:

https://etherscan.io/address/0x5248e5fd5d3b43126e5352807f75d6a7d6d7eafb#code

謝謝!

ABI 標准定義瞭如何在智能合約的函式呼叫中編碼參數和訪問函式。

ABI 標準規定建構子參數放在合約創建程式碼的末尾。如果您查看合約創建交易的init欄位(etherscan 在下面的連結中將其稱為 Input Data Field),您將看到 etherscan 已將其解釋為建構子參數的數據(它是 Input Data Field 的結尾):

000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000e40ee0e6e309b9e68362b78c3801928b511a7e30000000000000000000000002bcc3e2c286780e8c63823a4bddd7f7e3dbd35dc

https://etherscan.io/tx/0x03ae45ef510d108fa553df60181e0f574f3936550dfcc2266efea60b1aeddfa5

因此,etherscan 上名為“Contract Creation Code”的欄位似乎不包括建構子參數,因為文本會以其他方式指示。

深入探勘合約創建程式碼(上面的 Input Data 欄位)會發現建構子參數從init欄位的字節 6993 ( 0x1B51)開始。該值 (1b51) 也出現在輸入數據欄位的開頭兩次。我手動執行二進制程式碼(init 欄位的前 28 個字節**),發現從init欄位末尾開始的字節被複製到記憶體(虛擬機)。因此,編譯後的程式碼將建構子參數從init**欄位複製到記憶體,並在建構子的進一步執行中從那裡訪問它們。0x1b51

你還可以看看: 合約創建交易中建構子的參數是如何編碼的?

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