面向开发人员的 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.本文版权归属原作所有,仅代表作者本人观点,不代表本站的观点或立场
您可能感兴趣
-
BiyaPay 战略升级:构建融合型数字金融平台,重塑全球资产管理与流动新体验
这一战略升级标志着BiyaPay从单纯的交易工具向综合性金融服务平台的深刻转型。BiyaPay今日宣布进行战略升级,推出下一阶段的战略蓝图,致力于构建一个无缝连接传统金融与数字资产生态的数字金融平台。
-
Interlace 亮相 FinTech Week 2025:资金敏捷成企业金融新竞争力
作为香港迈向全球金融科技枢纽的重要窗口,FinTech Week 已成为政策制定者、企业与创新者对话的核心平台。11月3日-7日,2025年香港金融科技周(Hong Kong FinTech Week
-
CZ 详谈 Memecoin 热潮、Hyperliquid 以及对创业者的建议原文编译 | 深潮 TechFlow要点总结 在这场 Michael Jerome 进行的访谈中,Binance 创始人 CZ(赵长鹏)分享了他卸任后的生活历程、入狱期间的反思、对财富与人生目标的全新
-
为什么美国政府开门比特币才能涨?美国政府停摆正式进入创纪录的第 36 天。过去两天,全球金融市场跳水。纳斯达克、比特币、科技股、日经指数、甚至连避险资产美债和黄金也未能幸免。市场的恐慌情绪在蔓延,而华盛顿的政客们却还在为预算争吵不休
-
为何当前加密市场的操作难度是地狱级的?
超过 90% 的加密资产本质都是投机驱动,但纯粹的投机并非永动机。撰文:@0xkyle编译:AididiaoJP,Foresight News作为一名交易员,核心目标始终是寻找高确信度、具备不对称回报
-
水产公司 Nocera 获得最高 3 亿美元私募融资,用于支持数位资产战略与策略收购2025 年 11 月 3 日周一,Nocera, Inc.(纳斯达克股票代码:NCRA)宣布与一家美国机构投资者达成证券购买协议,进行最高 3 亿美元的高级担保可转换票据私募融资。 资料来源:htt
-
水产公司 Nocera 获 3 亿美元私募融资,用于支持数位资产战略与策略收购
根据融资协议,每次交割的净收益将被分配至美元挂钩的数位资产(如稳定币),由美国机构托管人持有。Nocera, Inc.(纳斯达克股票代码:NCRA)宣布与一家美国机构投资者达成证券购买协议,进行最高
-
Bitwise:比特币正经历其 IPO 时刻 横盘乃至下跌或是“礼物”原文作者:Matt Hougan,Bitwise首席投资官;原文编译:比特币的横盘整理表明其IPO时刻已然来临——这也是BTC配置比例有望提高的原因所在。 霍尔迪·维瑟(Jordi Visse
- 成交量排行
- 币种热搜榜
Momentum
OFFICIAL TRUMP
Aster
泰达币
以太坊
比特币
Solana
USD Coin
瑞波币
币安币
First Digital USD
狗狗币
大零币
达世币
Sui
ZEN
ICP
OKB
FIL
AR
LPT
MINA
BSV
EOS
DYDX