前面开发的发币的智能合约过于简单 ,缺点:
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