etherscan 的“建構子參數(ABI 編碼,是上述契約創建程式碼的最後一個字節)”是什麼意思?
我正在檢查 etherscan 上的契約,網址如下:
https://etherscan.io/address/0x5cb5f46a655c02889172323760d12d0e5d83cdaf#code
在網頁底部,我看到兩個部分:
- 合約創建程式碼
- 建構子參數(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
你還可以看看: 合約創建交易中建構子的參數是如何編碼的?