溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

以太坊智能合約ABI怎么獲取

發(fā)布時間:2021-12-29 14:16:12 來源:億速云 閱讀:2424 作者:iii 欄目:互聯(lián)網(wǎng)科技

本篇內(nèi)容介紹了“以太坊智能合約ABI怎么獲取”的有關(guān)知識,在實(shí)際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!

以太坊智能合約ABI怎么獲取

ABI(Application Binary Interface)

如果理解 API 就很容易了解 ABI。簡單來說,API 是程序與程序間互動的接口。這個接口包含程序提供外界存取所需的 functions、variables 等。ABI 也是程序間互動的接口,但程序是被編譯后的 binary code。所以同樣的接口,但傳遞的是 binary 格式的信息。所以 ABI 就要描述如何 decode/encode 程序間傳遞的 binary 信息。下圖以 Linux 為例,描述 Linux 中 API、ABI 和程序的關(guān)系。

以太坊智能合約ABI怎么獲取

編譯和部署智能合約

在 Ethereum 智能合約可以被大家使用前,必須先被部署到區(qū)塊鏈上。

從智能合約的代碼到使用智能合約,大概包含幾個步驟:

  1. 編寫智能合約的代碼(一般是用 Solidity 寫)

  2. 編譯智能合約的代碼變成可在 EVM 上執(zhí)行的 bytecode(binary code)。同時可以通過編譯取得智能合約的 ABI

  3. 部署智能合約,實(shí)際上是把 bytecode 存儲在鏈上(通過一個transaction),并取得一個專屬于這個合約的地址

  4. 如果要寫個程序調(diào)用這個智能合約,就要把信息發(fā)送到這個合約的地址(一樣的也是通過一個 transaction)。Ethereum 節(jié)點(diǎn)會根據(jù)輸入的信息,選擇要執(zhí)行合約中的哪一個 function 和要輸入的參數(shù)

而要如何知道這這個智能合約提供哪些 function 以及應(yīng)該要傳入什么樣的參數(shù)呢?這些信息就是記錄在智能合約的 ABI!

Ethereum 智能合約 ABI

Ethereum 智能合約 ABI 用一個 array 表示,其中會包含數(shù)個用 JSON 格式表示的 Function 或 Event。根據(jù)最新的 Solidity 文件:

Function

共有 7 個參數(shù):

  1. name:a string,function 名稱

  2. type:a string,"function", "constructor", or "fallback"

  3. inputs:an array,function 輸入的參數(shù),包含:

    • name:a string,參數(shù)名

    • type:a string,參數(shù)的 data type(e.g. uint256)

    • components:an array,如果輸入的參數(shù)是 tuple(struct) type 才會有這個參數(shù)。描述 struct 中包含的參數(shù)類型

  4. outputs:an array,function 的返回值,和 inputs 使用相同表示方式。如果沒有返回值可忽略,值為 []

  5. payabletrue,function 是否可收 Ether,預(yù)設(shè)為 false

  6. constanttrue,function 是否會改寫區(qū)塊鏈狀態(tài),反之為 false

  7. stateMutability:a string,其值可能為以下其中之一:"pure"(不會讀寫區(qū)塊鏈狀態(tài))、"view"(只讀不寫區(qū)塊鏈狀態(tài))、"payable" and "nonpayable"(會改區(qū)塊鏈狀態(tài),且如可收 Ether 為 "payable",反之為 "nonpayable")

仔細(xì)看會發(fā)現(xiàn) payable 和 constant 這兩個參數(shù)所描述的內(nèi)容,似乎已包含在 stateMutability 中。

事實(shí)也確實(shí)是這樣的,在 Solidity v0.4.16 中把 constant 這個修飾function 的 key words 分成: view(neither reads from nor writes to the state)和 pure(does not modify the state),并從 v0.4.17 開始 Type Checker 會強(qiáng)制檢查。constant 改為只用來修飾不能被修改的 variable。并在 ABI 中加入 stateMutability 這個參數(shù)統(tǒng)一表示,payable 和 constant 目前保留是為了向后兼容。這個改動詳細(xì)的內(nèi)容和討論可參考: https://github.com/ethereum/solidity/issues/992

