LOADING...
LOADING...
LOADING...
当前位置: 玩币族首页 > 行情分析 > Solidity极简入门|第二十七讲:ABI编码解码

Solidity极简入门|第二十七讲:ABI编码解码

2022-09-09 区块律动BlockBeat 来源:区块链网络
原文标题:《 Solidity 极简入门: 27.ABI 编码解码 》
原文作者:0xAA


我最近在重新学 solidity,巩固一下细节,也写一个「Solidity 极简入门」,供小白们使用(编程大佬可以另找教程),每周更新 1-3 讲。


所有代码和教程开源在 github: github.com/AmazingAng/WTFSolidity


ABI(Application Binary Interface,应用二进制接口) 是与以太坊智能合约交互的标准。数据基于他们的类型编码;并且由于编码后不包含类型信息,解码时需要注明它们的类型。


Solidity 中,ABI 编码有 4 个函数:abi.encode,abi.encodePacked,abi.encodeWithSignature,abi.encodeWithSelector。而 ABI 解码有 1 个函数:abi.decode,用于解码 abi.encode 的数据。这一讲,我们将学习如何使用这些函数。


ABI 编码


我们将用编码 4 个变量,他们的类型分别是 uint256,address,string,uint256[2]:



abi.encode


将给定参数利用ABI 规则编码。ABI 被设计出来跟智能合约交互,他将每个参数转填充为 32 字节的数据,并拼接在一起。如果你要和合约交互,你要用的就是 abi.encode。



编码的结果为0x000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000007a58c0be72be218b41c608b7fe7c5bb630736c7100000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000005000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000043078414100000000000000000000000000000000000000000000000000000000,由于 abi.encode 将每个数据都填充为 32 字节,中间有很多 0。


abi.encodePacked


将给定参数根据其所需最低空间编码。它类似abi.encode,但是会把其中填充的很多 0 省略。比如,只用 1 字节来编码 uint 类型。当你想省空间,并且不与合约交互的时候,可以使用 abi.encodePacked,例如算一些数据的 hash 时。



编码的结果为 0x000000000000000000000000000000000000000000000000000000000000000a7a58c0be72be218b41c608b7fe7c5bb630736c713078414100000000000000000000000000000000000000000000000000000000000000050000000000000000000000000000000000000000000000000000000000000006,由于 abi.encodePacked 对编码进行了压缩,长度比 abi.encode 短很多。


abi.encodeWithSignature


与 abi.encode 功能类似,只不过第一个参数为函数签名,比如"foo(uint256,address)"。当调用其他合约的时候可以使用。



编码的结果为 0xe87082f1000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000007a58c0be72be218b41c608b7fe7c5bb630736c7100000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000005000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000043078414100000000000000000000000000000000000000000000000000000000,等同于在 abi.encode 编码结果前加上了 4 字节的函数选择器。


abi.encodeWithSelector


与 abi.encodeWithSignature 功能类似,只不过第一个参数为函数选择器,为函数签名 Keccak 哈希的前 4 个字节。



编码的结果为 0xe87082f1000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000007a58c0be72be218b41c608b7fe7c5bb630736c7100000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000005000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000043078414100000000000000000000000000000000000000000000000000000000,与 abi.encodeWithSignature 结果一样。


ABI 解码


abi.decode


abi.decode 用于解码 abi.encode 生成的二进制编码,将它还原成原本的参数。



我们将 abi.encode 的二进制编码输入给 decode,将解码出原来的参数:


abi.decode 解码字节码


总结


在以太坊中,数据必须编码成字节码才能和智能合约交互。这一讲,我们介绍了 4 种 abi 编码方法和 1 种 abi 解码方法。


原文链接


—-

编译者/作者:区块律动BlockBeat

玩币族申明:玩币族作为开放的资讯翻译/分享平台,所提供的所有资讯仅代表作者个人观点,与玩币族平台立场无关,且不构成任何投资理财建议。文章版权归原作者所有。

知识 Solidity
LOADING...
LOADING...