什么是以太坊合约ABI(Application Binary Interface)

文章目录

    • 什么是以太坊合约ABI
      • 一、背景
      • 二、ABI(Application Binary Interface)
      • 三、怎么生成ABI
        • solc命令
      • 四、abi内容
        • Function
        • Event
        • 函数选择器
      • 五、参考

什么是以太坊合约ABI

一、背景

以太坊的智能合约程序,是在以太坊虚拟机(Ethereum Virtual Machine,EVM)上运行的。
合约账户不能自己启动运行自己的智能合约。要运行一个智能合约,需要由外部账户对合约账户发起交易,从而启动其中的代码的执行

二、ABI(Application Binary Interface)

ABI(Application Binary Interface)是合约的接口描述,描述了字段名称、字段类型、方法名称、参数名称、参数类型、方法返回值类型等。

当合约被编译后,对应的abi也就确定了。

编译合约,将solidity编写的代码编译成EVM可识别的bytecode,同时生成abi。

部署合约,将合约部署到区块链上,生成合约地址,将合约内容(即上一步生成的bytecode)作为input data输入。部署合约是一个交易过程,所以也会生成一个交易Hash

对于调用者来说,就需要知道合约有哪些方法,方法的参数是什么,返回值是什么,而这些信息就记录在智能合约的abi中。所以abi其实就相当于开发者的接口文档,方便开发者调用执行合约。

因此要想和合约交互,就离不开ABI数据。

三、怎么生成ABI

如果你使用truffle,truffle编译部署后,build目录下会有一个 合约.json abi

如果你使用hardcat,hardhat生成的 JSON 文件通常不仅包含 ABI,还包括字节码和其他元数据。为了使用 abigen,你需要手工从生成的 JSON 文件中提取出 ABI 部分
对于hardcat,你也可以使用Hardhat 三方插件 Hardhat ABI Exporter
官方链接: https://learnblockchain.cn/docs/hardhat/plugins/hardhat-abi-exporter.html
可以参考本人文章:使用golang与智能合约进行交互

solc命令

我们看看如何用solc命令生成合约 ABI 和 EVM 字节码。solc命令是最常用的编译器之一。用 npm 包管理器安装它:

$ npm install -g solc

四、abi内容

官方ABI合约规范:https://docs.soliditylang.org/en/latest/abi-spec.html

合约 ABI 的 JSON 格式由各种函数或事件描述组成。

合约 ABI 定义函数名称和参数数据类型,用于对 EVM 的合约调用进行编码并从交易中读取数据。

Ethereum 智能合约 ABI 用一个 array 表示,其中会包含数个用 JSON 格式表示的 Function 或 Event。

Function

共有 7 个参数:

  • name:a string,定义函数的名称
  • type:a string,“function”, “constructor”, or “fallback” 定义函数类型。可以是 function ,constructor, receive(对于 receive ether 函数),或者 fallback(对于 default 函数)
  • inputs:an array,function 输入的参数,包含:
    • name:a string,参数名
    • type:a string,参数的规范类型。例如 uint256
    • components:an array,如果输入的参数是 tuple(struct) type 才会有这个参数。描述 struct 中包含的参数类型
  • outputs:an array,function 的返回值,和 inputs 使用相同表示方式。如果沒有返回值可忽略,值为 []
  • payable:true,function 是否可收 Ether,预设为 false
  • constant:true,function 是否会改写区块链状态,反之为 false
  • stateMutability:a string,其值可能为以下其中之一:“pure”(不会读写区块链状态)、“view”(只读不写区块链状态)、“payable” and “nonpayable”(会改区块链状态,且如可收 Ether 为 “payable”,反之为 “nonpayable”)
Event

共有 4 个参数:

  • name: a string,event 的名称
  • type: a string,always “event”
  • inputs: an array,输入参数,包含:
    • name: a string,参数名称
    • type: a string,参数的 data type(e.g. uint256)
    • components: an array,如果输入参数是 tuple(struct) type 才会有这个参数。描述 struct 中包含的信息类型
    • indexed: true,如果这个参数被定义为 indexed ,反之为 false
  • anonymous: true,如果 event 被定义为 anonymous

