美文网首页EOSIO
【EOS快速入门】第六篇 智能合约eosio.token源码解读

【EOS快速入门】第六篇 智能合约eosio.token源码解读

作者: 海阳之新 | 来源:发表于2018-07-01 23:52 被阅读1201次

上一篇:【EOS快速入门】第五篇 创建EOS钱包、公私钥、合约、代币DEMO
下一篇:【EOS快速入门】第七篇 待定


简介

eosio.token是EOS官方提供了一个代币(资产)智能合约 Demo,这个示例合约给出了 EOS 官方智能合约开发的标准结构和开发方法,并且真正的 EOS 代币也会借鉴这个示例合约的逻辑,是EOS 智能合约入门的经典案例。

eosio.token 合约由三个文件(cpp,hpp,abi)文件组成,本篇文章将为大家讲解 eosio.token.hpp 文件。
源码文件地址:https://github.com/EOSIO/eos/tree/master/contracts/eosio.token
如果我们在本地有环境部署,那么通过cat contracts/eosio.token/eosio.token.hpp命令可以找到这个文件的C++源码,见文末附完整源码。

一、预处理指令 & 头文件

代码的开头声明了头文件,主要是 eos 智能合约的 API 库。

//预处理指令,防止文件被重复包含
#pragma once

//eos 资产(asset)头文件
#include <eosiolib/asset.hpp>
//eos 智能合约 API 库
#include <eosiolib/eosio.hpp>

二、创建代币函数

声明 create 函数,这个函数用来新建一种代币,并输入代币的各种属性,同时 create 函数也是一个 action。action 是 eos 智能合约的接口函数,定义外界可以对智能合约做什么动作。

//参数:发币者
void create( account_name issuer,
                      //资产最大数目
                      asset        maximum_supply,
                      //资产是否可以冻结
                      uint8_t      issuer_can_freeze,
                      //资产是否可以召回
                      uint8_t      issuer_can_recall,
                      //资产是否可以设置白名单
                      uint8_t      issuer_can_whitelist );

附完整源码:

/**
 *  @file
 *  @copyright defined in eos/LICENSE.txt
 */
#pragma once

#include <eosiolib/asset.hpp>
#include <eosiolib/eosio.hpp>

#include <string>

namespace eosiosystem {
   class system_contract;
}

namespace eosio {

   using std::string;

   class token : public contract {
      public:
         token( account_name self ):contract(self){}

         void create( account_name issuer,
                      asset        maximum_supply);

         void issue( account_name to, asset quantity, string memo );

         void transfer( account_name from,
                        account_name to,
                        asset        quantity,
                        string       memo );
      
      
         inline asset get_supply( symbol_name sym )const;
         
         inline asset get_balance( account_name owner, symbol_name sym )const;

      private:
         struct account {
            asset    balance;

            uint64_t primary_key()const { return balance.symbol.name(); }
         };

         struct currency_stats {
            asset          supply;
            asset          max_supply;
            account_name   issuer;

            uint64_t primary_key()const { return supply.symbol.name(); }
         };

         typedef eosio::multi_index<N(accounts), account> accounts;
         typedef eosio::multi_index<N(stat), currency_stats> stats;

         void sub_balance( account_name owner, asset value );
         void add_balance( account_name owner, asset value, account_name ram_payer );

      public:
         struct transfer_args {
            account_name  from;
            account_name  to;
            asset         quantity;
            string        memo;
         };
   };

   asset token::get_supply( symbol_name sym )const
   {
      stats statstable( _self, sym );
      const auto& st = statstable.get( sym );
      return st.supply;
   }

   asset token::get_balance( account_name owner, symbol_name sym )const
   {
      accounts accountstable( _self, owner );
      const auto& ac = accountstable.get( sym );
      return ac.balance;
   }

} /// namespace eosio

开发过以太坊ERC20代币的一定熟悉,ERC20规范了totalSupply(), balanceOf(), transfer(), transferFrom()等六个方法。eosio.token也做了类似规范,只要是create(),issue(),transfer()三个方法构造的代码,就是一个发币智能合约。


上一篇:【EOS快速入门】第五篇 创建EOS钱包、公私钥、合约、代币DEMO
下一篇:【EOS快速入门】第七篇 待定


更多技术讨论,请关注我们的知识星球:


相关文章

网友评论

    本文标题:【EOS快速入门】第六篇 智能合约eosio.token源码解读

    本文链接:https://www.haomeiwen.com/subject/vewoyftx.html