EOS開發(1.3-1.4)以上版本 智慧合約DAPP全棧使用指南

weixin_34249678發表於2018-10-27

前言

時間 2018-10-26
EOS 1.4.1 github連結
EOS-CDT 1.3.2 github連結
注:
1 本文針對 對EOS稍微有一點基礎的以及從ETH轉EOS開發的開發者,會在測試網路jungle中進行除錯,從建立賬號開始一直介紹到部署合約以及合約中轉賬和許可權等問題,本文會同步更新。因為eos專案更新較為頻繁,並且eos智慧合約的c++語法庫最近有變化,因此使用最新的版本來開始做示例。
2 任何疑問可以新增文末的微信以及知識星球,我們是專業的開發討論組

一、使用工具和前序教程介紹 (部分基礎步驟省略)

1 git clone EOS官方庫 並按提示編譯專案得到 $ cleos 等命令 (該命令用來做參與查詢以及部署合約上鍊的操作)
2 強烈建議 參考官方的【getting start】 因為網上的教程基本都是搬運的這裡。
3 git clone EOSCDT-合約工具庫 編譯專案得到$ eosio-cpp命令 用來編譯合約成abi等檔案。
4 如果已經有了eos舊版本的合約編寫經驗,可以參考 新舊版本區別
5 EOS前序教程及筆記

二、建立賬號(建立jungle測試節點賬號以及如何使用scatter外掛)

A 建立一個eos賬號

1 進入 JUNGLE測試節點官網地址 (jungle 類似以太坊中的kovan等測試節點)

2846016-a98a352d27823bca.png
image.png

2 用cleos 建立祕鑰對 (公鑰和私鑰)

注:eos的賬號一般是12個字元(a-z,1-5)組成,可以加小數點. 組成,每一個賬號需要兩個祕鑰對來支援: 一個作為active,一個作為owner,可以理解為一個賬號有兩個子賬號,許可權不同而已,當然兩個子賬號可以使用同樣的祕鑰對,這樣簡單但是會有一點風險。每一筆交易都需要指定一個子賬號作為發起者 一般用active許可權的就夠了。我們下面所有的操作都使用以下這一個祕鑰對來做介紹。

$ cleos create key --to-console
Private key: 5K9fLKJ6K9ivadLASiXG8oS5qYsUdb2JP8ZNwK7phEi93hFLRTU
Public key: EOS5hSo21o6VXdZ4SM7UXv7u3uiVZ6oeVU7wxfWsxoQ5DFzVNAcRs

3 在jungle介面 選擇 建立賬號。


2846016-dfa5b0e0615c1a84.png
image.png

4 輸入一個符合要求的賬戶名(注意 這個以後就是你的eos轉賬地址了,類似以太坊的錢包地址)
【本文以【abcdefg12345】為例】

5 輸入公鑰 publickey(兩個輸入框都填入public key! 私鑰後面會用到 僅僅用來匯入錢包!) 點選建立賬號

6 如無意外 賬號已經建立成功,可以點選 account info 檢視是否建立成功

7 點選faucet 輸入賬號 能夠獲取測試用的100eos。

B 匯入scatter

1 scatter下載

使用chrome瀏覽器,下載scatter外掛。初次進入需要輸入密碼等操作,進入之後可以在設定中將語言調整為中文。


2846016-dab21218e688593a.png
image.png

2 將jungle網路加入scatter

設定-> 網路 -> 新建
在需要填寫的空白處填入以下內容 然後儲存
域名: jungle.eosio.cr
埠: 443
chainid: 038f4b0fc8ff18a4f0842a8f0564611f6e96e8535901dd45e43ac8691a1c4dca


2846016-cc888587458d15b3.png
image.png

3 匯入祕鑰對

點選 -> 祕鑰對 -> 新建
隨意輸入一個名稱jungletest 以及私鑰(輸入私鑰後 公鑰會自動出來)

4 匯入身份

點選 -> 身份 -> 新建
選擇剛剛匯入的 jungle 網路 和 祕鑰對jungletest
點選匯入 會等待幾秒後 出現 兩個賬戶名(xxx@active 和 xxx@owner)
選擇一個賬戶之後 儲存。
身份已經匯入成功。

三、合約編編寫 (C++語法以及合約基礎架構不知道請事先了解或看前序教程筆記)

1 helloworld 示例
2 語法重點部分 (只介紹部分語法)。

(a). 新版的修改有很多 例如 account_name 型別 symbol型別的變化等等 可以看上面的新舊版本區別
(b). 程式入口 這是一個模板 ,類似路由 可以直接使用

extern "C"
{
    void apply(uint64_t receiver, uint64_t code, uint64_t action)
    {
        print(name{receiver}, name{code}, name{action});
        if (code == receiver)
        {
            switch (action)
            {
                EOSIO_DISPATCH_HELPER(examplecontractname, (func1)(func2))
            }
        }
        else if (code == "eosio.token"_n.value && action == "transfer"_n.value)
        {
            execute_action(name(receiver), name(code), &examplecontractname::transfer);
        }
    }
};

