首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >编码输入仿射

编码输入仿射
EN

Ethereum用户
提问于 2019-03-19 22:52:09
回答 1查看 1.9K关注 0票数 3

我用一个方法创建了一个简单的测试契约:

代码语言:javascript
复制
pragma solidity ^0.4.24;

contract SimpleTest {

    function testFunc(string name, bool isFirst) public {
        //do stuff
    }

}

我用值"test name", true调用函数,一旦事务执行,就会看到以下编码输入:

代码语言:javascript
复制
0x1a387720
0000000000000000000000000000000000000000000000000000000000000040
0000000000000000000000000000000000000000000000000000000000000001
0000000000000000000000000000000000000000000000000000000000000009
74657374206e616d650000000000000000000000000000000000000000000000

根据文档,它应该包括函数选择器和每个输入参数的一个32字节字符串。为什么我要得到4个32字节的字符串而不是2呢?我不清楚如何解码这个输入,以获得输入参数的实际值。

我用Remix来测试这个案子。

EN

回答 1

Ethereum用户

回答已采纳

发布于 2019-03-19 23:27:32

事务是基于合同ABI规范编码的。这是很难通过,但这些医生有所有的答案,你的问题。

所讨论的事务正在传递两个参数:动态字符串(name )和静态bool (isFirst )。在对参数进行编码时,EVM会查看参数是静态的还是动态的。

静态参数是以相当简单的方式编码的--它们被转换成十六进制表示,然后连接到输入数据十六进制字符串。

动态值更有趣。使用文档的部分可以完全理解,但其思想是编码的数据是数据的位置。然后,在所有动态类型之后,将编码的数据本身连接到输入数据十六进制字符串的末尾。对于动态类型,然后包含参数的长度,然后是数据本身。

你发布的交易分类如下:

0x1a38772000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000974657374206e616d650000000000000000000000000000000000000000000000

0x1a387720

这是调用的函数的方法ID (在本例中是testFunc(string, bool))

0000000000000000000000000000000000000000000000000000000000000040

这是第一个(动态)参数的位置。这是name所在的位置,但不是数据本身。

0000000000000000000000000000000000000000000000000000000000000001

这是与事务一起发送的isFirst参数。1等同于true

0000000000000000000000000000000000000000000000000000000000000009

这是动态name的长度。在这种情况下,字符串有9个字符。

74657374206e616d650000000000000000000000000000000000000000000000

用于“测试名称”的ASCII的十六进制表示。

票数 6
EN
页面原文内容由Ethereum提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

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

复制
相关文章

相似问题

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