最新內容會更新在主站深刻淺出區塊鏈社區
原文連接:如何理解以太坊ABI - 應用程序二進制接口html
不少同窗不是很明白以太坊ABI是什麼,他的做用是什麼,讀完本文就明白了。web
閱讀本文前,你應該對以太坊、智能合約有所瞭解,
若是你還不瞭解,建議你先看以太坊是什麼,也能夠觀看咱們的視頻:零基礎搞懂區塊鏈和深刻詳解以太坊智能合約語言Solidity, 能夠系統全面學習理解以太坊、智能合約。api
ABI 全稱是 Application Binary Interface,翻譯過來就是:應用程序二進制接口,簡單來講就是 以太坊的調用合約時的接口說明。還不是很理解,不要緊。網絡
從外部施加給以太坊的行爲都稱之爲向以太坊網絡提交了一個交易, 調用合約函數實際上是向合約地址(帳戶)提交了一個交易,這個交易有一個附加數據,這個附加的數據就是ABI的編碼數據。
函數
比特幣的交易也能夠附加數據,以太坊革命性的地方就是能把附加數據轉化爲都函數的執行。學習
所以要想和合約交互,就離不開ABI數據。區塊鏈
如下面以個最簡單的合約爲例,咱們看看用參數 1 調用set(uint x)
,這個交易附帶的數據是什麼。ui
pragma solidity ^0.4.0; contract SimpleStorage { uint storedData; function set(uint x) public { storedData = x; } function get() public constant returns (uint) { return storedData; } }
固然第一步須要先把合約部署到以太坊網絡(其實部署也是一個)上,而後用 「1」 做爲參數調用set,以下圖:
編碼
而後咱們打開etherscan查看交易詳情數據, 能夠看到其附加數據以下圖:
翻譯
這個數據就是ABI的編碼數據:
0x60fe47b10000000000000000000000000000000000000000000000000000000000000001
我把上面交易的附加數據拷貝出來分析一下,這個數據能夠分紅兩個子部分:
函數選擇器(4字節)
0x60fe47b1
第一個參數(32字節)
00000000000000000000000000000000000000000000000000000000000000001
函數選擇器值 實際是對函數簽名字符串進行sha3(keccak256)哈希運算以後,取前4個字節,用代碼表示就是:
bytes4(sha3(「set(uint256)」)) == 0x60fe47b1
參數部分則是使用對應的16進制數。
如今就好理解 附加數據怎麼轉化爲對應的函數調用。
那麼怎麼得到函數對應的ABI 數據呢, 有兩種方法:
一個是 solidity 提供了ABI的相關API, 用來直接獲得ABI編碼信息,這些函數有:
經過ABI編碼函數能夠在不用調用函數的狀況下,得到ABI編碼值,下面經過一段代碼來看看這些方法的使用:
pragma solidity ^0.4.24; contract testABI { uint storedData; function set(uint x) public { storedData = x; } function abiEncode() public constant returns (bytes) { abi.encode(1); // 計算1的ABI編碼 return abi.encodeWithSignature("set(uint256)", 1); //計算函數set(uint256) 及參數1 的ABI 編碼 } }
你們能夠運行運行下abiEncode
函數,它的輸出其實就是前面調用的附加數據。
另外一個web3提供相應的API,例如使用web3計算函數選擇器的方式以下:
web3.eth.abi.encodeFunctionSignature('myMethod(uint256,string)');
其完整的文檔在這裏,這裏不一一演示。
歡迎來知識星球提問,星球內已經彙集了300多位區塊鏈技術愛好者。
深刻淺出區塊鏈 - 系統學習區塊鏈,打造最好的區塊鏈技術博客。