詳解 EOS 智能合約的 hpp 文件
爲了幫助你們熟悉 EOS 智能合約,EOS 官方提供了一個代幣(資產)智能合約 Demo —— eosio.token。eosio.token 智能合約目前還不是特別完善,個別功能尚未完成。但這個示例合約給出了 EOS 官方智能合約開發的標準結構和開發方法,而且真正的 EOS 代幣也會借鑑這個示例合約的邏輯,是 EOS 智能合約入門的經典案例。git
照例,eosio.token 合約由三個文件(cpp,hpp,abi)文件組成,本篇文章將爲你們講解 eosio.token.hpp 文件。原文件地址:https://github.com/EOSIO/eos/tree/master/contracts/eosio.tokengithub
代碼的開頭聲明瞭頭文件,主要是 eos 智能合約的 API 庫。segmentfault
//預處理指令,防止文件被重複包含 #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){}
聲明 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 來得到代幣。區塊鏈
//參數:接收新代幣帳戶,新增多少代幣,memo void issue( account_name to, asset quantity, string memo );
聲明 transfer 函數,這個函數用來轉帳,是代幣智能合約最經常使用的函數。ui
//發送帳戶 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 );
【許曉笛】 EOS 智能合約案例解析(2)
【許曉笛】 EOS 智能合約案例解析(3)繼承
圓方圓學院聚集大批區塊鏈名師,打造精品的區塊鏈技術課程。 在各大平臺都長期有優質免費公開課,歡迎報名收看。