文章目录

    • 一、ABI 基础概念
      • 1. ABI 与 API 的区别
      • 2. ABI 的核心作用
    • 二、ABI 接口描述
      • 1. 编译后的产物
      • 2. ABI JSON 格式示例
      • 3. ABI JSON 关键字段说明
    • 三、ABI 编码
      • 1. 编码示例
      • 2. 编码数据的组成
      • 3. Solidity 中的编码函数
    • 四、ABI 解码
      • 1. 解码的基本概念
      • 2. 事件日志的解码
    • 五、ABI 编解码可视化工具

一、ABI 基础概念

1. ABI 与 API 的区别

  • API(应用程序接口):是两个软件之间进行通信的桥梁,用于访问某个服务。
  • ABI(应用二进制接口):定义了智能合约中可交互的方法、事件和错误,是与 EVM(以太坊虚拟机)交互的桥梁。

2. ABI 的核心作用

EVM 只能识别和运行由 0 和 1 组成的二进制数据,因此在调用函数时,需要借助 ABI 将人类可读的函数转化为 EVM 可读的字节码。从本质上说,ABI 是编码和解码规范,用于规范外部与 EVM 的交互,也可用于合约间的交互。

二、ABI 接口描述

1. 编译后的产物

在 Solidity 中编译代码后,会得到两个重要的 artifact(产物):

  • bytecode(字节码):合约部署到区块链上的实际代码。
  • ABI 接口描述:是 JSON 格式的文件,定义了智能合约中外部可交互的方法、事件和可解释的错误。

2. ABI JSON 格式示例

以 Counter 合约为例,其编译后生成的 ABI 是一个 JSON 格式的数组,每个对象定义了合约中可公开调用的方法(函数)、声明的事件及错误等。以下是 Counter 合约及其对应的 ABI 示例:

contract Counter {uint public counter;address private owner;   error NotOwner();   event Set(uint _value);  constructor() {owner = msg.sender;}   function set(uint x) public {       if(owner != msg.sender)  revert NotOwner();       counter = x;emit Set(x);   }
}

对应的 ABI 如下:

[{"inputs": [],         "name": "NotOwner",         "type": "error"},{"anonymous": false,         "inputs": [{                 "indexed": false,                 "internalType": "uint256",                 "name": "_value",                 "type": "uint256"}],"name": "Set",         "type": "event"},{"inputs": [],         "name": "counter",         "outputs": [{                 "internalType": "uint256",                 "name": "",                 "type": "uint256"}],         "stateMutability": "view",         "type": "function"},{"inputs": [{                 "internalType": "uint256",                 "name": "x",                 "type": "uint256"}],"name": "set",         "outputs": [],         "stateMutability": "nonpayable",         "type": "function"}
]

3. ABI JSON 关键字段说明

  • type:定义是函数、事件或错误等。
  • name:表示函数名称、事件名称、自定义错误名称。
  • inputs:函数输入参数。
  • outputs:函数输出参数。

三、ABI 编码

1. 编码示例

以调用部署在 sepolia 网络上的 Counter 合约的 set() 函数,并传入参数 10 为例,经过 ABI 编码后提交到链上的数据是 0x60fe47b1000000000000000000000000000000000000000000000000000000000000000a

2. 编码数据的组成

该编码数据包含两个部分:

  • 函数选择器(前 4 个字节)0x60fe47b1,它是 ABI 描述中函数的签名 set(uint256) 进行 keccak256 哈希运算后取前 4 个字节,即 bytes4(keccak256("set(uint256)")) == 0x60fe47b1
  • 参数编码:参数 10 的十六进制是 a,然后扩展到 32 个字节。

3. Solidity 中的编码函数

Solidity 中有 5 个用于编码的函数:

  • abi.encode:按 EVM 标准规则对参数编码,每个参数按 32 个字节填充 0 后再拼在一起,用于与合约交互时编码参数。
  • abi.encodePacked:紧密编码,参数编码拼接时不填充 0,使用实际占用空间拼接,若结果不是 32 字节整数倍数,在末尾填充 0,例如在使用 EIP712 时需要用到。
  • abi.encodeWithSignature:对函数签名及参数进行编码,第一个参数是函数签名,后面按 EVM 标准规则对参数编码,可直接获得调用函数所需的 ABI 编码数据。
  • abi.encodeWithSelector:与 abi.encodeWithSignature 功能类似,第一个参数为 4 个字节的函数选择器。
  • abi.encodeCall:通过函数指针对函数及参数编码,执行编码时进行完整的类型检查,确保类型匹配函数签名。

