应用二进制接口(ABI) 说明——Solidity中文文档(7)

ABI:应用程序二进制接口是什么? 参考与转载: 【软件开发底层知识修炼】二十一 ABI-应用程序二进制接口一 ABI (应用程序二进制接口) 什么是应用程序二进制接口(ABI)? 文章目录1.ABI的通俗理解与定义1.1 通俗理解(与API的比较):1.2 定义:2.ABI示例2.1 系统调用规范2.2 ABI定义基础数据类型2.33 ABI与移植性4 总结 1.ABI的通俗理解与定义 1.1 通俗理解(与API的比较): 理解“ABI”的一种简单方法是将其与“API”进行比较。 您已经熟悉API的概念。如果您想使用某些库或操作系统的功 阅读详情

image

写在前面:HiBlock区块链社区成立了翻译小组,翻译区块链相关的技术文档及资料,本文为Solidity文档翻译的第七部分《应用二进制接口(ABI) 说明》,特发布出来邀请solidity爱好者、开发者做公开的审校,您可以添加微信baobaotalk_com,验证输入“solidity”,然后将您的意见和建议发送给我们,也可以在文末“留言”区留言,有效的建议我们会采纳及合并进下一版本,同时将送一份小礼物给您以示感谢。

1

基本设计

在 以太坊Ethereum 生态系统中, 应用二进制接口Application Binary Interface(ABI) 是从区块链外部与合约进行交互以及合约与合约间进行交互的一种标准方式。 数据会根据其类型按照这份手册中说明的方法进行编码。这种编码并不是可以自描述的,而是需要一种特定的概要(schema)来进行解码。

我们假定合约函数的接口都是强类型的,且在编译时是可知的和静态的;不提供自我检查机制。我们假定在编译时,所有合约要调用的其他合约接口定义都是可用的。

这份手册并不针对那些动态合约接口或者仅在运行时才可获知的合约接口。如果这种场景变得很重要,你可以使用 以太坊Ethereum 生态系统中其他更合适的基础设施来处理它们。

2

函数选择器

一个函数调用数据的前 4 字节,指定了要调用的函数。这就是某个函数签名的 Keccak(SHA-3)哈希的前 4 字节(高位在左的大端序)(译注:这里的“高位在左的大端序“,指最高位字节存储在最低位地址上的一种串行化编码方式,即高位字节在左)。 这种签名被定义为基础原型的规范表达,基础原型即是函数名称加上由括号括起来的参数类型列表,参数类型间由一个逗号分隔开,且没有空格。

3

参数编码

从第5字节开始是被编码的参数。这种编码也被用在其他地方,比如,返回值和事件的参数也会被用同样的方式进行编码,而用来指定函数的4个字节则不需要再进行编码。

4

类 型

以下是基础类型:

  • uint:M 位的无符号整数,0 < M <= 256、M % 8 == 0。例如:uint32,uint8,uint256。

  • int:以 2 的补码作为符号的 M 位整数,0 < M <= 256、M % 8 == 0。

  • address:除了字面上的意思和语言类型的区别以外,等价于 uint160。在计算和 函数选择器Function Selector中,通常使用 address。

  • uint、int:uint256、int256 各自的同义词。在计算和 函数选择器Function Selector中,通常使用 uint256 和 int256。

  • bool:等价于 uint8,取值限定为 0 或 1 。在计算和 函数选择器Function Selector中,通常使用 bool。

  • fixedx:M 位的有符号的固定小数位的十进制数字 8 <= M <= 256、M % 8 ==0、且 0 < N <= 80。其值 v 即是 v / (10 ** N)。(也就是说,这种类型是由 M 位的二进制数据所保存的,有 N 位小数的十进制数值。译者注。)

  • ufixedx:无符号的 fixedx。

  • fixed、ufixed:fixed128x19、ufixed128x19 各自的同义词。在计算和 函数选择器Function Selector中,通常使用 fixed128x19 和 ufixed128x19。

  • bytes:M 字节的二进制类型,0 < M <= 32。

  • function:一个地址(20 字节)之后紧跟一个 函数选择器Function Selector(4 字节)。编码之后等价于 bytes24。

以下是定长数组类型:

  • [M]:有 M 个元素的定长数组,M > 0,数组元素为给定类型。

以下是非定长类型:

  • bytes:动态大小的字节序列。

  • string:动态大小的 unicode 字符串,通常呈现为 UTF-8 编码。

  • []:元素为给定类型的变长数组。

