Daniel Larimer 在他的博客介绍了EOS新的智能合约架构(EOS团队的开发速度实在是太吓人,根本追不上)。他给出了最简单的一个新币种的智能合约代码,仅有49行就能完成一个新币种的开发,一个新的“爱息欧”就诞生了让。我们一步一步实现吧。

首先实现私有成员,建立一个 account 结构体,这个结构体里保存的是所有持有我们这种代币的人的账户和余额。

   private:
//account 结构体
struct account {//EOS 账户名account_name owner;
//余额
uint64_t     balance;
//主键
uint64_t primary_key()const { return owner; }

下一步 我们要利用 Boost 库中的多索引列表,将上面声明的结构体放入一个列表中,方便查询和修改。

      eosio::multi_index<N(accounts), account> _accounts;

接着,实现 add_balance() 函数,这个私有函数的目的是给特定的 EOS 账户增加特定的代币。

      void add_balance( account_name payer, account_name to, uint64_t q ) {
//在列表中查询,看要收币的用户是否已经在列表中。
auto toitr = _accounts.find( to );
//如果不在列表中,说明用户从未持有过这种币,要将用户加入列表
if( toitr == _accounts.end() ) {
//增加一个用户_accounts.emplace( payer, [&]( auto& a ) {a.owner = to;
//因为之前没有这种币,用户名下的余额为要接收的数量a.balance = q;});
//如果用户在列表中,说明已经持有或持有过这种币} else {_accounts.modify( toitr, 0, [&]( auto& a ) {
//直接将余额增加要转入的数量a.balance += q;
//判断用户余额是否溢出(余额增加了q,之后数量应该大于q)eosio_assert( a.balance >= q, "overflow detected" );});}}

之后就要实现公有方法了,首先是构造函数,别忘了初始化 _accounts 列表。

  public:simpletoken( account_name self ):contract(self),_accounts( _self, _self){}

实现公有的 transfer(转账)函数,将代币从一个账户转移到另一个账户。

      void transfer( account_name from, account_name to, uint64_t quantity ) {
//从付款方获取权限require_auth( from );
//从列表中搜索发币方账户
const auto& fromacnt = _accounts.get( from );
//验证付款方余额,是否透支eosio_assert( fromacnt.balance >= quantity, "overdrawn balance" );
//从付款方减去代币_accounts.modify( fromacnt, from, [&]( auto& a ){ a.balance -= quantity; } );
//收款方增加代币(之前实现的私有函数)add_balance( from, to, quantity );}

OK,是不是以为大功告成了?还有最重要的 issue(发行)函数,要不从哪“印钱?”

      void issue( account_name to, uint64_t quantity ) {
//得到合约主人的权限require_auth( _self );
//直接印钱add_balance( _self, to, quantity );

最后一步,将我们的 transfer 和 issue 函数接口提供给 EOS 系统,通过一个宏就可以快速实现。

EOSIO_ABI( simpletoken, (transfer)(issue) )

这个宏是咋回事?我们看看 dispacher.hpp 文件中对这个宏的定义,其实是替开发者实现了 apply 函数,使得开发者可以专注于业务逻辑。

#define EOSIO_ABI( TYPE, MEMBERS ) \
extern "C" { \void apply( uint64_t receiver, uint64_t code, uint64_t action ) { \auto self = receiver; \
if( code == self ) { \TYPE thiscontract( self ); \switch( action ) { \EOSIO_API( TYPE, MEMBERS ) \} \eosio_exit(0); \} \} \
} \

大功告成,看看全部的代码吧,是不是49行就搞定了?不过 EOS 表示以后会有系统的标准代币,连以上的具体逻辑都不用我们实现了,不过这段代码对系统学习 EOS 智能合约架构还是很有意义的。

#include <eosiolib/eosio.hpp>class simpletoken : public eosio::contract {
public:simpletoken( account_name self ):contract(self),_accounts( _self, _self){}void transfer( account_name from, account_name to, uint64_t quantity ) {require_auth( from );const auto& fromacnt = _accounts.get( from );eosio_assert( fromacnt.balance >= quantity, "overdrawn balance" );_accounts.modify( fromacnt, from, [&]( auto& a ){ a.balance -= quantity; } );add_balance( from, to, quantity );}void issue( account_name to, uint64_t quantity ) {require_auth( _self );add_balance( _self, to, quantity );}private:
struct account {account_name owner;
uint64_t     balance;uint64_t primary_key()const { return owner; }};eosio::multi_index<N(accounts), account> _accounts;void add_balance( account_name payer, account_name to, uint64_t q ) {
auto toitr = _accounts.find( to );
if( toitr == _accounts.end() ) {_accounts.emplace( payer, [&]( auto& a ) {a.owner = to;a.balance = q;});} else {_accounts.modify( toitr, 0, [&]( auto& a ) {a.balance += q;eosio_assert( a.balance >= q, "overflow detected" );});}}
};EOSIO_ABI( simpletoken, (transfer)(issue) )

----------

相关文章和视频推荐

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

圆方圆学院汇集大批区块链名师,打造精品的区块链技术课程。
许晓笛老师的CSDN学院视频专栏:https://edu.csdn.net/lecturer/2008
郭金宏老师的csdn学院视频专栏:https://edu.csdn.net/lecturer/2214

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

【许晓笛】49行代码就能发币?而且EOS连例子都给你了相关推荐

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

    详解 EOS 智能合约的 hpp 文件 为了帮助大家熟悉 EOS 智能合约,EOS 官方提供了一个代币(资产)智能合约 Demo -- eosio.token.eosio.token 智能合约目前还不 ...

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

    详解 EOS 智能合约的 cpp 文件 之前的文章介绍了 eosio.token 智能合约的 hpp 文件,这次向大家介绍 eosio.token.cpp 文件,cpp 文件即 C++ 代码文件,智能 ...

  3. 【许晓笛】别傻了,瀑布到来时,一句口号根本守不住你的币

    我一直坚持的一个观点是,在投资区块链资产之前,一定要对区块链底层技术有所了解,对技术原理有所认同,才能放心地投入真金白银.如果只是人云亦云,天天跟着"大神"喊者什么"十倍 ...

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

    详解 EOS 智能合约的 hpp 文件 为了帮助大家熟悉 EOS 智能合约,EOS 官方提供了一个代币(资产)智能合约 Demo -- eosio.token.eosio.token 智能合约目前还不 ...

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

    详解 EOS 智能合约的 cpp 文件 之前的文章介绍了 eosio.token 智能合约的 hpp 文件,这次向大家介绍 eosio.token.cpp 文件,cpp 文件即 C++ 代码文件,智能 ...

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

    为了帮助大家熟悉 EOS 智能合约,EOS 官方提供了一个代币(资产)智能合约 Demo -- eosio.token.eosio.token 智能合约目前还不是特别完善,个别功能还没有完成.但这个示 ...

  7. 【许晓笛】EOS 什么是智能合约(3)

    详解 EOS 智能合约的 abi 文件 这次向大家介绍 eosio.token 智能合约的最后一个文件 -- abi文件.ABI 全称 Application Binary Interface,中文名 ...

  8. 【许晓笛】EOS 超级节点的五个使命

    在EOS系统中,有"两股势力"是整个系统最关键的因素,那就是项目方和见证人.很多人觉得EOS这个项目"奇葩",就奇葩在项目方和见证人的关系上.EOS的项目方是B ...

  9. Python3,2行代码添加水印,发朋友圈,图片再也不怕被盗了!!!

    2行代码添加水印 1.引言 2.filestools介绍 2.1 安装 2.2 filestools 功能介绍 2.3 watermarker模块介绍 2.3 代码实例 1.引言 小屌丝:鱼哥,这个周 ...

最新文章

  1. Java虚拟机2:Java 运行时数据区
  2. 石家庄市职称计算机,河北石家庄2010年职称计算机考试报名通知
  3. Ubuntu字符界面输入密码始终提示错误 login incorrect 解决办法
  4. 搜索引擎学习(一)初识Lucene
  5. linux 查看java cpu_Linux查看CPU和内存使用情况
  6. LeetCode 713. 乘积小于K的子数组(滑动窗口)
  7. MySQL之逻辑架构和存储引擎
  8. Adobe Photoshop源代码以及3800万用户信息泄漏
  9. 维、哈、柯文字符代码及键盘标准
  10. 哲学与科学的批判性思维工具
  11. 数据库如何执行sql语句
  12. 人月神话札记:系统设计
  13. 7-3 作业调度算法--高响应比优先
  14. 品牌,来1TB反向传播?
  15. 视频会议中的AEC、AGC、ANS是什么?
  16. Tracup丨产品管理与项目管理的区别
  17. Maven Docker几个插件打包+推送到镜像仓库或者私服(Harbor)的方法
  18. 置液晶显示器的台式计算机,台式电脑液晶显示器的底座的制作方法
  19. java设计模式之中介者模式(Mediator)
  20. matlab归一化和标准化

热门文章

  1. BIOS内部模块详解
  2. 计算机键盘键盘一个按键坏了,我的世界:如果键盘坏掉一个键,六种情况,哪个会影响你玩MC?...
  3. 基于51单片机的多路温度检测调节串口传输系统
  4. explicit的作用
  5. 怎么自定义PPT幻灯片大小
  6. PyTorch中的topk函数详解
  7. 实现微信通知提醒的方法总结
  8. C++学习笔记(六)
  9. javase笔记基础篇
  10. 【学习笔记】SQL数据库