什么是以太坊合約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.pswp.cn/diannao/38407.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/38407.shtml
英文地址,請注明出處:http://en.pswp.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…