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

在 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.dtcms.com/a/287632.html

相关文章:

  • day11 ADC
  • [spring6: AspectMetadata AspectInstanceFactory]-源码解析
  • 【Unity】YooAsset问题记录
  • 深度学习-线性神经网络
  • 剧本杀小程序开发:科技赋能,重塑推理娱乐新形态
  • 大模型军备竞赛升级!Grok 4 携 “多智能体内生化” 破局,重构 AI 算力与 Agent 2.0 时代
  • 1 渗透基础
  • FOC算法六步算法 以及 Vds保护是什么
  • 石子问题(区间dp)
  • 【c++】提升用户体验:问答系统的交互优化实践——关于我用AI编写了一个聊天机器人……(12)
  • QCC系列显示交互层的自研技术突破与实践
  • 论文reading学习记录4 - weekly - 视觉端到端开创-LOAM
  • 6 STM32单片机的智能家居安防系统设计(STM32代码+手机APP设计+PCB设计+Proteus仿真)
  • VRRP-虚拟路由冗余协议
  • leetcode3_435 and 605
  • 在服务器(ECS)部署 MySQL 操作流程
  • C++控制台贪吃蛇开发:从0到1绘制游戏世界
  • Linux --进程信号
  • 2025年燃气从业人员证考试题库及答案
  • Linux——文件压缩和解压
  • 结合python面向对象编程,阐述面向对象三大特征
  • volka 可理解性输入:做家务
  • 学习C++、QT---29(QT库中QT事件的介绍和用了几个案例来对事件怎么使用的讲解)
  • lvs原理及实战部署
  • Linux内核设计与实现 - 第5章 系统调用
  • CS231n-2017 Lecture3线性分类器笔记
  • 什么是 Git 的钩子 Hooks?包括哪些内容?
  • picoCTF 2024: [[NoSQL]] Injection - Writeup
  • K8s与Helm实战:从入门到精通
  • 【杂谈】硬件工程师怎么用好AI工具做失效分析