Event 的参数分为:有 indexed,和其他没有 indexed 的。有 indexed 的参数可以使用 filter。

函数选择器

函数选择器值 实际是对函数签名字符串进行sha3(keccak256)哈希运算之后,取前4个字节。

五、参考

如何理解以太坊ABI - 应用程序二进制接口
参考URL: https://learnblockchain.cn/2018/08/09/understand-abi/

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

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

相关文章

网络构建关键技术_2.IPv4与IPv6融合组网技术

互联网数字分配机构(IANA)在2016年已向国际互联网工程任务组(IETF)提出建议,要求新制定的国际互联网标准只支持IPv6,不再兼容IPv4。目前,IPv6已经成为唯一公认的下一代互联网商用解决方案&#…

安卓开发app-基础的java项目构建补充知识

安卓开发app-基础的java项目构建补充知识!上一次分享了基础的项目构建,但是还遗漏了一些基础的内容。今天补充完整。 首先,是关于项目的一些配置文件的信息。 第一个配置文件:{setting.gradle} 国内阿里云仓库地址信息&#xff1…

定制型汽车传感器在汽车中的应用

定制型汽车霍尔传感器在汽车中的应用及功能 曲轴和凸轮轴位置传感器: 这些传感器用于监测发动机的曲轴和凸轮轴的位置,帮助发动机管理系统精确控制点火时机和燃油喷射,提高发动机效率。 变速器控制系统: 在自动变速器中&#xf…

Linux虚拟串口设置

VSPD虚拟串口软件安装及使用 一、软件安装 1、Configure Virtual Serial Port Driver(VSPD) 1.1 首先下载 Configure Virtual Serial Port Driver(VSPD) 软件 链接:https://pan.baidu.com/s/11aGc2aHGUew5QZ0XhaWXJw 提取码:rmd7 1.2 安装时注意将…

第20集《大乘起信论》

请大家打开《讲义》第三十九页。我们这一科是讲未二、更约因缘互相成办。 这地方是说,既然我们内心的本觉是没有差别的,本觉在内心当中,白天、晚上不断的熏习我们,但是为什么每一个人的成佛之道,会有这么多差别的因缘…

局域网必备文件传输神器,吾爱再出精品,支持电脑、手机无缝对接!

今天给大家带来的不是一般的干货,而是一款让阿星我爱不释手的局域网文件传输神器,而且是吾爱大佬出品。无论是工作还是生活,它都能给你带来极大的便利。这年头,谁还没个跨设备传输文件的需求呢? 手机、电脑、平板&…

江大白 | 何凯明入职 MIT,首次带队提出Diffusion Loss,扩散模型思想提升生成速度和效果 !

本文来源公众号“江大白”,仅用于学术分享,侵权删,干货满满。 原文链接:何凯明入职 MIT,首次带队提出Diffusion Loss,扩散模型思想提升生成速度和效果 ! 导读 在图像生成领域中,作…

使用 PyQt5 创建一个数字时钟

使用 PyQt5 创建一个数字时钟 效果代码解析定义时钟类初始化界面显示时间 完整代码 在这篇博客中,我们将使用 PyQt5 创建一个简单的数字时钟。 效果 代码解析 定义时钟类 class ClockWindow(QMainWindow):def __init__(self):super().__init__()self.setWindowTit…

对数函数转换公式

对数函数换底公式. 1. 2. 3. 以上公式可以由以下公式推导而来, 1. 2. 3. 4.

zabbix监控进阶:如何分时段设置不同告警阈值(多阈值告警)

作者 乐维社区(forum.lwops.cn)乐乐 在生产环境中,企业的业务系统状态并不是一成不变的。在业务高峰时段,如节假日、促销活动或特定时间段,系统负载和用户访问量会大幅增加,此时可能需要设置更高的告警阈值…

