文章目錄
- 什么是以太坊合約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/