聊聊以太坊智能合约ABI
智能 聊聊 合约 以太 abi
2023-06-13 09:17:12 时间
聊聊以太坊智能合约ABI
ABI的全称是 Application Binary Interface
,所以它是一个接口。或者说是一个标准。这个标准描述了在以太坊生态中如何跟合约进行交互,这个交互包含外部客户端调用合约的接口,也包括合约之间的交互。
ABI假设所有的编码都是在编译阶段确定的,也就是静态的。而不是运行时动态生成的。
我们知道智能合约的本质也是程序,程序之间交互要用二进制码(binary code),ABI就是这样一个标准规定合约的代码如何进行编码和解码。
ABI的标准规范的内容包括合约的函数列表、函数名称、参数名称、参数类型、返回类型等。这些信息以JSON格式保存。这些JSON是可读的。
比如一个智能合约
// SPDX-License-Identifier: GPL-3.0
pragma solidity ^0.8.4;
contract Test {
constructor() { b = hex"12345678901234567890123456789012"; }
event Event(uint indexed a, bytes32 b);
event Event2(uint indexed a, bytes32 b);
error InsufficientBalance(uint256 available, uint256 required);
function foo(uint a) public { emit Event(a, b); }
bytes32 b;
}
它的JSON如下:
[{
"type":"error",
"inputs": [{"name":"available","type":"uint256"},{"name":"required","type":"uint256"}],
"name":"InsufficientBalance"
}, {
"type":"event",
"inputs": [{"name":"a","type":"uint256","indexed":true},{"name":"b","type":"bytes32","indexed":false}],
"name":"Event"
}, {
"type":"event",
"inputs": [{"name":"a","type":"uint256","indexed":true},{"name":"b","type":"bytes32","indexed":false}],
"name":"Event2"
}, {
"type":"function",
"inputs": [{"name":"a","type":"uint256"}],
"name":"foo",
"outputs": []
}]
我们看到的是一个json数组,数组的第一个元素是一个名为InsufficientBalance
,类型是error的接口,同时还指明了它的入参。
其它元素也是类似,就不展开说了。
我们也可以在remix编译的时候看到ABI信息。
接下来看看具体的编码规则。
还是拿一个具体的合约举例子,
// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.4.16 <0.9.0;
contract Foo {
function bar(bytes3[2] memory) public pure {}
function baz(uint32 x, bool y) public pure returns (bool r) { r = x > 32 || y; }
function sam(bytes memory, bool, uint[] memory) public pure {}
}
比如我要调用bar
这个方法,传入的参数是69和true,它会被编码为
0xcdcd77c000000000000000000000000000000000000000000000000000000000000000450000000000000000000000000000000000000000000000000000000000000001
首先这个0xcdcd77c0
,是函数的id,它占据了编码的前四个字节,它其实是下面这个函数签名的Keccak hash
的前四个字节。
baz(uint32,bool)
0x0000000000000000000000000000000000000000000000000000000000000045
是入参69的十六进制数并且补齐到32字节。(ABI的编码会对所有的数据编码强制32字节对齐)
0x0000000000000000000000000000000000000000000000000000000000000001
是入参true(true就是1)补齐32字节的结果。
参考:
- https://docs.soliditylang.org/en/develop/abi-spec.html#abi
相关文章
- AGI智能新时代,技术驱动营销数字化重组|数说故事D3峰会盛况
- AI视频智能分析平台EasyCVR设备录像功能细节优化
- 原创 | QAV:基于大语言模型的智能体协作的基本原理及应用前景展望
- Solidity 智能合约开发 - 玩转 Web3.py
- 卖爆了!小米智能风扇家族年销破百万
- 苹果算法突然改变,科研人员很难再在研究中使用 Apple Watch 智能手表
- Linux 基金会将托管 Accord 项目,为智能法律合约开发开源框架
- 什么是智能结算台,人工智能创造的新技术!
- 电信的博览会:智能硬件黑科技&电信开始支持移动联通234G
- CMySQL 强劲联手,释放智能能量(c mysql 发布)
- MySQL 1022新功能智能优化更追求完美(1022mysql)