Go-Ethereum

使用 go-ethereum 解碼交易輸入

  • February 13, 2022

使用 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
}

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