博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【许晓笛】 EOS 智能合约案例解析(3)
阅读量:6510 次
发布时间:2019-06-24

本文共 3345 字,大约阅读时间需要 11 分钟。

详解 EOS 智能合约的 abi 文件

这次向大家介绍 eosio.token 智能合约的最后一个文件 —— abi文件。ABI 全称 Application Binary Interface,中文名“应用程序二进制接口”,顾名思义是一个接口文件,描述了智能合约与上层应用之间的数据交换格式。abi 文件格式类似 JSON,具备很好的可读性,有利于智能合约工程师与上层应用工程师之间的工作衔接。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 官方还在开发中。


相关文章和视频推荐

圆方圆学院汇集大批区块链名师,打造精品的区块链技术课程。 在各大平台都长期有优质免费公开课,欢迎报名收看。

公开课地址:

转载地址:http://mwdfo.baihongyu.com/

你可能感兴趣的文章
《Netkiller Blockchain 手札》Hyperledger Fabric Java SDK Demo
查看>>
Spring cloud 安全部署与性能优化
查看>>
querySelector 和 querySelectorAll区别
查看>>
Linux系统_Centos7下安装Nginx
查看>>
《PHP和MySQL Web 开发》 第12章 MySQL高级管理
查看>>
数据库设计 Step by Step (6) —— 提取业务规则
查看>>
深入理解java异常处理机制
查看>>
Redis客户端redisson实战
查看>>
连接到 JasperReports Server
查看>>
java处理高并发高负载类网站问题
查看>>
使用C#生成随机密码(纯数字或字母)和随机卡号(数字与字母组合)
查看>>
CAS服务器端集群
查看>>
Android内存泄漏的常见场景及解决方案
查看>>
设计模式 之 访问者模式
查看>>
JAVA Collections框架
查看>>
更改Windwos server 2003 域用户密码策略默认配置
查看>>
进制转换
查看>>
反转字符串中的单词
查看>>
html与html5的一些区别
查看>>
ASCII码
查看>>