四、ABI 解码

1. 解码的基本概念

解码是编码的“逆过程”。区块链浏览器能将提交给链上的 0x60fe47b10000000...0a 显示为函数 set(uint256 x),就是对数据进行了解码。需要注意的是,仅能对参数进行解码,函数选择器因使用了 keccak256 哈希运算(哈希不可逆)无法直接解码,但开源合约代码后,区块链浏览器可计算出所有函数的函数选择器,从而通过函数选择器匹配对应的函数签名。

2. 事件日志的解码

ABI 解码的一个重要场景是解析交易中的事件日志。日志包含 Topics 和 Data 两部分,其中 Topics 的第一个主题是事件签名的 Keccak256 哈希。通过匹配该哈希值,可知道 EVM 产生的日志由哪个事件生成,进而根据事件的参数列表解析日志数据。Solidity、web3.js、ethers.js 库都提供了解码函数。

五、ABI 编解码可视化工具

ChainToolDAO 开发了几个可视化工具,可帮助进行编解码:

  • 函数选择器的查询及反查:https://chaintool.tech/querySelector
  • 事件签名的 Topic 查询:https://chaintool.tech/topicID
  • Hash 工具(提供 Keccak-256 及 Base64):https://chaintool.tech/hashTool
  • 交易数据(calldata)的编码与解码:https://chaintool.tech/calldata

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/86660.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/86660.shtml
英文地址,请注明出处:http://en.pswp.cn/web/86660.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

星际争霸数据集指南

星际争霸作为检验AI效果的一个重要“模式生物”, 是验证AI技术的重要平台‌,尤其在 深度学习 和 强化学习领域。该游戏因其复杂的游戏机制和实时决策要求,为AI研究提供了丰富的测试环境和挑战。 本博文是记录自己曾经研究星际争霸AI时对于数据部分的一点…

VUE组件与组件之间的传参

