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

詳解 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){}

建立代幣函數(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 函數,這個函數用來轉帳,是代幣智能合約最經常使用的函數。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)繼承

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

公開課地址:https://ke.qq.com/course/345101

相關文章
相關標籤/搜索