顶顶通呼叫中心中间件-私有化TTS安装指南

顶顶通呼叫中心中间件-私有化TTS安装指南 1、下载模型 执行这个下载模型 wget http://down.ddrj.com/paddlespeech_tts.zip 2、解压模型 执行这个解压模型 unzip -d /ddt/asrproxy paddlespeech_tts.zip 3、配置asrproxy.json文件 这里需要注意的是:以下内容…

安全与加密常识(7)pem, der, crt, cer, key等各类证书与密钥文件后缀解析

在计算机科学和安全领域,PEM, DER, CRT, CER, KEY等文件后缀经常出现在证书和密钥文件的命名中。这些后缀代表了不同的文件格式和编码方式,对于理解它们的含义和应用至关重要。本文将逐一解析这些后缀,帮助读者更好地理解和使用。 PEM(Privacy-Enhanced Mail) PEM是一种…

Spark学习3.0

目录 10.3.4 Spark运行原理 1.设计背景 2.RDD概念 3.RDD特性 4.RDD之间的依赖关系 窄依赖和宽依赖 5.Stage的划分 Stage的类型包括两种:ShuffleMapStage和ResultStage 6.RDD运行过程 10.3.4 Spark运行原理 1.设计背景 许多 迭代式算法(比如机器学习、图…

AI绘画工具介绍常见的AI绘画工具及其特点和应用场景的详细介绍

AI绘画工具是一类利用人工智能技术,特别是深度学习和神经网络技术,来辅助或自动生成艺术作品的软件。这些工具在艺术创作、设计、广告制作等领域有广泛的应用,极大地降低了创作门槛,提高了效率。以下是一些常见的AI绘画工具及其特…

mybatis#号和$区别

在MyBatis中,#{}和${}都是用于实现动态SQL的占位符,但它们在使用场景和安全性上有明显的区别: 用途区别: #{}主要用于传递接口传输过来的具体数据,如参数值,它可以防止SQL注入,因为MyBatis会…

硬的不行来软的,我还破解不了你?看老哥如何Dump 你的 BootRom。

最近曾写了一篇:【牛掰!这小哥用显微镜摄取芯片ROM,还原了芯片的二进制固件】,蛮多朋友说这要是采用多层堆叠,你还能这么原始的操作?自然不行,而且这也是一篇考古的文章。但是!!! 今天带来的这篇,老哥从软件采用了非侵入式的方式,实现了破解。从EL2 层层逆向最终获…

实验5 图像分割

1. 实验目的 ①掌握图像分割的含义与目的; ②掌握迭代法、最大类间方差法、直方图法等阈值分割方法; ③掌握霍夫变换、区域生长法、区域分裂与合并法的原理,并能编程实现。 2. 实验内容 ①调用Matlab / PythonOpenCV中的相关函数&#xff…

nginx优势以及应用场景,编译安装和nginx

一. Nginx是什么? 1. Nginx概述 高性能、轻量级Web服务软件系统资源消耗低对HTTP并发连接的处理能力高单台物理服务器可支持30,000~50,000个并发请求Nginx(发音同 “engine x”)是一个高性能的反向代理和Web服务器软件&#xff0c…

OffscreenCanvas:Web Workers 中的画布操作

在 Web 开发中,我们经常需要处理复杂的图形和动画,这些操作可能会影响页面的性能和用户体验。为了解决这个问题,现代浏览器引入了 OffscreenCanvas 接口,它允许我们在后台线程(Web Workers)中进行画布操作&…

python教程---网络爬虫

7.1 urllib Urllib是Python内置的一个用于读取来自Web的数据的库。它是一个请求库,可以用来发送HTTP请求,获取网页内容,支持多种HTTP方法,如GET和POST等。 使用Urllib读取网页内容的步骤如下: 导入Urllib库中的reque…