面向开发人员的 Solidity:使用Solidity进行ABI编码和解码
智能合约基本上由状态变量和函数组成。有些函数是私有的,只能从合约内部访问,但许多函数是公共的,可以从合约外部访问。也就是说,应用程序(和人)可以向合约发送数据并从合约中检索数据。
要将数据发送到合约,我们需要以合约可以读取的方式发送数据。也就是说,它们需要被编码。如何执行这种编码的规则由以太坊虚拟机(EVM)的实现定义。
在本文中,我们将学习一些关于编码规则的知识,以及如何使用solidity对必须作为函数参数发送的数据进行编码和解码。
使用abi.encode()对函数的参数进行编码
Solidity有一个名为abi的全局变量,它有一个encode方法,因此我们可以使用它对任何函数的参数进行编码。让我们从一个简单的例子开始。假设我们有下面这个函数
function myFunction(address _myAddress, uint _myNumber)...
我们只对函数的参数进行编码,即地址和整数。我们可以使用 remix 来创建一个执行此操作的函数。
部署这个合约,并使用以下地址和无符号整数的值调用函数encode(…):(0x5b38da6a701c568545dcfcb03fcb875f56bedddc4, 127),我们得到了结果
0x0000000000000000000000005b38da6a701c568545dcfcb03fcb875f56beddc4000000000000000000000000000000000000000000000000000000000000007f
对结果的快速分析显示,它有64个字节。这是因为编码是以32字节的倍数进行的:
0000000000000000000000005b38da6a701c568545dcfcb03fcb875f56beddc4 000000000000000000000000000000000000000000000000000000000000007f
前32个字节包含地址(20个字节),其余32个字节包含整数7f。编码总是十六进制,十六进制的7f是127。
使用abi.decode()解码函数的参数
现在让我们使用Solidity来解码函数的参数。注意,没有必要识别我们正在处理的函数,因为它的签名将在编码参数之前。为了使问题更加复杂,让我们使用动态变量作为参数。
让我们使用以下合约来解码一组值:string、uint和string。
contract Encode {function encode(string memory _string1, uint _uint, string memory _string2) public pure returns (bytes memory) { return (abi.encode(_string1, _uint, _string2)); }function decode(bytes memory data) public pure returns (string memory _str1, uint _number, string memory _str2) { (_str1, _number, _str2) = abi.decode(data, (string, uint, string));
}}
部署,然后使用以下参数(João,3,Paulo)调用函数encode(…),我们有以下返回:
0x0000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000054a6fc3a36f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000055061756c6f000000000000000000000000000000000000000000000000000000
我们可能期望返回96个字节(3 x 32),因为我们有3个变量。但是,这3个变量中有2个是动态的,对动态变量的编码就没那么简单了。让我把上面的值分解成32字节的数据块。
0000000000000000000000000000000000000000000000000000000000000060 0000000000000000000000000000000000000000000000000000000000000003 00000000000000000000000000000000000000000000000000000000000000a0 0000000000000000000000000000000000000000000000000000000000000005 4a6fc3a36f000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000005 5061756c6f000000000000000000000000000000000000000000000000000000
我将快速解释一下字符串的编码是如何完成的。第一行指向第一个变量,第二行指向第二个变量,第三行指向第三个变量。因为第二个变量的类型是value,所以我们可以直接在第二行检索它的值3。
对于变量类型字符串,第一行包含的数据是关于第一个字符串的信息。在本例中,十六进制数据为60,十进制数据为96。但这意味着什么呢?这意味着第一个字符串的信息是在从数据开始的96个字节之后找到的。
在92字节之后,32字节的块有一个数字:5。这是字符串所占用的字节数,从下一行开始,以utf-8编码:4a6fc3a36f。从十六进制转换为 UTF-8,我们检索到单词“João”。
按照相同的模式,可以检索a0字节之后的第三个字符串,也就是从数据开始的160字节之后的字符串。它说它也有5个字节,它的值是5061756c6f, 是 'Paulo' 的 UTF-8 编码。
现在,我们已经看到了如何手动完成此操作,现在看看如何通过solidity来完成此操作。使用我们在合约中写的函数decode(bytes memory data),可以检索编码后的信息:
还可以使用其他库对变量进行编码和解码,比如web3.eth.abi。目前也有一个在线网站可以用于此,abi.hashex.org/。
Source:https://medium.com/coinmonks/abi-encode-and-decode-using-solidity-2d372a03e110
关于
ChinaDeFi - ChinaDeFi.com 是一个研究驱动的DeFi创新组织,同时我们也是区块链开发团队。每天从全球超过500个优质信息源的近900篇内容中,寻找思考更具深度、梳理更为系统的内容,以最快的速度同步到中国市场提供决策辅助材料。
Layer 2道友 - 欢迎对Layer 2感兴趣的区块链技术爱好者、研究分析人与Gavin(微信: chinadefi)联系,共同探讨Layer 2带来的落地机遇。敬请关注我们的微信公众号 “去中心化金融社区”。
1.资讯内容不构成投资建议,投资者应独立决策并自行承担风险
2.本文版权归属原作所有,仅代表作者本人观点,不代表本站的观点或立场
您可能感兴趣
-
Bitget: 将在 24 小时内给到事件经过及处理结果
深潮 TechFlow 消息,4 月 20 日,Bitget 华语负责人谢家印在 X 平台发文表示:“每一个平台在每一个发展阶段,或许都会遇到挑战与不确定,然而这些都是不可回避的一部分我始终相信,穿越
-
某波段巨鲸清仓此前买入的10293.78枚ETH,本轮获利32.3万美元
PANews 4月20日消息,据@ai_9684xtpa 监测,某波段巨鲸已清仓此前买入的 10293.78 枚 ETH,平均建仓价格 1582.55 美元,卖出价格 1613.84 美元,本轮共获利
-
Bitget回应VOXEL/USDT合约交易对异常交易行为:交易、充提等功能一切正常,部分用户可能被风控
PANews 4月20日消息,Bitget 华语负责人谢家印在 X 平台发文表示:我们已留意到 VOXEL/USDT 合约交易对的异常交易行为,目前正在调查中。我们将尽快同步更具体的情况。部分用户可能
-
Bitget平台VOXEL/USDT合约交易对疑似异常,24小时交易量已超BTC
PANews 4月20日消息,据 Coinglass 数据,Bitget 平台 VOXEL/USDT 合约交易对 24 小时交易量已超 BTC,达 127.19 亿美元,BTC 为 43.01 亿美元
-
欧洲央行报告:数字欧元将部分取代纸币和银行存款
深潮 TechFlow 消息,4 月 20 日,据 Bitcoin.com 报道,欧洲央行(ECB)最新报告显示,尽管数字欧元项目尚未获得最终批准,但该央行数字货币(CBDC)一旦推出,将显著改变欧洲
-
我与嗯哼的故事:加密萧炎的斗破之路
作者:Ru7 @SသN一、初遇嗯哼 第一次见到嗯哼是在香港,2023年的冬天,那时候我刚刚接触币圈。嗯哼来香港玩,我们第一次线下见面。彼时的他还很消瘦,穿着一件巴宝莉当季衬衫,脚踩一双Yeezy球鞋,
-
空投周报 | 币安将于4月21日向符合条件用户空投EPT代币;Walrus将向SUI生态游戏掌机持有者空投(4.14-4.20)
原创 | Odaily星球日报(@OdailyChina)作者|Golem(@web3_golem)Odaily星球日报盘点了 2025 年 4 月 14 日至 2025 年 4 月 20 日期间的空
-
探究创新周期的演变:超额回报为何常被二次开发者收割?
原文标题:When Innovation Compounds:The Second-Order Effects of Crypto Primitives 原文作者:Saurabh Deshpande
- 成交量排行
- 币种热搜榜

