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

詳解 EOS 智能合約的 hpp 文件git

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

照例,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>
複製代碼

構造函數

智能合約的類名能夠與智能合約名不一樣,智能合約的名字是其帳戶名。構造函數爲空,參數爲智能合約帳戶名。post

//每一個智能合約類都要繼承 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 來得到代幣。ui

//參數:接收新代幣帳戶,新增多少代幣,memo
         void issue( account_name to, asset quantity, string memo );
複製代碼

轉帳函數(action)

聲明 transfer 函數,這個函數用來轉帳,是代幣智能合約最經常使用的函數。spa

//發送帳戶
         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)

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

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

相關文章
相關標籤/搜索