详解 EOS 智能合约的 hpp 文件git
为了帮助你们熟悉 EOS 智能合约,EOS 官方提供了一个代币(资产)智能合约 Demo —— eosio.token。eosio.token 智能合约目前还不是特别完善,个别功能尚未完成。但这个示例合约给出了 EOS 官方智能合约开发的标准结构和开发方法,而且真正的 EOS 代币也会借鉴这个示例合约的逻辑,是 EOS 智能合约入门的经典案例。github
照例,eosio.token 合约由三个文件(cpp,hpp,abi)文件组成,本篇文章将为你们讲解 eosio.token.hpp 文件。原文件地址:github.com/EOSIO/eos/t…数据结构
代码的开头声明了头文件,主要是 eos 智能合约的 API 库。函数
//预处理指令,防止文件被重复包含
#pragma once
//eos 资产(asset)头文件
#include <eosiolib/asset.hpp>
//eos 智能合约 API 库
#include <eosiolib/eosio.hpp>
复制代码
智能合约的类名能够与智能合约名不一样,智能合约的名字是其帐户名。构造函数为空,参数为智能合约帐户名。post
//每一个智能合约类都要继承 contract 类
class token : public contract {
public:
//类构造函数
token( account_name self ):contract(self){}
复制代码
声明 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 );
复制代码
声明 issue 函数,这个函数用来增发代币,eosio.token 合约并非新建了代币就会获得代币,新建的代币只是存储了资料,发币者要想获取代币,须要调用 issue action 来得到代币。ui
//参数:接收新代币帐户,新增多少代币,memo
void issue( account_name to, asset quantity, string memo );
复制代码
声明 transfer 函数,这个函数用来转帐,是代币智能合约最经常使用的函数。spa
//发送帐户
void transfer( account_name from, //接收帐户 account_name to, //代币数量 asset quantity, //memo string memo );
复制代码
智能合约须要存储每种代币的资料,还要存储每一个帐户持有每种代币的数量。code
private:
//account 结构体,单个记录帐户存储单个代币的状况
struct account {
//资产余额
asset balance;
//帐户是否冻结
bool frozen = false;
//帐户是否在白名单
bool whitelist = true;
//设置帐户主键为代币名称
uint64_t primary_key()const { return balance.symbol.name(); }
};
//currency_stats 结构体,记录当代币状态信息
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(); }
};
//设置一个multi_index类型,存储 account 结构体
typedef eosio::multi_index<N(accounts), account> accounts;
//设置一个multi_index类型,存储 currency_stats 结构体
typedef eosio::multi_index<N(stat), currency_stats> stats;
复制代码
合约公有两个私有函数,分别是给帐户增长某种资产,和给帐户减小某种资产。视频
//增长资产函数:帐户,增长数量,代币状态结构体
void sub_balance( account_name owner, asset value, const currency_stats& st );
//减小资产函数:帐户,减小数量 ,代币状态结构体
void add_balance( account_name owner, asset value, const currency_stats& st, //ram 资源支付者 account_name ram_payer );
复制代码
限于篇幅,还有两部分,将在下面的文章中继续和你们探讨。
圆方圆学院聚集大批区块链名师,打造精品的区块链技术课程。 在各大平台都长期有优质免费公开课,欢迎报名收看。
公开课地址:ke.qq.com/course/3451…