• EOS智能合约案例解析(下)


    这次向大家介绍 eosio.token 智能合约的最后一个文件 —— abi文件。ABI 全称 Application Binary Interface,中文名“应用程序二进制接口”,顾名思义是一个接口文件,描述了智能合约与上层应用之间的数据交换格式。abi 文件格式类似 JSON,具备很好的可读性,有利于智能合约工程师与上层应用工程师之间的工作衔接。
    eosio.token.abi 文件地址: https://github.com/EOSIO/eos/blob/master/contracts/eosio.token/eosio.token.abi

    EOS 智能合约 abi 文件由 5 部分组成:

    {
        "types":[...],              //定义类型的别名
        "structs":[...],            //各个类型的数据结构
        "actions":[...],            //智能合约的 action
        "tables":[...],             //数据结构体
        "ricardian_clauses":[...]   //李嘉图条款

    }

    注:JSON 格式不支持注释,上面的双斜线大家理解就好。
    我们将按照 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 智能合约中,官方还没有进一步说明。

    structs

    刚才的只声明了三个 action 的名称,我们还要在 structs 里声明各个 action 需要传入的参数,如下所示。
     

     "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 列出了 智能合约中需要建立的数据表名称,以及数据表中所储存的结构体名称。

     "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 官方还在开发中。

    转自:https://blog.csdn.net/yuanfangyuan_block/article/details/80403329

    总会有不期而遇的温暖. 和生生不息的希望。
  • 相关阅读:
    HttpWebRequest.GetRequestStream方法timeout的原因及解决办法
    C#随机函数random()典型用法集锦
    windows 2008 开启默认共享
    Window xp命令大全
    大并发处理解决方案
    库特Z配置
    SQL Server 返回了错误 21(设备未就绪。) 解决方法
    C# 执行bat批处理文件
    sql索引从入门到精通(十亿行数据测试报告)
    DataTable使用时的小问题
  • 原文地址:https://www.cnblogs.com/devi1/p/13486424.html
Copyright © 2020-2023  润新知