首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >智能契约函数的输入数据在发送到ethereum网络之前是如何用十六进制串封装的

智能契约函数的输入数据在发送到ethereum网络之前是如何用十六进制串封装的
EN

Stack Overflow用户
提问于 2018-07-11 21:32:23
回答 2查看 2.7K关注 0票数 1

为了解析来自私有链事务的数据并获取为特定事务发送的输入数据,我想了解这一点,我尝试过许多解码器,但在某些时候,它们失败了。这是我尝试使用混合的简单的智能契约。

代码语言:javascript
复制
   contract simple{

     uint256 deliveryID;
     string status;
     function stringAndUint(string _status,uint256 _deliveryID){
               status=_status;
               deliveryID=_deliveryID;
     }

    } 

生成的输入数据:- 0x3c38b7fd0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000067374617475730000000000000000000000000000000000000000000000000000

我可以从上面解释以下内容。

  • 函数签名:0x3c38b7fd
  • _status值:737461747573,
  • _deliveryID:0c,但我不知道为什么在737461747573之前有4人来,另外6人来。
  • 函数"stringAndUint“的输入是:"status",12可以帮助我理解输入数据是如何生成的,以及如何在长的十六进制字符串中进行分组。
EN

回答 2

Stack Overflow用户

发布于 2018-07-11 22:00:51

试着看看这里的http://solidity.readthedocs.io/en/v0.4.24/abi-spec.html#argument-encodinghttp://solidity.readthedocs.io/en/v0.4.24/abi-spec.html#use-of-dynamic-types

将编码拆分为32字节块将得到:

  • 3c38b7fd (函数签名)
  • 0000000000000000000000000000000000000000000000000000000000000040 (第一个参数的数据部分的位置,以字节为单位,从参数块开始测量)
  • 000000000000000000000000000000000000000000000000000000000000000c (12)
  • 0000000000000000000000000000000000000000000000000000000000000006 (状态的长度)。之前的0.040分)
  • 7374617475730000000000000000000000000000000000000000000000000000 ("status“然后零填充到下一个32字节的倍数中)
票数 5
EN

Stack Overflow用户

发布于 2018-07-11 22:06:28

所使用的编码是什么?

Solidity使用“合同ABI”规范进行编码。

额外的40和6有什么关系?

@Brendan关于这些值的答案比我的要好,所以我将删除这一节。我会把答案贴在网上,因为下面的部分仍然很有用。

按程序复制

在python中有一个名为eth-abi的ABI解码工具,您可以这样使用:

代码语言:javascript
复制
from eth_utils import to_bytes

encoded = to_bytes(hexstr="0x0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000067374617475730000000000000000000000000000000000000000000000000000")

from eth_abi import decode_abi

decoded = decode_abi(['string', 'uint256'], encoded)

assert decoded == (b'status', 12)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51294460

复制
相关文章

相似问题

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