【許曉笛】 EOS 智能合約案例解析(3)

詳解 EOS 智能合約的 abi 文件

此次向你們介紹 eosio.token 智能合約的最後一個文件 —— abi文件。ABI 全稱 Application Binary Interface,中文名「應用程序二進制接口」,顧名思義是一個接口文件,描述了智能合約與上層應用之間的數據交換格式。abi 文件格式相似 JSON,具有很好的可讀性,有利於智能合約工程師與上層應用工程師之間的工做銜接。eosio.token.abi 文件地址: https://github.com/EOSIO/eos/...git

EOS 智能合約 abi 文件由 5 部分組成:github

{
    "types":[...],              //定義類型的別名
    "structs":[...],            //各個類型的數據結構
    "actions":[...],            //智能合約的 action
    "tables":[...],             //數據結構體
    "ricardian_clauses":[...]   //李嘉圖條款
}

注:JSON 格式不支持註釋,上面的雙斜線你們理解就好。segmentfault

咱們將按照 actions -> structs -> tables -> structs -> types -> ricardian_clauses 的順序瞭解 EOS 智能合約 abi 的開發方法。數據結構

actions

action 部分的做用是聲明智能合約有哪些能夠調用的 action。以下所示。區塊鏈

"actions": [{
      "name": "transfer",
      "type": "transfer",
      "ricardian_contract": ""
    },{
      "name": "issue",
      "type": "issue",
      "ricardian_contract": ""
    }, {
      "name": "create",
      "type": "create",
      "ricardian_contract": ""
    }

  ]

其中每一項的 name 就是 action 的名字,type 用來在 structs 中查找數據結構。ricardian_contract 是李嘉圖合約,剛剛被加入到 EOS 智能合約中,官方尚未進一步說明。ui

structs

剛纔的只聲明瞭三個 action 的名稱,咱們還要在 structs 裏聲明各個 action 須要傳入的參數,以下所示。code

"structs": [{
      "name": "transfer",
      "base": "",
      "fields": [
        {"name":"from", "type":"account_name"},
        {"name":"to", "type":"account_name"},
        {"name":"quantity", "type":"asset"},
        {"name":"memo", "type":"string"}
      ]
    },{
     "name": "create",
     "base": "",
     "fields": [
        {"name":"issuer", "type":"account_name"},
        {"name":"maximum_supply", "type":"asset"},
        {"name":"can_freeze", "type":"uint8"},
        {"name":"can_recall", "type":"uint8"},
        {"name":"can_whitelist", "type":"uint8"}
     ]
  },{
     "name": "issue",
     "base": "",
     "fields": [
        {"name":"to", "type":"account_name"},
        {"name":"quantity", "type":"asset"},
        {"name":"memo", "type":"string"}
     ]
  }
  ]

EOS 系統會根據 actions 部分中聲明的 type ,在 structs 部分尋找對應的數據結構,每一個數據結構的 fields 中,會列出每一個參數的名稱和類型。視頻

tables

tables 列出了 智能合約中須要創建的數據表名稱,以及數據表中所儲存的結構體名稱。token

"tables": [{
      "name": "accounts",
      "type": "account",
      "index_type": "i64",
      "key_names" : ["currency"],
      "key_types" : ["uint64"]
    },{
      "name": "stat",
      "type": "currency_stats",
      "index_type": "i64",
      "key_names" : ["currency"],
      "key_types" : ["uint64"]
    }
  ]

其中的 type 就是數據表中所儲存的結構體名稱。接口

structs

爲何又回到 structs 了呢,由於不光是 action 裏的項目須要在 structs 裏列出詳細的數據結構,tables 中的項目也須要。

"structs": [{
      "name": "account",
      "base": "",
      "fields": [
        {"name":"balance", "type":"asset"},
        {"name":"frozen", "type":"uint8"},
        {"name":"whitelist", "type":"uint8"}
      ]
    },{
      "name": "currency_stats",
      "base": "",
      "fields": [
        {"name":"supply", "type":"asset"},
        {"name":"max_supply", "type":"asset"},
        {"name":"issuer", "type":"account_name"},
        {"name":"can_freeze", "type":"uint8"},
        {"name":"can_recall", "type":"uint8"},
        {"name":"can_whitelist", "type":"uint8"},
        {"name":"is_frozen", "type":"uint8"},
        {"name":"enforce_whitelist", "type":"uint8"}
      ]
    }
  ]

types

types 部分用來創建類型的別名,好比你想給 account_name 類型創建一個別名:

"types": [{
      "new_type_name": "account_name",
      "type": "name"
    }
  ]

這樣在這個 abi 文件裏就能夠用 name 來代替 account_name了。

ricardian_clauses

有關李嘉圖條款的部分 EOS 官方還在開發中。


相關文章和視頻推薦

【許曉笛】 EOS智能合約案例解析(1)
【許曉笛】 EOS智能合約案例解析(2)

圓方圓學院聚集大批區塊鏈名師,打造精品的區塊鏈技術課程。 在各大平臺都長期有優質免費公開課,歡迎報名收看。
公開課地址:https://ke.qq.com/course/345101

相關文章
相關標籤/搜索