摘要:但是對于調用者來說,就需要知道合約有哪些方法,方法的參數是什么,返回值是什么,而這些信息就記錄在智能合約的中。
ABI是什么
ABI全稱 Application Binary Interface,字面意思是應用程序二進制接口,可以通俗的理解為合約的接口說明,當合約被編譯后,它對應的abi也就確定了。
abi有點類似于程序中的接口文檔,描述了字段名稱、字段類型、方法名稱、參數名稱、參數類型、方法返回值類型等
我們編寫智能合約的流程是:
編寫合約代碼(一般使用solidity語言)
編譯合約,將solidity編寫的代碼編譯成EVM可識別的bytecode,這一步生成abi
部署合約,將合約部署到區塊鏈上,生成合約地址,將合約內容(即上一步生成的bytecode)作為input date輸入。部署合約是一個交易過程,所以也會生成一個交易Has
執行合約,獲取合約地址,然后傳入參數調用合約中的方法,獲得執行結果
從上面的步驟可以看出,abi對于EVM來說,其實是不需要的。但是對于調用者來說,就需要知道合約有哪些方法,方法的參數是什么,返回值是什么,而這些信息就記錄在智能合約的abi中。所以abi其實就相當于開發者的接口文檔,方便開發者調用執行合約
ABI有哪些內容我們來編寫一個最簡單的合約,然后編譯生成abi看下內容
pragma solidity ^0.4.24; contract Demo { uint private x; function set(uint _x) public { x = _x; } }
執行 truffle compile 編譯合約,就會生成對應的文件Demo.json,內容如下。由于json太長,刪除了一些不重要的內容,完整內容可以自己手動執行看看。
{ "contractName": "Demo", "abi": [ { "constant": false, "inputs": [ { "name": "_x", "type": "uint256" } ], "name": "set", "outputs": [], "payable": false, "stateMutability": "nonpayable", "type": "function" } ], "bytecode": "0x6080604052348015600f57600080fd5b5060a48061001e6000396000f300608060405260043610603f576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806360fe47b1146044575b600080fd5b348015604f57600080fd5b50606c60048036038101908080359060200190929190505050606e565b005b80600081905550505600a165627a7a723058201dfe7c019fec67ccd87250c9ac8642c163cc5f43588715b33e8a8953df3715f60029", "deployedBytecode": "0x608060405260043610603f576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806360fe47b1146044575b600080fd5b348015604f57600080fd5b50606c60048036038101908080359060200190929190505050606e565b005b80600081905550505600a165627a7a723058201dfe7c019fec67ccd87250c9ac8642c163cc5f43588715b33e8a8953df3715f60029", "sourceMap": "27:97:1:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;27:97:1;;;;;;;", "deployedSourceMap": "27:97:1:-;;;;;;;;;;;;;;;;;;;;;;;;69:52;;8:9:-1;5:2;;;30:1;27;20:12;5:2;69:52:1;;;;;;;;;;;;;;;;;;;;;;;;;;;112:2;108:1;:6;;;;69:52;:::o", "source": "pragma solidity ^0.4.24; contract Demo { uint private x; function set(uint _x) public { x = _x; } } ", "sourcePath": "/Users/root/Workspace/DApp/demo/contracts/Demo.sol", "ast": { ... }, "legacyAST": { ... }, "compiler": { "name": "solc", "version": "0.4.24+commit.e67f0147.Emscripten.clang" }, "networks": {}, "schemaVersion": "2.0.1", "updatedAt": "2018-09-14T11:57:49.750Z" }
大部分參數通過名稱就可以看出來含義,這里我們主要介紹abi中各參數的含義和調用函數時生成ABI編碼的過程
abi各參數的含義name:函數名稱
type:方法類型,包括function, constructor, fallback(缺省方法)可以缺省,默認為function
constant:布爾值,如果為true指明方法不會修改合約字段的狀態變量
payable:布爾值,標明方法是否可以接收ether
stateMutability:狀態類型,包括pure (不讀取區塊鏈狀態),view (和constant類型,只能查看,不會修改合約字段),nonpayable(和payable含義一樣),payable(和payable含義一樣)。其實保留payable和constant是為了向后兼容
inputs:數組,描述參數的名稱和類型
name:參數名稱
type:參數類型
outputs:和inputs一樣,如果沒有返回值,缺省是一個空數組
這里要說明一點的是,由于示例中的x字段類型為private,所以沒有生成一個和參數名稱一樣的函數,如果x字段類型為public,生成的abi就如下,會多一個和參數名稱一樣的函數
"abi": [ { "constant": true, "inputs": [], "name": "x", "outputs": [ { "name": "", "type": "uint256" } ], "payable": false, "stateMutability": "view", "type": "function" }, { "constant": false, "inputs": [ { "name": "_x", "type": "uint256" } ], "name": "set", "outputs": [], "payable": false, "stateMutability": "nonpayable", "type": "function" }
未完待續,以太坊ABI介紹(二)
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/24322.html
摘要:合約規定了公共職能部門,以創造新的投資和撤資,這將成為對沖基金的主要職能。對沖基金的用戶通過其以太坊地址來識別,該地址相當于公鑰。我發現與其他程序如程序的以太坊智能合約進行交互的最簡單方法是使用他們的。 在以太坊和其他區塊鏈中,仍有很多被證明的概念正在實施,開發人員在嘗試如何應對這些新概念。作為dInvest 系列文章一部分,我也在研究以太坊并嘗試在區塊鏈中實施對沖基金。在上一篇文章中...
摘要:上一篇我們講了中的參數含義以太坊介紹一,但是只有函數定義也是不行的,我們還需要調用,當調用一個函數時也需要對該函數進行編碼,這樣才能執行,那么以太坊是如何生成可供調用的字節碼的。 上一篇我們講了ABI中的參數含義 以太坊ABI介紹(一),但是只有函數定義也是不行的,我們還需要調用,當調用一個函數時也需要對該函數進行編碼,這樣EVM才能執行,那么以太坊是如何生成可供EVM調用的字節碼的。...
摘要:一系列的類似的對象,如果無返回值時,可以省略。表示函數聲明自己不會改變狀態變量的值。表示函數可以接收,否則表示不能。哈哈,恭喜大家,到這里這里就完整的實現了一個基于以太坊去中心化網頁錢包。 本文首發于深入淺出區塊鏈社區原文鏈接:[使用 ethers.js 開發以太坊Web錢包4 - 發送Token (代幣)](https://learnblockchain.cn/20...,請讀者前往...
摘要:一系列的類似的對象,如果無返回值時,可以省略。表示函數聲明自己不會改變狀態變量的值。表示函數可以接收,否則表示不能。哈哈,恭喜大家,到這里這里就完整的實現了一個基于以太坊去中心化網頁錢包。 本文首發于深入淺出區塊鏈社區原文鏈接:[使用 ethers.js 開發以太坊Web錢包4 - 發送Token (代幣)](https://learnblockchain.cn/20...,請讀者前往...
摘要:是以太坊開發的個人區塊鏈,可用于部署合約,開發應用程序和運行測試。安裝是一個用于與以太坊交互的庫。啟動以太坊測試區塊鏈服務器要部署智能合約,我們應該啟動測試以太坊服務器。最后,你將在以太坊合約中設置調用用戶對象時獲得的值。 將數據存儲在數據庫中是任何軟件應用程序不可或缺的一部分。無論如何控制該數據庫都有一個該數據的主控。區塊鏈技術將數據存儲到區塊鏈網絡內的區塊中。因此,只要某個節點與網...
閱讀 1154·2021-09-22 15:43
閱讀 2350·2021-09-22 15:32
閱讀 4508·2021-09-22 15:11
閱讀 2209·2019-08-30 15:55
閱讀 2581·2019-08-30 15:54
閱讀 988·2019-08-30 15:44
閱讀 1103·2019-08-29 13:26
閱讀 798·2019-08-29 12:54