每次启动vue2项目的时候在 vue.config.js中配置: const { defineConfig } require(vue/cli-service) module.exports defineConfig({transpileDependencies: true,//关闭语法严格检验lintOnSave:false})1:在 src 下 创建 utils 文件夹 然后创建 Bas…

8年java开发从零学习人工智能(深度学习)--pp飞桨(百度自研开源框架)

1.明确概念:人工智能>机器学习>深度学习,三者的关系是包含关系,如图所示: 人工智能(AI),很宽泛的概念,是研发用于模拟,延展和扩展人的智能的理论,方法&…

ci | cd

ci | cd 相当于开发人员和运维人员共同完成的东西 ci:Jenkins cd:k8s ci : 持续集成 开发人员写出的代码提交到共享仓库 比如说Git 自动触发代码检查 测试 好处: 很快的发现bug 代码不用堆积 cd: 持续交付:代码测试没问题后 自动打包…

深入理解C#委托操作:添加、移除与调用全解析

关键词:委托不可变性 多播委托 调用列表管理 ⚙️ 一、委托的核心特性:不可变性 看似“添加”,实为新建 使用 为委托“添加”方法时(如 delVar SCl.m3;): 系统创建全新委托对象新委托的调用列表 原…

Spring Cloud:微服务架构的基石与实践指南

一、Spring Cloud 核心组件 (一)Spring Cloud Netflix Spring Cloud Netflix 是 Spring Cloud 的核心模块之一,它集成了 Netflix 的多个开源组件,提供了微服务架构中常见的功能,如服务注册与发现、配置中心、API 网关…

【VPX3U】国产嵌入式平台:RK3588J×JH930硬件架构与红外应用方案

随着对边缘计算与多媒体处理需求的提升,国产异构平台成为关键发展方向。最近有一个项目需求,提出了一款基于瑞芯微 RK3588J 处理器与景嘉微GPU 的 VPX3U 规格嵌入式主板的设计想法旨在融合高性能异构计算与丰富的视频、网络和存储接口,适用于…

秩序密码-用群论分析魔方的阶

三阶魔方的物理基础是由一个三维十字轴连接的 6 个中心块,这 6 个中心块决定了魔方的 6 种颜色朝向,构成不动的坐标系统,此外还有两类活动块,分别是8个角块,12个棱块。 魔方的每一层转动(如 R: 右层顺时针…

Python驱动自动驾驶的“多眼”——打造高效传感器融合框架的实战思考

Python驱动自动驾驶的“多眼”——打造高效传感器融合框架的实战思考 最近,自动驾驶行业火得不行,背后支撑它的技术,远不止车载摄像头那么简单。真正让车“看懂”世界的,是多种传感器数据的“融合”,包括雷达、激光雷达(LiDAR)、摄像头、惯性测量单元(IMU)等等。 而如…

机器学习-- 聚类

什么是聚类? Clustering 可以简单地说,对有标注的数据分类,就是逻辑回归(属于有监督分类),对无标注的数据分类,就是聚类(属于无监督分类) 聚类是一种无监督学习技术&am…

【Yonghong 企业日常问题08 】永洪BI的Apache Tomcat版本升级指南

文章目录 前言操作步骤登录验证 前言 某公司业务永洪BI系统使用tomcat 9.0.97版本,接到总公司漏洞扫描整改要求需要将tomcat版本升级到9.0.97以上。 目标:tomcat 9.0.97》 9.0.98 1、下载tomcat所需要的版本 地址:https://tomcat.apache.org/download-…

BigFoot RaidSlackCheck11.109.zip lua

BigFoot RaidSlackCheck11.109.zip lua 合剂buff检查插件 把lua脚本拷贝到游戏插件目录下: D:\Battle.net\World of Warcraft\_classic_\Interface\AddOns 命令 /rsc 下载地址: https://download.csdn.net/download/spencer_tseng/91181827

深入解析前端 Meta 标签:HTML 的隐形守护者与功能大师

在构建现代网页时&#xff0c;我们常常关注炫目的视觉效果、复杂的交互逻辑或强大的框架&#xff0c;却容易忽略那些深藏于 <head> 之中、看似不起眼的 <meta> 标签。这些标签如同网页的隐形守护者&#xff0c;无声地承担着定义文档元数据、指导浏览器行为、优化搜…

青少年编程与数学 01-012 通用应用软件简介 11 应用商店

青少年编程与数学 01-012 通用应用软件简介 11 应用商店 一、什么是应用商店&#xff08;一&#xff09;应用商店的基本定义&#xff08;二&#xff09;应用商店的工作原理&#xff08;三&#xff09;应用商店的类型 二、应用商店的重要意义&#xff08;一&#xff09;为用户提…

《红黑树实现》

引言&#xff1a; 上次我们学习了比二叉搜索树更高效的平衡二叉搜索树&#xff08;AVL树&#xff09;&#xff0c;这次我们要学习的是另外一种对二叉搜索树的优化后的红黑树。 一&#xff1a;红黑树概念&#xff1a; 红黑树是一棵二叉搜索树&#xff0c;他的每个结点增加一个…

领域驱动设计(DDD)【23】之泛化:从概念到实践

文章目录 一 泛化基础&#xff1a;理解DDD中的核心抽象机制1.1 什么是泛化&#xff1f;1.2 为什么泛化在DDD中重要&#xff1f;1.3 泛化与特化的双向关系 二 DDD中泛化的实现形式2.0 实现形式概览2.1 类继承&#xff1a;最直接的泛化实现2.2 接口实现&#xff1a;更灵活的泛化方…

机箱流动空气热学仿真方案

机箱流动空气热学仿真方案(二维平面与三维) 一、物理模型与数学模型 1. 控制方程 流动与传热基本方程: 连续性方程:∇(ρu) = 0动量方程(Navier-Stokes):ρ(u∇)u = -∇p + μ∇u + F能量方程:ρcₚ(u∇)T = k∇T + Φ边界条件: 入口:速度入口(u=u₀, T=T₀)出口:压…

electron 如何配置 打开控制台

在 Electron 应用中&#xff0c;打开开发者工具&#xff08;即控制台&#xff09;通常有两种方式&#xff1a; 程序运行时手动打开 在 Electron 应用中&#xff0c;你可以通过编程方式打开开发者工具。这通常在你需要调试时非常有用。你可以在你的主进程&#xff08;通常是 ma…

MR7350用TTL刷机救砖过程

很久之前就买了一台Linksys的MR7350路由器&#xff0c;准备有OpenWRT的官方固件之后再拿它当轻NAS用&#xff0c;最近看到出了Snapshot版&#xff0c;于是就拿来刷机试试。经过我坚持不懈的折腾&#xff0c;终于把我的MR7350路由器刷成了砖&#xff0c;即便是通过开机过程中断电…

在NPU单算子(torch_npu )执行时如何进行性能优化?以MinerU为例

1 MinerU介绍 在AI技术快速发展的今天&#xff0c;大量非结构化数据的处理成为亟待解决的问题。尤其是PDF文档&#xff0c;作为最常见的文件格式之一&#xff0c;如何高效准确地提取其中的信息&#xff0c;成为了许多企业和研究机构的痛点。上海人工智能实验室&#xff08;上海…