当使用golang (golang)进行合同事务时,我如何解码事务输入。
特别是给定一个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
}发布于 2019-12-06 01:09:38
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
复制相似问题