Solidity
解碼沒有 ABI 的輸入參數
我有一個輸入數據的事務,如下所示:
0x2293db5700000000000000000000000030823e060e8be429b34bd9192df9cad4b166a056
我知道最後 40 個字元是令牌地址,它轉換為
0x + 8051325147ec6df28f8f8b7fa4248e84c5a2e486
有沒有辦法解碼這樣的輸入數據?Solidity 合約是否對輸入參數使用一些預設編碼?
Solidity 是一種類型化語言,因此它知道函式參數的類型。當你在合約上呼叫某個函式時,Solidity 知道第一個參數的類型是地址,並且可以將其解碼為地址。ABI 是從 Solidity 原始碼中指定的類型自動生成的。
對於僅從該特定輸入數據中獲取地址的簡單情況,您可以執行以下操作(在 JS 中):
const input = '0x2293db5700000000000000000000000030823e060e8be429b34bd9192df9cad4b166a056'; const address = `0x${input.slice(-40)}`; console.log(address); // 0x30823e060e8be429b34bd9192df9cad4b166a056
在其他情況下,您可能想要解碼其他類型的數據,您可以先對前 4 個字節(8 個十六進製字元)進行切片,然後使用類似 Ethers.js 的 ABI 解碼器:
import { defaultAbiCoder } from '@ethersproject/abi'; const input = '0x2293db5700000000000000000000000030823e060e8be429b34bd9192df9cad4b166a056'; const address = defaultAbiCoder.decode(['address'], input.slice(10)); console.log(address); // 0x30823e060e8be429b34bd9192df9cad4b166a056
您可以替換
address
為參數的類型,如果您的合約函式有多個輸入參數,只需將它們添加到數組中即可。
如果你去這裡: https : //bscscan.com/address/0x890308ccaeb490a536ee70230f9183524b17f082#code 你會看到一個反編譯合約的按鈕: