Golang

如何使用 golang 使用 ABI 解碼輸入數據?

  • June 3, 2021

npm ethereum-input-data-decoder上有一個工具。是的,我可以將輸入數據讀取為十六進制。

我希望我可以使用 golang 解碼交易的輸入數據。例如 0xa9059cbb0000000000000000000000000067f883a42031215622e0b84c96d0e4dca7a3ce810000000000000000000000000000000000000000000000000e000000000

謝謝。

我花了一些時間來弄清楚 myAbi.Unpack(…) 解包方法或事件的輸出。在您的情況下(和我的情況下),我們想要解壓縮輸入。這是一個工作程式碼範例

// example of transaction input data
txInput := "0xa5142faa00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000003"

// load contract ABI
abi, err := abi.JSON(strings.NewReader(myContractAbi))
if err != nil {
   log.Fatal(err)
}

// decode txInput method signature
decodedSig, err := hex.DecodeString(txInput[2:10])
if err != nil {
   log.Fatal(err)
}

// recover Method from signature and ABI
method, err := abi.MethodById(decodedSig)
if err != nil {
   log.Fatal(err)
}

// decode txInput Payload
decodedData, err := hex.DecodeString(txInput[10:])
if err != nil {
   log.Fatal(err)
}

// create strut that matches input names to unpack
// for example my function takes 2 inputs, with names "Name1" and "Name2" and of type uint256 (solidity)
type FunctionInputs struct {
   Name1 *big.Int // *big.Int for uint256 for example
   Name2 *big.Int
}

var data FunctionInputs

// unpack method inputs
err = method.Inputs.Unpack(&data, decodedData)
if err != nil {
   log.Fatal(err)
}

fmt.Println(data)

這是未經測試的,但它會是這樣的:

myAbi, err := abi.JSON(strings.NewReader(abiJsonString))
if err != nil {
   log.Fatal(err)
}

var ifc map[string]interface{}
encodedData := "0x00123..."
err := myApi.Unpack(&ifc, "someMethod", encodedData)
if err != nil {
    log.Fatal(err)
}

您還必須遍歷所有 ABI 方法並將其插入該abi.Unpack方法的第二個參數以查找數據屬於哪個方法。

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