EOS開發入門


EOS開發入門



  在上一篇文章《EOS開發環境搭建》中,我們已經完成了EOS開發環境的搭建,本次為大家帶來的是EOS開發入門的相關內容。

1. EOS的合約開發基礎

  智能合約是一種旨在以信息化方式傳播、驗證或執行合同的計算機協議。智能合約允許在沒有第三方的情況下進行可信交易,這些交易可追蹤且不可逆轉。

1.1 所需知識

  • 熟悉或了解C++14的基本語法,這部分技能需要掌握,短時間內無法搞定。
  • 了解abi(The Application Binary Interface)文件,基於json格式的,描述合約的接口

1.2 c++與智能合約部分語法

  • require_auth——
    require_auth(name user): 驗證用戶是否有簽名
  • [[eosio::action]] action聲明的特殊標記
  • asset 是eos官方提供的一個結構體,內部主要有2個元素:amountsymbol
  • eosio_assert( expr, "errmsg" ) 驗證表達式是否位置,類似於以太坊的assert
  • [[eosio::table]] table聲明的特殊標記,在結構體聲明中使用
  • multi_index 是eos提供的一個數據庫存儲結構,可以支持多個索引,同樣有增刪改查接口
struct [[eosio::table]] task {
         uint64_t    taskID;
         name        creator; 
         name        worker;
         asset       bonus;
         uint8_t     status = 0;
         string      remark;
         string      comment;

         uint64_t primary_key()const { return taskID; }
      };

      typedef eosio::multi_index< "tasks"_n, task > tasks;
      //tasks 是最終的表名字,task是結構體名字
  • multi_index可以使用 findemplacemodifyearse四個接口,使用時需要先用tasks定義變量
tasks tk( _code, _code.value );

    tk.emplace( creator, [&](auto &t){
        t.creator = creator;
        t.worker  = worker;
        t.taskID  = tk.available_primary_key();//主鍵自動增長
        t.bonus   = taskBonus;
        t.remark  = memo;
    });

1.3 理解abi文件

  這是一個空的abi文件

{
   "version": "eosio::abi/1.0",
   "types": [],
   "structs": [],
   "actions": [],
   "tables": [],
   "ricardian_clauses": [],
   "abi_extensions": [],
   "___comment" : ""
}
  • types 新類型定義
  • structs 合約內結構體定義
  • actions 合約內動作定義,注意在合約中需要使用特殊的標記才能在abi中得到
  • tables 合約內表結構定義,注意在合約中需要使用特殊的標記才能在abi中得到
  • ricardian_clauses 李嘉圖條款
  • abi_extensions 擴展

  其中structsactionstables可以認為是abi文件的三要素,每個合約內可以有多個action,每個action會執行這樣那樣的邏輯,需要借助結構體的結構將信息存儲或變更保存在區塊鏈中,這個保存的數據我們類比為傳統數據庫中的表,也就是tables。我們學習智能合約編寫主要要寫什么?其實就是寫一個一個action,類似於rpc中的微服務。與傳統數據庫編程一樣,我們同樣也是圍繞着table做增刪改查操作。

2. EOS的hello智能合約

2.1 編寫hello合約

  • 合約代碼如下
#include <eosiolib/eosio.hpp>
#include <eosiolib/print.hpp>

using namespace eosio;

class hello : public contract {
  public:
      using contract::contract;

      [[eosio::action]]
      void hi( name user ) {
         print( "Hello, ", user);
      }
};

EOSIO_DISPATCH( hello, (hi))

上例中hello是我們的類名,需要繼承eos為我們提供的基類contract,[[eosio::action]]是一個特殊用法,定義一個action必須在函數聲明前加上此標記。hi這個函數就是一個 action,本例實現的就是一個打招呼的action,根據輸入的不同用戶進行打招呼。

EOSIO_DISPATCH( hello, (hi)) 是生成action的關鍵,EOSIO_DISPATCH是eos提供的宏,hello顯然就是類名,(hi)就是要生成的action,如果多個action,采用相同格式在后面添加。

2.2 hello合約的部署和調用

  • 使用eosio-cpp編譯hello合約,這個就來自於cdt工具包
eosio-cpp -o hello.wasm hello.cpp --abigen

image

  • 創建hello合約賬戶
cleos create account eosio hello YOUR_PUBLIC_KEY -p eosio@active
  • 部署hello合約
cleos set contract hello ./hello -p hello@active

image

  • 調用hello合約
//先創建一個普通賬戶bob
cleos create account eosio bob YOUR_PUBLIC_KEY -p eosio@active
//bob調用hello合約的hi動作
cleos push action hello hi '["bob"]' -p bob@active

image

  到這一步,一個簡單的hello智能合約就部署並調用完成了,快來試試吧。下次將為大家分享關於EOS開發實戰的內容,敬請關注。




image


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM