首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用go-ethereum解码事务输入

用go-ethereum解码事务输入
EN

Ethereum用户
提问于 2019-12-05 17:12:03
回答 1查看 2.4K关注 0票数 0

当使用golang (golang)进行合同事务时,我如何解码事务输入。

特别是给定一个tx.Data []byte、契约的contractABI abi.ABI和被称为它的methodID string的方法--如何将tx.Data从十六进制解码为go类型?

我尝试过执行abi.Methods[methodID].Inputs.Arguments.UnpackValues(tx.Data),但是这总是导致一段空的值。

代码:

代码语言:javascript
复制
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
}

来电者:

代码语言:javascript
复制
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
}
EN

回答 1

Ethereum用户

回答已采纳

发布于 2019-12-06 01:09:38

代码语言:javascript
复制
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
}
票数 1
EN
页面原文内容由Ethereum提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://ethereum.stackexchange.com/questions/78087

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档