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