可以将有限的若干类型放到一对括号中,用逗号分隔开,以此来构成一个 元组tuple:

  • (T1,T2,…,Tn):由 T1,…,Tn,n >= 0 构成的 元组tuple。

用 元组tuple 构成 元组tuple、用 元组tuple 构成数组等等也是可能的。

image

5

编码的形式化说明

我们现在来正式讲述编码,它具有如下属性,如果参数是嵌套的数组,这些属性非常有用:

属性:

  • 1、读取的次数取决于参数数组结构中的最大深度;也就是说,要取得 a_i[k][l][r] 需要读取 4 次。在先前的ABI版本中,在最糟的情况下,读取的次数会随着动态参数的总数而线性地增长。

  • 2、一个变量或数组元素的数据,不会被插入其他的数据,并且是可以再定位的;也就是说,它们只会使用相对的“地址”。

我们需要区分静态和动态类型。静态类型会被直接编码,动态类型则会在当前数据块之后单独分配的位置被编码。

定义: 以下类型被称为“动态”:

  • bytes

  • string

  • 任意类型 T 的变长数组 T[]

  • 任意动态类型 T 的定长数组 T[k] (k > 0)

  • Ti (1 <= i <= k)为任意动态类型的元组tuple (T1,…,Tk)

所有其他类型都被称为“静态”。

定义: len(a) 是一个二进制字符串 a 的字节长度。len(a) 的类型被呈现为 uint256。

我们把实际的编码 enc 定义为一个由ABI类型到二进制字符串的值的映射;因而,当且仅当 X 的类型是动态的,len(enc(X)) (即 X 经编码后的实际长度,译者注)才会依赖于 X 的值。

定义: 对任意ABI值 X,我们根据 X 的实际类型递归地定义 enc(X)。

  • (T1,…,Tk) 对于 k >= 0 且任意类型 T1 ,…, Tk

    enc(X) = head(X(1)) … head(X(k-1)) tail(X(0)) … tail(X(k-1))

    这里,X(i) 是 元组tuple 的第 i 个要素,并且 当 Ti 为静态类型时,head 和 tail 被定义为head(X(i)) = enc(X(i)) and tail(X(i)) = “” (空字符串)

    否则,比如 Ti 是动态类型时,它们被定义为head(X(i)) = enc(len(head(X(0)) … head(X(k-1)) tail(X(0)) … tail(X(i-1))))tail(X(i)) = enc(X(i))

    注意,在动态类型的情况下,由于 head 部分的长度仅取决于类型而非值,所以 head(X(i)) 是定义明确的。它的值是从 enc(X) 的开头算起的,tail(X(i)) 的起始位在 enc(X) 中的偏移量。

  • T[k] 对于任意 T 和 k:enc(X) = enc((X[0], …, X[k-1]))

    即是说,它就像是个由相同类型的 k 个元素组成的 元组tuple 那样被编码的。

  • T[] 当 X 有 k 个元素(k 被呈现为类型 uint256):enc(X) = enc(k) enc([X[1], …, X[k]])

    即是说,它就像是个由静态大小 k 的数组那样被编码的,且由元素的个数作为前缀。

  • 具有 k (呈现为类型 uint256)长度的 bytes:enc(X) = enc(k) pad_right(X),即是说,字节数被编码为 uint256,紧跟着实际的 X 的字节码序列,再在前边(左边)补上可以使 len(enc(X)) 成为 32 的倍数的最少数量的 0 值字节数据。

  • string:enc(X) = enc(enc_utf8(X)),即是说,X 被 utf-8 编码,且在后续编码中将这个值解释为 bytes类型。注意,在随后的编码中使用的长度是其 utf-8 编码的字符串的字节数,而不是其字符数。

  • uint:enc(X) 是在 X 的大端序编码的前边(左边)补充若干 0 值字节以使其长度成为 32 的倍数。

  • address:与 uint160 的情况相同。

  • int:enc(X) 是在 X 的大端序的 2 的补码编码的高位(左侧)添加若干字节数据以使其长度成为 32 的倍数;对于负数,添加值为 0xff (即 8 位全为 1,译者注)的字节数据,对于正数,添加 0 值(即 8 位全为 0,译者注)字节数据。

  • bool:与

浅谈:什么是ABI接口 ABI ABI(Application Binary Interface)是开发接口标准之一。 ABI描述了应用程序与OS(操作系统)之间的底层接口,允许编译好的目标代码在使用兼容ABI的系统中,无需改动就能运行。 举例 首先我们要知道,不同的操作系统上跑的应用程序是不一定兼容的。例如:在windows上运行的QQ,他可以在linux中安装吗?一般来说,在网上下载软件会有不同的版本,什么windo... 阅读详情

