EOS数字资产合约实战(一) eosio.token.hpp解析

前面开发的发币的智能合约过于简单 ,缺点:
1、智能合约的拥有者发布资产,不能让别人(其他账户)通过这个合约发布资产。
2、能不能冻结别人的资产。
3、能不能为这个资产设置白名单。
4、能不能让黑名单的人不能接收这个资产。


//下面我们讲解一下EOS官方的比较完整的一个智能合约  eosio.token
路径是在     /home/yun/eos/contracts/eosi.token 
需求:
1、其他用户也可以使用同一个合约发资产。
2、可以冻结资产,或者可以设置白名单。
3、让不同的人发多种资产。


#pragma once


#include <eosiolib/eosio.hpp>    //大部分智能合约所要用到的接口库

#include <eosiolib/asset.hpp>   //定义了资产(数和量的资产  数:多少,  量:种类(ETH,BTC))

#include <string>

namespace eosiosystem {
   class system_contract;
}

namespace eosio {

   using std::string;
   
   class token : public contract {
    //类名不是很重要  ,智能合约的名字在eos系统是你 上传的时候 规定的这个智能合约属于哪个账户,这个智能合约就叫这个名字,和智能合约的类没有关系。
      public:
         token( account_name self ):contract(self){}
         //构造函数中要传进来这个智能合约的拥有者,还要初始化父类。(不用析构函数)
         void create( account_name issuer,
                      asset        maximum_supply,
                      uint8_t      issuer_can_freeze,
                      uint8_t      issuer_can_recall,
                      uint8_t     issuer_can_whitelist);
        //申明一个action(动作) ,让别人(账户)在我们的智能合约中创建一个资产。把资产数据保存到我们的智能合约的账户中。
        //别人就不需要为发一个资产再开发一个智能合约了,只需要在跑我们这个智能合约账户里面新建一个资产。
        //issuer  发币人     
        //maximum_supply  发币的最大量  
        //issuer_can_freeze  发币人是否冻结
        //issuer_can_recall  发币人是否可以召回
        //issuer_can_whitelist  发币人是否可以设置白名单, 有的币是发给特定的人。

        
         void issue( account_name to, asset quantity, string memo );
         //造币的方法
         //to  发给谁
         //quantity   发多少
         //mem   发行的时候的备注

         void transfer( account_name from,
                        account_name to,
                        asset        quantity,
                        string       memo );
      //转账的方法
      //from  谁转出来
      //to       转给谁
      //quantity   数量
      //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;
            bool frozen = false;
            bool whitelist =true;
            uint64_t primary_key()const { return balance.symbol.name(); }
         };
         //结构体存放每一个拥有这个合约里资产的人(账户)的资料(账户名,是不是被冻结了,是不是在白名单里,如果存在数据库里还需要一个主键primary_key)
        // balance   资产余额
        //froze     是否被冻结  默认否
        //whitelist  是否在白名单   默认是
        //primary_key   主键
        
        //资产的资料

         struct currency_stats {
            asset          supply;
            asset          max_supply;
            account_name   issuer;
            bool can_freeze =true;
            bool can_recall = true;
            bool can_whitelist=true;
            bool is_frozen=false;
            bool enforce_whitelist=false;
            uint64_t primary_key()const { return supply.symbol.name(); }
         };
         //  supply   供应量(供应了多少)
        //  max_supply   最大供应量
        //  issuer    资产发行人
        // can_freeze  能不能冻结  默认是
        // can_recall    能不能召回  默认是
        // can_whitelist  能不能设置白名单  默认是
        //  is_frozen  是不是已经被冻结   默认否  不冻结
        //  enforce_whitelist   是不是已经使用了白名单  默认否, 未使用白名单
        // primary_key  主键

        
        
        
        //eosio::multi_index 是在boost::multi_index的基础上开发的自己的multi_index,会用即可。
         typedef eosio::multi_index<N(accounts), account> accounts;   //资产持有人列表类型
         typedef eosio::multi_index<N(stat), currency_stats> stats;   //资产列表类型
         //定义资产持有人资料和资产的资料放到multi_index 列表里,方便增删改查。
         
         
         //减资产

         void sub_balance( account_name owner, asset value, const currency_stats& st );
         //owner 资产的拥有者 
          // value  减少的资产值
          //st   该资产目前的状态
          

          
         //增加资产
         void add_balance( account_name owner, asset value,const currency_stats& st, account_name ram_payer );
         //owner  资产的拥有者
         //value   增加的资产值
         //st         该资产的目前的状态
         //ram_payer  为这个活动支付拥有系统内存的人, 在EOS系统中,智能合约处理数据的时候,是要占用系统内存的。这个系统内存空间是谁提供的呢?所以要定义一个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

猜你喜欢

转载自blog.csdn.net/akai9898/article/details/81875281
今日推荐