詳解 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…