相关推荐

Python多行文本框

有几天没发博客了,因为最近有点忙,所以没时间。今天抽空发一篇,也很简单,就是Python多行文本框。 我们直接举一个例子,就是打开文本,然后读取内容: import sys from PyQt5.QtWidgets import QWidget,QPushButton,QLineEdit,QTextEdit,QApplication,QToolTip class Readtxt(QWidget)...

这是最完整的Python教程! 2915

文档信息抽取技术:从非结构化文本到结构化信息的旅程

文档信息抽取技术是一种将非结构化文本转化为结构化信息的技术。这种技术可以从各类文档中自动提取出如实体、关系和其他重要信息,并将它们转化为方便计算机进一步处理和分析的格式。

INTSIG的博客 981

uniCloud云存储进阶:七牛云扩展存储从开通、绑定域名到批量上传的完整实战

本文详细介绍了uniCloud云存储进阶实践,重点讲解如何通过七牛云扩展存储实现从开通、绑定域名到批量上传的完整流程。内容涵盖成本优势分析、域名备案方案、SSL证书配置、多文件并发上传控制等实战技巧,并提供可直接复用的代码示例,帮助开发者高效构建内容社区类应用。

weixin_26985923的博客 469

全本地AI代理实战:零数据外泄的本地化Agent工作流搭建

全本地AI代理是一种将大语言模型推理、长期记忆与工具调用完全运行于用户本地设备的智能体架构,其核心原理在于通过进程隔离与标准化协议实现模型层、记忆层和工具层的解耦协同。相比依赖云端API的传统方案,它在数据主权、响应确定性与环境复现性上具备不可替代的技术价值。典型应用场景包括法务合规文档处理、离线工业现场辅助决策、以及高敏感度企业知识管理。本文聚焦Qwen2+Ollama+SurrealDB+Agno技术栈,详解如何构建可落地的全本地AI代理系统,覆盖从硬件适配、向量记忆建模到多模态插件协同的完整链路。

weixin_34194964的博客 650

海量Embedding进行相似度查询和比较的方法

这个是在科研中的现实需求。例如每一个源代码文件,我们可以生成一个embedding,如果有超过5000万个embedding(例如用BERT生成5000万个embedding),怎么样有效地计算相似性呢(例如有5000个positive的embedding,想在5000万个中找到类似的)。 简单介绍一下我尝试的结果:如果直接用torch.cosine_similarity,我手里的数据估计至少要处理两个月。这时候就想到了用LSH -- Locality Sensitive Hashing,但是我之前并没怎

qysh123的专栏 4567

Matlab之App Designer 一键自动生成带有表格的报告

本文采用案例讲解的方式介绍了采用Matlab中的App Designer开发可视化GUI分析界面后,实现一键自动导出带有表格报告的方法和步骤。可以实现从报告编制等繁琐的工作中解脱出来。

m0_59012156的博客 356

基于 ESP32 的分布式光伏微电网智能监控系统设计与实现

设备 / 模块连接 ESP32 引脚备注I2C 总线(SDA)GPIO21所有 I2C 设备共用I2C 总线(SCL)GPIO22所有 I2C 设备共用DS18B20(单总线)GPIO18单总线通信,需外接 4.7K 上拉电阻有源蜂鸣器GPIO19低电平触发,串联 100Ω 限流电阻ESP32 供电5V/GND由 LM2596 输出 5V 供电,或直接 USB 供电(调试阶段)INA219(光伏)光伏阵列正负极接 INA219 的 VIN+/VIN-

weixin_42300449的博客 304

ASPICE学习笔记

ASPICE的全称是Automotive SPICE。

汽车电子软件领域知识分享 1355

NVP6324、NVP6188、NVP6158C的区别详解

根据搜索结果,NVP6324、NVP6188、NVP6158C是Nextchip公司推出的不同型号视频处理芯片,主要区别体现在应用场景、功能特性、接口支持及封装规格等方面。如需进一步技术细节(如寄存器配置或开发支持),可参考具体型号的规格书或联系Nextchip代理商。

小灰灰的博客 3006

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

上一篇: 干货|捕捉智能合约中的event实战
下一篇: 区块链100讲:从村里的账本来看什么是区块链
HiBlock区块链社区
博客等级 码龄9年 469粉丝 81原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值