Solidity

解碼沒有 ABI 的輸入參數

  • March 23, 2022

我有一個輸入數據的事務,如下所示:

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/0x890308cca​​eb490a536ee70230f9183524b17f082#code 你會看到一個反編譯合約的按鈕: 在此處輸入圖像描述

看來您可以從結果中計算出 abi: 在此處輸入圖像描述

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