詳解 EOS 智慧合約的 hpp 檔案
為了幫助大家熟悉 EOS 智慧合約,EOS 官方提供了一個代幣(資產)智慧合約 Demo —— eosio.token。eosio.token 智慧合約目前還不是特別完善,個別功能還沒有完成。但這個示例合約給出了 EOS 官方智慧合約開發的標準結構和開發方法,並且真正的 EOS 代幣也會借鑑這個示例合約的邏輯,是 EOS 智慧合約入門的經典案例。
照例,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>
複製程式碼
建構函式
智慧合約的類名可以與智慧合約名不同,智慧合約的名字是其賬戶名。建構函式為空,引數為智慧合約賬戶名。
//每個智慧合約類都要繼承 contract 類
class token : public contract {
public:
//類建構函式
token( account_name self ):contract(self){}
複製程式碼
建立代幣函式(action)
宣告 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 );
複製程式碼
增發代幣函式(action)
宣告 issue 函式,這個函式用來增發代幣,eosio.token 合約並不是新建了代幣就會得到代幣,新建的代幣只是儲存了資料,發幣者要想獲取代幣,需要呼叫 issue action 來獲得代幣。
//引數:接收新代幣賬戶,新增多少代幣,memo
void issue( account_name to, asset quantity, string memo );
複製程式碼
轉賬函式(action)
宣告 transfer 函式,這個函式用來轉賬,是代幣智慧合約最常用的函式。
//傳送賬戶
void transfer( account_name from,
//接收賬戶
account_name to,
//代幣數量
asset quantity,
//memo
string memo );
複製程式碼
私有資料結構
智慧合約需要儲存每種代幣的資料,還要儲存每個賬戶持有每種代幣的數量。
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…