我用一个方法创建了一个简单的测试契约:
pragma solidity ^0.4.24;
contract SimpleTest {
function testFunc(string name, bool isFirst) public {
//do stuff
}
}我用值"test name", true调用函数,一旦事务执行,就会看到以下编码输入:
0x1a387720
0000000000000000000000000000000000000000000000000000000000000040
0000000000000000000000000000000000000000000000000000000000000001
0000000000000000000000000000000000000000000000000000000000000009
74657374206e616d650000000000000000000000000000000000000000000000根据文档,它应该包括函数选择器和每个输入参数的一个32字节字符串。为什么我要得到4个32字节的字符串而不是2呢?我不清楚如何解码这个输入,以获得输入参数的实际值。
我用Remix来测试这个案子。
发布于 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的十六进制表示。
https://ethereum.stackexchange.com/questions/68558
复制相似问题