EOS 智能合约案例解析(3)

详解 EOS 智能合约的 abi 文件

这次向大家介绍 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 官方还在开发中。

原文地址:http://blog.51cto.com/13625500/2119077

时间: 2024-08-30 14:06:58

EOS 智能合约案例解析(3)的相关文章

EOS智能合约案例解析(1)

为了帮助大家熟悉 EOS 智能合约,EOS 官方提供了一个代币(资产)智能合约 Demo -- eosio.token.eosio.token 智能合约目前还不是特别完善,个别功能还没有完成.但这个示例合约给出了 EOS 官方智能合约开发的标准结构和开发方法,并且真正的 EOS 代币也会借鉴这个示例合约的逻辑,是 EOS 智能合约入门的经典案例. 照例,eosio.token 合约由三个文件(cpp,hpp,abi)文件组成,本篇文章将为大家讲解 eosio.token.hpp 文件.原文件地址

EOS 智能合约案例解析(2)

详解 EOS 智能合约的 cpp 文件 之前的文章介绍了 eosio.token 智能合约的 hpp 文件,这次向大家介绍 eosio.token.cpp 文件,cpp 文件即 C++ 代码文件,智能合约所有的业务逻辑内容都是在 cpp 文件中实现的. eosio.token.cpp 文件地址: https://github.com/EOSIO/eos/blob/master/contracts/eosio.token/eosio.token.cpp 了解 C/C++ 开发的同学肯定熟悉,cpp

EOS智能合约开发(三):EOS创建和管理账号

没有看前面文章的小伙伴可以看一下 EOS智能合约开发(一):EOS环境搭建和启动节点 EOS智能合约开发(二):EOS创建和管理钱包 创建好钱包.密钥之后,接下来你就可以创建账号了,账号是什么?账号保存在区块链上的人类可读的标志符. 创建账号的命令: $ cleos createaccount eosio ${new_account} ${owner_key} ${active_key} 其中eosio是超级用户,需要靠超级用户来创建其它的新用户,eosio后面就是你的新用户的用户名. 除了新的

【刘文彬】【精解】EOS智能合约演练

原文链接:醒者呆的博客园,https://www.cnblogs.com/Evsward/p/eos-contract.html EOS,智能合约,abi,wasm,cleos,eosiocpp,开发调试,钱包,账户,签名权限 热身 本文旨在针对EOS智能合约进行一个完整的实操演练,过程中深入熟悉掌握整个EOS智能合约的流程,过程中出现的问题也会及时研究并入我们自己的知识体系.本文会主要跟随EOS官方Wiki的智能合约部分进行研究学习,主要分为 开启一个私有链 创建钱包 载入基础IO的智能合约支

【精】EOS智能合约:system系统合约源码分析

系统合约在链启动阶段就会被部署,是因为系统合约赋予了EOS链资源.命名拍卖.基础数据准备.生产者信息.投票等能力.本篇文章将会从源码角度详细研究system合约. 关键字:EOS,eosio.system,智能合约,name类型,native.hpp,newaccount,bidname,core token init,onblock,更新已入选生产节点 eosio.system 概览 笔者使用的IDE是VScode,首先来看eosio.system的源码结构.如下图所示. 本文分析的源码来自于

eos智能合约开发最佳实践

安全问题 1.可能的错误 智能合约终止 限制转账限额 限制速率 有效途径来进行bug修复和提升 2.谨慎发布智能合约 对智能合约进行彻底的测试 并在任何新的攻击手法被发现后及时制止 赏金计划和审计合约 3.合约的简介 确保智能合约逻辑简单 确保合约和函数模块化 4.保持更新 在任何新发现的漏洞之前进行修复 利用最新技术 5.潜在特性 可能会调用同名函数 漏洞 溢出漏洞 typedef struct acnts { account_name name0; account_name name1; a

以太坊去中心化淘宝智能合约案例

篇文章我们来介绍一个简易的区块链电商系统的核心功能,10多年来,我们习惯了淘宝的电商模式,淘宝为电商在中国普及做出了突出贡献,值得肯定,也完成了历史使命. 淘宝模式的核心是什么? 免费是一方面,我认为最核心的是解决了网上交易买卖家的信任问题,通过支付宝作为资金中介,使买卖家可以放心的交易. 但是,淘宝迅速崛起为巨头后,交易环节出现了很多不好的现象:刷信誉.巨大经济利益带来的内部腐败等等.因此,淘宝虽然成为了电商巨头,但是却没有真正的解决电商产业的信誉问题.这个问题其实不是淘宝特有,是一种社会现象

智能合约bug以及修改方案

截取两篇文章:第一遍文章说的是智能合约能不能修改的问题: ETC转到ETH地址以及转币进ETH智能合约账户能不能转出来? 第0章 引言 如果ETC充值到了ETH地址上,能找回来吗?答案是不一定. ETH转到别的ETH地址上,也是有可能再也弄不出来的. 第1章 以太坊的两类账户 以太坊有两类账户,外部账户和合约账户. 外部账户是由公钥和私钥组成的.我们绝大多数用户生产的以太坊钱包都属于这一类账户,私钥可以决定这个账户里的币,包括以太坊和ERC20币. 合约账户是由一个地址和对应存储的一些代码组成的

十分钟部署智能合约

eos环境搭建 1.git clone源代码 git clonehttps://github.com/EOSIO/eos --recursive 2.下载编译之后,里面有三个应用程序,这三个应用程序也都是命令行的: 1.Cleos: 2.Nodeos: 3.Keosd. 这三个应用程序之间有什么关系呢?我们现在使用的前端,怎么使用EOS呢? -Cleos,它是一个命令行程序.在前端使用EOS是通过Cleos输入命令,给EOS下达指令. -Nodeos,其实它就是挖矿客户端.在启动Nodeos之后