WTF-Solidity
WTF-Solidity copied to clipboard
[Doc][Solidity 102] ABI编码解码
Details(细节)
在对动态类型进行编码时,有可能为32字节的倍数。所以,应该改为“32字节的倍数”。
Are you willing to submit a PR?(你愿意提交PR吗?)
- [X] Yes I am willing to submit a PR!(是的我愿意)
这里因为参数涉及到动态类型的编码再加上表述上的问题容易给学习者造成困惑,建议针对编码的结果进行解释,如下:
000000000000000000000000000000000000000000000000000000000000000a // x
0000000000000000000000007a58c0be72be218b41c608b7fe7c5bb630736c71 // addr
00000000000000000000000000000000000000000000000000000000000000a0 // name 参数的偏移量
0000000000000000000000000000000000000000000000000000000000000005 // array[0]
0000000000000000000000000000000000000000000000000000000000000006 // array[1]
0000000000000000000000000000000000000000000000000000000000000004 // name 参数的长度为4字节
3078414100000000000000000000000000000000000000000000000000000000 // name
其中 name 参数被转换为UTF-8的字节值 0x30784141,在 abi 编码规范中, uint[2] 和 string 都属于 动态类型 ,动态类型的参数需要借助偏移量进行编码,可以参考动态类型的使用。由于 abi.encode 会将每个参与编码的参数元素(包括偏移量,长度)都填充为32字节(evm字长为32字节),所以可以看到编码后的数据中有很多填充的 0 。
@XdpCs 这个issue可以提pr吗
@XdpCs 这个issue可以提pr吗
晚点有空 回复你
@XdpCs 这个issue可以提pr吗
可以提pr,但是语言准确性还需要修改一下
000000000000000000000000000000000000000000000000000000000000000a // x的实际输入值
0000000000000000000000007a58c0be72be218b41c608b7fe7c5bb630736c71 // addr的实际输入值
00000000000000000000000000000000000000000000000000000000000000a0 // name 参数的实际输入值的偏移量
0000000000000000000000000000000000000000000000000000000000000005 // array[0]的实际输入值
0000000000000000000000000000000000000000000000000000000000000006 // array[1]的实际输入值
0000000000000000000000000000000000000000000000000000000000000004 // name 参数的实际输入值的长度为4字节
3078414100000000000000000000000000000000000000000000000000000000 // name的实际输入值的编码
uint[2] 应该不属于动态类型
ref: T[k] for any dynamic T and any k >= 0 https://docs.soliditylang.org/en/develop/abi-spec.html