Go-Ethereum
使用 go-ethereum 解碼交易輸入
使用 go-ethereum (golang) 進行合約交易時,如何解碼交易輸入。
具體來說,給定 a
tx.Data []byte
,契約的contractABI abi.ABI
和被稱為它的方法methodID string
我如何tx.Data
從十六進制解碼到 go 類型?我試過這樣做
abi.Methods[methodID].Inputs.Arguments.UnpackValues(tx.Data)
,但這總是會導致一個空的值。程式碼:
func decodeTxParams(abi abi.ABI, method string, data []byte) ([]interface{}, error) { txParams, err := abi.Methods[method].Inputs.UnpackValues(data) if err != nil { return []interface{}{}, err } return txParams, nil }
呼叫者:
func (b *backend) SendTransaction(ctx context.Context, tx *types.Transaction) error { err := b.Client.SendTransaction(ctx, tx) if err != nil { return err } // update local nonce msg, err := tx.AsMessage(types.HomesteadSigner{}) if err != nil { return err } sender := msg.From() b.nonceManager.Lock(sender) b.nonceManager.Update(sender, tx.Nonce()) b.nonceManager.Unlock(sender) data := msg.Data() method, ok := b.methods[string(data[:4])] if !ok { method = "unknown" } txParams, err := decodeTxParams(b.abiMap[string(data[:4])], string(data[:4]), data[4:]) if err != nil { return err } if err != nil { glog.Infof("\n%vEth Transaction%v\n\nInvoking transaction: \"%v\". \nTransaction Failed: %v\n\n%v\n", strings.Repeat("*", 30), strings.Repeat("*", 30), method, err, strings.Repeat("*", 75)) return err } glog.Infof("\n%vEth Transaction%v\n\nInvoking transaction: \"%v\". Hash: \"%v\". \n\n%v\n", strings.Repeat("*", 30), strings.Repeat("*", 30), method, tx.Hash().String(), strings.Repeat("*", 75)) return nil }
func decodeTxParams(abi abi.ABI, v map[string]interface{}, data []byte) (map[string]interface{}, error) { m, err := abi.MethodById(data[:4]) if err != nil { return map[string]interface{}{}, err } if err := m.Inputs.UnpackIntoMap(v, data[4:]); err != nil { return map[string]interface{}{}, err } return v, nil }