1. 程式人生 > >EOS智能合約案例解析(1)

EOS智能合約案例解析(1)

EOS智能合約

為了幫助大家熟悉 EOS 智能合約,EOS 官方提供了一個代幣(資產)智能合約 Demo —— eosio.token。eosio.token 智能合約目前還不是特別完善,個別功能還沒有完成。但這個示例合約給出了 EOS 官方智能合約開發的標準結構和開發方法,並且真正的 EOS 代幣也會借鑒這個示例合約的邏輯,是 EOS 智能合約入門的經典案例。

照例,eosio.token 合約由三個文件(cpp,hpp,abi)文件組成,本篇文章將為大家講解 eosio.token.hpp 文件。原文件地址:https://github.com/EOSIO/eos/tree/master/contracts/eosio.token

預處理指令 & 頭文件

代碼的開頭聲明了頭文件,主要是 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 );


EOS智能合約案例解析(1)