当前位置: 首页 > news >正文

【许晓笛】 EOS 智能合约案例解析(3)

详解 EOS 智能合约的 abi 文件

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

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


相关文章和视频推荐

【许晓笛】 EOS智能合约案例解析(1)
【许晓笛】 EOS智能合约案例解析(2)

圆方圆学院汇集大批区块链名师,打造精品的区块链技术课程。 在各大平台都长期有优质免费公开课,欢迎报名收看。
公开课地址:https://ke.qq.com/course/345101

相关文章:

  • 关于智能共享出行,政界、学界和业界的专家都说了什么? | SMC 2018
  • vue-cli 打包编译 -webkit-box-orient: vertical 被删除解决办法
  • django发送邮件
  • mysql如何设置两个默认时间列
  • Linux运维命令总结
  • 统计学习方法概论---泛化能力
  • 8年软件测试工程师感悟——写给还在迷茫中的朋友
  • 航迹带您了解消防大队,培养消防意识,消除消防隐患
  • JavaScript的数据结构与算法(五) —— 集合
  • SQLServer之数据库行锁
  • 怎样将手机中的录音转换成文字
  • Java_第一次作业一稿修改建议
  • Lua rawget rawset newindex 函数定义和例子
  • Python学习手册之正则表达式和元字符
  • 如何用纯 CSS 创作一个变色旋转动画
  • $translatePartialLoader加载失败及解决方式
  • 《剑指offer》分解让复杂问题更简单
  • 【翻译】Mashape是如何管理15000个API和微服务的(三)
  • 【面试系列】之二:关于js原型
  • Android组件 - 收藏集 - 掘金
  • C++回声服务器_9-epoll边缘触发模式版本服务器
  •  D - 粉碎叛乱F - 其他起义
  • JS数组方法汇总
  • Redis提升并发能力 | 从0开始构建SpringCloud微服务(2)
  • vue从创建到完整的饿了么(18)购物车详细信息的展示与删除
  • vue和cordova项目整合打包,并实现vue调用android的相机的demo
  • 产品三维模型在线预览
  • 分布式任务队列Celery
  • 解析 Webpack中import、require、按需加载的执行过程
  • 前端面试总结(at, md)
  • 使用SAX解析XML
  • LevelDB 入门 —— 全面了解 LevelDB 的功能特性
  • mysql面试题分组并合并列
  • 基于django的视频点播网站开发-step3-注册登录功能 ...
  • 如何用纯 CSS 创作一个菱形 loader 动画
  • ​MySQL主从复制一致性检测
  • # Swust 12th acm 邀请赛# [ A ] A+B problem [题解]
  • #define用法
  • #我与虚拟机的故事#连载20:周志明虚拟机第 3 版:到底值不值得买?
  • (01)ORB-SLAM2源码无死角解析-(56) 闭环线程→计算Sim3:理论推导(1)求解s,t
  • (04)odoo视图操作
  • (09)Hive——CTE 公共表达式
  • (11)MSP430F5529 定时器B
  • (173)FPGA约束:单周期时序分析或默认时序分析
  • (附源码)ssm失物招领系统 毕业设计 182317
  • (附源码)计算机毕业设计SSM教师教学质量评价系统
  • (黑马出品_高级篇_01)SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式
  • (六)库存超卖案例实战——使用mysql分布式锁解决“超卖”问题
  • (学习日记)2024.04.04:UCOSIII第三十二节:计数信号量实验
  • (一)Linux+Windows下安装ffmpeg
  • (一)u-boot-nand.bin的下载
  • (一)插入排序
  • (原)Matlab的svmtrain和svmclassify
  • (转) ns2/nam与nam实现相关的文件
  • (转)MVC3 类型“System.Web.Mvc.ModelClientValidationRule”同时存在