面向开发人员的 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.本文版权归属原作所有,仅代表作者本人观点,不代表本站的观点或立场
您可能感兴趣
-
行情不稳?这 7 个高 APY 稳定币池子或成避风港
牛市已至,所有收益机制都在牛市情绪拉动下放大利差,稳定币存取借贷也能带来「稳稳的幸福」。BlockBeats 整理了七个主流稳定币为主的「高 APR 池」,APY 均在 10% 以上,接下来一一介绍:
-
发一个稳定币要多少钱?
这不是一个轻装上阵的创业机会。撰文:律动从华尔街的投行,到湾区的科技公司,再到亚洲的金融巨头与支付平台,越来越多企业盯上了同一门生意——稳定币发行。规模效应下,稳定币发行商的边际发行成本为零,在他们眼
-
加密早报:白宫将惩罚歧视加密公司的银行,Bullish 向美国证交会提交 IPO 申请
SharpLink Gaming增持18,680枚以太坊,总持有498,884枚。作者:深潮 TechFlow昨日市场动态WSJ:白宫准备发布行政令,惩罚对加密公司和保守派人士存在歧视的银行据华尔街日
-
聚焦中文加密市场:速览 Web3 KOL 与 Agency 市场营销生态
作者:Shirley @IOSG中国市场机会:中国有超过 9 亿人使用互联网。其中 98% 是移动互联网用户。根据《数字社会指数》(该指数衡量社会数字化发展水平),中国在 24 个受调查国家中,关于对
-
加密从业者,可能构成职务侵占罪吗?
从币安、欧意等一些大所的动作来看,未来对于内部腐败的打击力度只会越来越大。撰文:刘正要引言最近遇到了两个有关加密行业从业者可能涉嫌职务侵占犯罪的咨询,所以有必要针对这个问题专门写一篇小文进行分析,以期
-
Michael Saylor:比特币策略如何做到不被清算?
自 2020 年启动比特币储备策略以来,Michael Saylor 始终致力于维持健康的资产负债表。撰文:Steven Ehrlich编译:Saoirse,Foresight NewsStrateg
-
柬埔寨汇旺,加密黑产的 「超级枢纽」
美国财政部称,这家柬埔寨集团为包括朝鲜黑客和跨国犯罪集团在内的客户洗钱超过 40 亿美元。撰文:Kai Schultz,彭博社编译:Luffy,Foresight News新广告提示音接踵而至。想要假
-
ChainOpera 的 Agent 赌局:当 AI 真的学会「开会」了
真正的问题是:TradingAgents 证明了多智能体的技术可行性,谁能率先实现商业可行性?撰文:Ningning2024 年 12 月,UCLA 和 MIT 的一篇论文让整个 AI Agent 圈
- 成交量排行
- 币种热搜榜