Event

共有 4 個參數(shù):

  1. name: a string,event 的名稱

  2. type: a string,always "event"

  3. inputs: an array,輸入?yún)?shù),包含:

    • name: a string,參數(shù)名稱

    • type: a string,參數(shù)的 data type(e.g. uint256)

    • components: an array,如果輸入?yún)?shù)是 tuple(struct) type 才會有這個參數(shù)。描述 struct 中包含的信息類型

    • indexedtrue,如果這個參數(shù)被定義為 indexed ,反之為 false

  4. anonymoustrue,如果 event 被定義為 anonymous

更新智能合約狀態(tài)需要發(fā)送 transaction,transaction 需要等待驗(yàn)證,所以更新合約狀態(tài)是非同步的,無法馬上取得返回值。使用 Event 可以在狀態(tài)更新成功后,將相關(guān)信息記錄到 Log,并讓監(jiān)聽這個 Event 的 DApp 或任何應(yīng)用這個接口的程序收到通知。每筆 transaction 都有對應(yīng)的 Log。

所以簡單來說,Event 可用來:1. 取得 function 更新合約狀態(tài)的返回值 2. 也可作為合約另外的存儲空間。

Event 的參數(shù)分為:有 indexed,和其他沒有 indexed 的。有 indexed 的參數(shù)可以使用 filter,例如同一個 Event,我可以選擇只監(jiān)聽從特定 address 發(fā)出來的交易。每筆 Log 的信息同樣分為兩個部分:Topics(長度最多為 4 的 array) 和 Data。有 indexed 的參數(shù)會存儲存在 Log 的 Topics,其他的存在 Data。如果定義為 anonymous,就不會產(chǎn)生以下示例中的 Topics[0],其值為 Event signature 的 hash,作為這個 Event 的 ID。

以太坊智能合約ABI怎么獲取

event Set(address indexed _from, uint value)

用一個簡單的智能合約舉個例子

這個智能合約包含:

  • data:一個可修改的 state variable,會自動產(chǎn)生一個只能讀取的 data() function

  • set():一個修改 data 值的 function

  • Set():一個在每次修寫 data 時記錄 Log 的 event

智能合約 Source Code:

pragma solidity ^0.4.20;
contract SimpleStorage {
    uint public data;
    event Set(address indexed _from, uint value);
    function set(uint x) public {
        data = x;
        Set(msg.sender, x);
    }
}

智能合約 ABI:

[{
        "constant": true,
        "inputs": [],
        "name": "data",
        "outputs": [{"name": "","type": "uint256"}],
        "payable": false,
        "stateMutabㄒility": "view",
        "type": "function"
    },
    {
        "anonymous": false,
        "inputs": [{"indexed": true,"name": "_from","type": "address"},{"indexed": false,"name": "value","type": "uint256"}],
        "name": "Set",
        "type": "event"
    },
    {
        "constant": false,
        "inputs": [{"name": "x","type": "uint256"}],
        "name": "set",
        "outputs": [],
        "payable": false,
        "stateMutability": "nonpayable",
        "type": "function"
}]

取得 Ethereum 智能合約 ABI

Solidity Compiler

可以用 Solidity Compiler 取得合約 ABI,我使用 JavaScript 版本的 Compiler 為例。

安裝:

npm install solc -g

取得合約 ABI:

solcjs simpleStorage.sol --abi

會生成一個 simpleStorage_sol_SimpleStorage.abi 文件,里面就是合約ABI 內(nèi)容。

也可以取得合約的 binary code:

solcjs your_contract.sol --bin

Remix

同樣的使用 Solidity Compiler,也可以用 Remix。在合約的 Details 可以看到完整的 ABI??梢栽?Settings 中指定 Compiler 版本。

以太坊智能合約ABI怎么獲取

Etherscan

許多知名合約會把合約 source code 放上 Etherscan 做驗(yàn)證,可以同時看到h 合約ABI。

以太坊智能合約ABI怎么獲取

另外 Etherscan 提供 API,可用來取得經(jīng)過驗(yàn)證的合約 ABI。

“以太坊智能合約ABI怎么獲取”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI