当前位置: 首页 > ops >正文

在 Solidity 中,abi是啥

在 Solidity 中,abi 既指「应用二进制接口(Application Binary Interface)」这一整套规范,也指语言里的全局单例变量 abi,它提供了一组编解码函数,让合约与外界(EOA、其他合约、前端库)能够相互“说同一种语言”。


✅ 一句话记住

abi = 合约的 JSON 描述 + 全局编解码工具箱
没有它,外部世界无法知道你的函数长什么样、参数如何排列。


📌 两个层面理解

层面说明例子
规范层定义函数选择器、参数编码、事件日志格式ERC-20 Transfer 事件日志就是按 ABI 规范编码
语言层Solidity 提供的 abi.encode* 系列工具函数abi.encodeWithSignature("transfer(address,uint256)", to, amt)

🔧 常用 abi.* 工具函数速查

函数用途返回类型
abi.encode(...)按 ABI 规范编码参数bytes memory
abi.encodePacked(...)紧凑打包(不按 ABI 规范,节省空间)bytes memory
abi.encodeWithSelector(bytes4 selector, ...)编码参数并前置选择器bytes memory
abi.encodeWithSignature(string sig, ...)同上,但直接用字符串签名bytes memory
abi.decode(bytes memory, (types...))解码已编码数据返回对应类型的元组
type(C).creationCode / runtimeCode读取合约字节码bytes memory
type(C).interfaceId计算 ERC-165 bytes4 接口 IDbytes4

✅ 代码示例

1. 计算函数选择器
bytes4 sel = bytes4(keccak256("transfer(address,uint256)"));
// 等价于
bytes4 sel2 = IERC20.transfer.selector;
2. 编码外部调用
address to = 0xAbC...;
uint256 amount = 100 * 10**18;// 方法 A:encodeWithSignature
bytes memory data = abi.encodeWithSignature("transfer(address,uint256)",to,amount
);// 方法 B:encodeWithSelector
bytes4 sel = IERC20.transfer.selector;
data = abi.encodeWithSelector(sel, to, amount);
3. 解码返回值
bytes memory encoded = abi.encode(uint256(123), true);
(uint256 num, bool flag) = abi.decode(encoded, (uint256, bool));
4. 生成紧凑哈希(节省存储)
bytes32 hash = keccak256(abi.encodePacked(a, b, c));

🌉 与外部交互

场景ABI 作用
前端调用合约Ethers.js / Web3.js 需要合约的 ABI JSON 才能构造交易
合约间低层调用address(target).call(data) 需要 abi.encodeWithSelector
代理升级代理合约通过 abi.encodeWithSelector 转发调用到实现合约
事件监听ABI 中的 anonymous 字段决定事件日志格式

✅ 一句话总结

对外:ABI 是合约的「API 说明书」;
对内:Solidity 的 abi.* 工具箱让你编码、解码、计算选择器一气呵成。

http://www.xdnf.cn/news/15769.html

相关文章:

  • 相角补偿全通滤波器设计:相位均衡(0~350Hz,15°超前)
  • Triton的核心概念与简单入门
  • 解锁C++性能密码:TCMalloc深度剖析
  • python类Keys
  • Letter Combination of a Phone Number
  • Eureka 和 Nacos
  • Ceph存储阈值调整:优化nearfull_ratio参数
  • Vue组件化开发小案例
  • 关于如何同步开发板的时间和现在一样:
  • 地图定位与导航
  • Verilog *2* SPI-立创逻辑派G1测试-1
  • 数据结构:字符串(Strings)
  • IIS部署 .net项目
  • 面试150 课程表Ⅱ
  • Redisson RLocalCachedMap 核心参数详解
  • 从“数字土著”到“数据公民”:K-12数据伦理课程的设计、实施与成效追踪研究
  • Java 大视界 -- 基于 Java 的大数据实时流处理在智能制造生产过程质量实时监控与异常诊断中的应用(352)
  • Gitee 提交信息的规范
  • lvs笔记
  • 教育科技内容平台的用户定位与产品方案:从需求到解决方案的精准匹配
  • Keepalived 监听服务切换与运维指南
  • 基于LSTM的时间序列到时间序列的回归模拟
  • AspectJ 表达式中常见符号说明
  • Baumer工业相机堡盟工业相机如何通过YoloV8深度学习模型实现动物分类(C#源码,UI界面版)
  • 张 关于大语言模型(LLM)置信度研究的经典与前沿论文 :温度缩放;语义熵;自一致性;事实与反思;检索增强;黑盒引导;
  • 微服务学习(六)之分布式事务
  • 商业秘密的法律属性与保护路径探析
  • LeetCode 322. 零钱兑换 LeetCode 279.完全平方数 LeetCode 139.单词拆分 多重背包基础 56. 携带矿石资源
  • 【Docker基础】深入解析Docker-compose核心配置:Services服务配置详解
  • 【学习记录】智能客服小桃(进度更新ing)