【許曉笛】 EOS智慧合約案例解析(1)

圓方圓區塊鏈發表於2018-11-14

詳解 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 );

複製程式碼

限於篇幅,還有兩部分,將在下面的文章中繼續和大家探討。


相關文章和視訊推薦

【許曉笛】 EOS 智慧合約案例解析(2)

圓方圓學院彙集大批區塊鏈名師,打造精品的區塊鏈技術課程。 在各大平臺都長期有優質免費公開課,歡迎報名收看。

公開課地址:ke.qq.com/course/3451…

相關文章