Golang
如何使用 golang 使用 ABI 解碼輸入數據?
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
方法的第二個參數以查找數據屬於哪個方法。