摘要:但是對于調(diào)用者來說,就需要知道合約有哪些方法,方法的參數(shù)是什么,返回值是什么,而這些信息就記錄在智能合約的中。
ABI是什么
ABI全稱 Application Binary Interface,字面意思是應用程序二進制接口,可以通俗的理解為合約的接口說明,當合約被編譯后,它對應的abi也就確定了。
abi有點類似于程序中的接口文檔,描述了字段名稱、字段類型、方法名稱、參數(shù)名稱、參數(shù)類型、方法返回值類型等
我們編寫智能合約的流程是:
編寫合約代碼(一般使用solidity語言)
編譯合約,將solidity編寫的代碼編譯成EVM可識別的bytecode,這一步生成abi
部署合約,將合約部署到區(qū)塊鏈上,生成合約地址,將合約內(nèi)容(即上一步生成的bytecode)作為input date輸入。部署合約是一個交易過程,所以也會生成一個交易Has
執(zhí)行合約,獲取合約地址,然后傳入?yún)?shù)調(diào)用合約中的方法,獲得執(zhí)行結(jié)果
從上面的步驟可以看出,abi對于EVM來說,其實是不需要的。但是對于調(diào)用者來說,就需要知道合約有哪些方法,方法的參數(shù)是什么,返回值是什么,而這些信息就記錄在智能合約的abi中。所以abi其實就相當于開發(fā)者的接口文檔,方便開發(fā)者調(diào)用執(zhí)行合約
ABI有哪些內(nèi)容我們來編寫一個最簡單的合約,然后編譯生成abi看下內(nèi)容
pragma solidity ^0.4.24; contract Demo { uint private x; function set(uint _x) public { x = _x; } }
執(zhí)行 truffle compile 編譯合約,就會生成對應的文件Demo.json,內(nèi)容如下。由于json太長,刪除了一些不重要的內(nèi)容,完整內(nèi)容可以自己手動執(zhí)行看看。
{ "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" }
大部分參數(shù)通過名稱就可以看出來含義,這里我們主要介紹abi中各參數(shù)的含義和調(diào)用函數(shù)時生成ABI編碼的過程
abi各參數(shù)的含義name:函數(shù)名稱
type:方法類型,包括function, constructor, fallback(缺省方法)可以缺省,默認為function
constant:布爾值,如果為true指明方法不會修改合約字段的狀態(tài)變量
payable:布爾值,標明方法是否可以接收ether
stateMutability:狀態(tài)類型,包括pure (不讀取區(qū)塊鏈狀態(tài)),view (和constant類型,只能查看,不會修改合約字段),nonpayable(和payable含義一樣),payable(和payable含義一樣)。其實保留payable和constant是為了向后兼容
inputs:數(shù)組,描述參數(shù)的名稱和類型
name:參數(shù)名稱
type:參數(shù)類型
outputs:和inputs一樣,如果沒有返回值,缺省是一個空數(shù)組
這里要說明一點的是,由于示例中的x字段類型為private,所以沒有生成一個和參數(shù)名稱一樣的函數(shù),如果x字段類型為public,生成的abi就如下,會多一個和參數(shù)名稱一樣的函數(shù)
"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" }
未完待續(xù),以太坊ABI介紹(二)
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.hztianpu.com/yun/24322.html
摘要:合約規(guī)定了公共職能部門,以創(chuàng)造新的投資和撤資,這將成為對沖基金的主要職能。對沖基金的用戶通過其以太坊地址來識別,該地址相當于公鑰。我發(fā)現(xiàn)與其他程序如程序的以太坊智能合約進行交互的最簡單方法是使用他們的。 在以太坊和其他區(qū)塊鏈中,仍有很多被證明的概念正在實施,開發(fā)人員在嘗試如何應對這些新概念。作為dInvest 系列文章一部分,我也在研究以太坊并嘗試在區(qū)塊鏈中實施對沖基金。在上一篇文章中...
摘要:上一篇我們講了中的參數(shù)含義以太坊介紹一,但是只有函數(shù)定義也是不行的,我們還需要調(diào)用,當調(diào)用一個函數(shù)時也需要對該函數(shù)進行編碼,這樣才能執(zhí)行,那么以太坊是如何生成可供調(diào)用的字節(jié)碼的。 上一篇我們講了ABI中的參數(shù)含義 以太坊ABI介紹(一),但是只有函數(shù)定義也是不行的,我們還需要調(diào)用,當調(diào)用一個函數(shù)時也需要對該函數(shù)進行編碼,這樣EVM才能執(zhí)行,那么以太坊是如何生成可供EVM調(diào)用的字節(jié)碼的。...
摘要:一系列的類似的對象,如果無返回值時,可以省略。表示函數(shù)聲明自己不會改變狀態(tài)變量的值。表示函數(shù)可以接收,否則表示不能。哈哈,恭喜大家,到這里這里就完整的實現(xiàn)了一個基于以太坊去中心化網(wǎng)頁錢包。 本文首發(fā)于深入淺出區(qū)塊鏈社區(qū)原文鏈接:[使用 ethers.js 開發(fā)以太坊Web錢包4 - 發(fā)送Token (代幣)](https://learnblockchain.cn/20...,請讀者前往...
摘要:一系列的類似的對象,如果無返回值時,可以省略。表示函數(shù)聲明自己不會改變狀態(tài)變量的值。表示函數(shù)可以接收,否則表示不能。哈哈,恭喜大家,到這里這里就完整的實現(xiàn)了一個基于以太坊去中心化網(wǎng)頁錢包。 本文首發(fā)于深入淺出區(qū)塊鏈社區(qū)原文鏈接:[使用 ethers.js 開發(fā)以太坊Web錢包4 - 發(fā)送Token (代幣)](https://learnblockchain.cn/20...,請讀者前往...
摘要:是以太坊開發(fā)的個人區(qū)塊鏈,可用于部署合約,開發(fā)應用程序和運行測試。安裝是一個用于與以太坊交互的庫。啟動以太坊測試區(qū)塊鏈服務器要部署智能合約,我們應該啟動測試以太坊服務器。最后,你將在以太坊合約中設(shè)置調(diào)用用戶對象時獲得的值。 將數(shù)據(jù)存儲在數(shù)據(jù)庫中是任何軟件應用程序不可或缺的一部分。無論如何控制該數(shù)據(jù)庫都有一個該數(shù)據(jù)的主控。區(qū)塊鏈技術(shù)將數(shù)據(jù)存儲到區(qū)塊鏈網(wǎng)絡內(nèi)的區(qū)塊中。因此,只要某個節(jié)點與網(wǎng)...
閱讀 1234·2021-09-22 15:43
閱讀 2429·2021-09-22 15:32
閱讀 4676·2021-09-22 15:11
閱讀 2347·2019-08-30 15:55
閱讀 2723·2019-08-30 15:54
閱讀 1047·2019-08-30 15:44
閱讀 1189·2019-08-29 13:26
閱讀 873·2019-08-29 12:54