(c) Multi Index table 結構

struct [[eosio::table]] bet
    {
        uint64_t key;
        uint64_t level;
        name player;
        int result;
        uint64_t primary_key() const { return key; }
        uint64_t by_level() const { return level; }
        EOSLIB_SERIALIZE( bet, (key)(level)(player)(result) )
    };

typedef eosio::multi_index<name("bet"), bet, indexed_by<name("level"), const_mem_fun<cbet, uint64_t, &cbet::by_level>>> betting;
betting _bets;

(d) transfer方法rewrite (這一段是手寫, 基本用法應該都在裡面)

ACTION transfer(name from, name to, asset quantity, string memo)
    {
        require_auth(from);
        eosio_assert(quantity.is_valid(), "Invalid token transfer...");
        eosio_assert(quantity.symbol == EOS_SYMBOL, "only EOS token is allowed");
        eosio_assert(quantity.amount > 0, "must buy a positive amount");

        print("\n ontransfer from:", from, " to:", to, " quantity:", quantity, " memo:", memo);
        if (to != _self)
            return;

        // 查詢 根據第二索引
        auto level_index = _currentbets.get_index<name("level")>();
        uint32_t findindex = quantity.amount;
        auto itr = level_index.find(findindex);
        if (itr != level_index.end())
        {
               // 儲存
                _bets.emplace(get_self(), [&](auto &p) {
                    p.key = _bets.available_primary_key();
                    p.level = itr->level;
                    p.player = itr->player;
                    p.result = res;
                });

                // 修改
               level_index.modify(itr, get_self(), [&](auto &p) {
                    p.player1 = iname;
                    p.player2 = iname;
                    p.invest = 0;
          });
         
          // 轉賬 
          asset reward(amount, quantity.symbol);
          action(
                    permission_level{get_self(), "active"_n},
                    "eosio.token"_n,
                    "transfer"_n,
                    std::make_tuple(get_self(), to, reward, std::string("reward")))
                    .send();
        }
    };
3 當你寫好你的邏輯之後 使用編譯命令可以得到 abi檔案 example.abi
$ eosio-cpp -I include -o example.wasm example.cpp --abigen

四 部署合約 及相關命令

1 先要 為賬戶購買RAM 以及cpu 和net (命令使用-u 來遠端連線jungle節點)

#抵押EOS追加網路和CPU資源
$ cleos system delegatebw <本人賬戶名> <代幣發行賬戶名>  '0.1 EOS'  '1 EOS'
$ cleos -u http://jungle.cryptolions.io:18888 system delegatebw abcdefg12345 abcdefg12345  '0.1 EOS'  '1 EOS'

#購買記憶體資源
$ cleos system buyram <本人賬戶名> <代幣發行賬戶名>  '1 EOS'
$ cleos -u http://jungle.cryptolions.io:18888 system buyram abcdefg12345 abcdefg12345 '1 EOS'

2 部署合約

$ cleos -u http://jungle.cryptolions.io:18888 set contract example /work/dapp/eosproject/example -p abcdefg12345@active

3 發起轉賬action

注:dapp應用或遊戲 很多靠轉賬的介面transfer 這個介面可以看成是合約固定的介面,可以把邏輯寫在transfer介面中,當玩家轉賬給該合約賬戶,則會執行相應的遊戲邏輯。

# bob是另一個測試賬號,用bob這個玩家來對合約進行轉賬 2 eos (小數點需要寫4位)
$ cleos -u http://jungle.cryptolions.io:18888 push action eosio.token transfer '[ "bob", "abcdefg12345", "2.0000 EOS", "備註" ]' -p bob@active;

4 當合約內部寫了類似 從合約傳送eos獎勵給玩家 的邏輯時 需要賦予合約 轉賬的許可權

cleos set account permission abcdefg12345 active '{"threshold": 1,"keys": [{"key":"EOS5hSo21o6VXdZ4SM7UXv7u3uiVZ6oeVU7wxfWsxoQ5DFzVNAcRs", "weight":1}],"accounts": [{"permission":{"actor":"abcdefg12345","permission":"eosio.code"},"weight":1}]}' owner -p abcdefg12345

5 查詢賬戶餘額

$ cleos -u http://jungle.cryptolions.io:18888 get currency balance eosio.token abcdefg12345 EOS

6 查詢合約內部定義的struct table

$ cleos -u http://jungle.cryptolions.io:18888 get table abcdefg12345 abcdefg12345 table

未完待續... 下篇會講到如何使用EOS.js 來呼叫合約

對了 歡迎加入我們分享開發經驗

如果qr過期可以留言
知識星球【新】:


2846016-dbfc0b546149cc77.png
知識星球

微信2群:


2846016-e40c64f5b95f6f21.png
微信2群

相關文章