国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

區塊鏈平臺EOSIO開發智能合約和dapp(二)

cuieney / 638人閱讀

摘要:示例智能合約的目的是模擬選舉。這告訴了智能合約中處理程序的定義。接下來的任務是創建一個新的帳戶來保存選舉智能合約。

這是一步步的用EOSIO開發區塊鏈DApp的第二部分,這部分將主要是為EOSIO平臺開發智能合約。

示例智能合約的目的是模擬選舉。我創建了一個EOSIO用戶來托管智能合約。創建了兩個公民用戶來投票給候選人。投票記錄保存在EOSIO區塊鏈中。在此示例中,所有操作都在命令模式下運行。讓我們開始吧。

開發智能合約

EOSIO執行以WebAssembly標準開發的智能合約。所以我用C++開發了選舉智能合約。以下是election.cpp的完整源代碼:

#include 

using namespace eosio;

class election : public contract
{
private:
  // create the multi index tables to store the data

  /// @abi table
  struct candidate {
    uint64_t _key;       // primary key
    std::string _name;   // candidate name
    uint32_t _count = 0; // voted count

    uint64_t primary_key() const { return _key; }
  };
  typedef eosio::multi_index candidates;

  /// @abi table
  struct voter {
    uint64_t _key;
    uint64_t _candidate_key; // name of poll
    account_name _account;   // this account has voted, avoid duplicate voter

    uint64_t primary_key() const { return _key; }
    uint64_t candidate_key() const { return _candidate_key; }
  };
  typedef eosio::multi_index>> voters;

  // local instances of the multi indexes
  candidates _candidates;
  voters _voters;
  uint64_t _candidates_count;

public:
  election(account_name s) : contract(s), _candidates(s, s), _voters(s, s), _candidates_count(0) {}

  // public methods exposed via the ABI
  // on candidates

  /// @abi action
  void version() {
    print("Election Smart Contract version 0.0.1
");
  };

  /// @abi action
  void addc(std::string name) {
    print("Adding candidate ", name, "
");

    uint64_t key = _candidates.available_primary_key();

    // update the table to include a new candidate
    _candidates.emplace(get_self(), [&](auto &p) {
      p._key = key;
      p._name = name;
      p._count = 0;
    });

    print("Candidate added successfully. candidate_key = ", key, "
");
  };

  /// @abi action
  void reset() {
    // Get all keys of _candidates
    std::vector keysForDeletion;
    for (auto &itr : _candidates) {
      keysForDeletion.push_back(itr.primary_key());
    }

    // now delete each item for that poll
    for (uint64_t key : keysForDeletion) {
      auto itr = _candidates.find(key);
      if (itr != _candidates.end()) {
        _candidates.erase(itr);
      }
    }

    // Get all keys of _voters
    keysForDeletion.empty();
    for (auto &itr : _voters) {
      keysForDeletion.push_back(itr.primary_key());
    }

    // now delete each item for that poll
    for (uint64_t key : keysForDeletion) {
      auto itr = _voters.find(key);
      if (itr != _voters.end()) {
        _voters.erase(itr);
      }
    }

    print("candidates and voters reset successfully.
");
  };

  /// @abi action
  void results() {
    print("Start listing voted results
");
    for (auto& item : _candidates) {
      print("Candidate ", item._name, " has voted count: ", item._count, "
");
    }
  };

  /// @abi action
  void vote(account_name s, uint64_t candidate_key) {
    require_auth(s);

    bool found = false;

    // Did the voter vote before?
    for (auto& item : _voters) {
      if (item._account == s) {
        found = true;
        break;
      }
    }
    eosio_assert(!found, "You"re voted already!");

    // Findout the candidate by id
    std::vector keysForModify;
    for (auto& item : _candidates) {
      if (item.primary_key() == candidate_key) {
        keysForModify.push_back(item.primary_key());
        break;
      }
    }

    if (keysForModify.size() == 0) {
      eosio_assert(found, "Invalid candidate id!");
      return;
    }

    // Update the voted count inside the candidate
    for (uint64_t key : keysForModify) {
      auto itr = _candidates.find(key);
      auto candidate = _candidates.get(key);
      if (itr != _candidates.end()) {
        _candidates.modify(itr, get_self(), [&](auto& p) {
          p._count++;
        });

        print("Voted candidate: ", candidate._name, " successfully
");
      }
    }

    // Add this user to voters array
    _voters.emplace(get_self(), [&](auto& p) {
      p._key = _voters.available_primary_key();
      p._candidate_key = candidate_key;
      p._account = s;
    });
  };
};

EOSIO_ABI(election, (version)(reset)(addc)(results)(vote))

注意最后一行EOSIO_ABI()是一個宏語句,用于自動生成ABI文件而不是手動編寫。ABI文件用于定義提交動作處理程序。這告訴了EOSIO智能合約中處理程序的定義。

EOSIO為我們提供了多索引數據庫API,可以將數據保存到區塊鏈中。在上面的選舉智能合約中,我定義了兩個multi_index(類似于SQL表):候選人和選民。實際上是兩個數組存儲兩個結構:候選者和選民。我使用C++ STL來操作multi_index,例如addupdatedelete

請注意,兩個結構在開頭標有/// @abi table。這是告訴EOSIO abi生成器在election.abi文件中生成ABI表。這很方便。

編譯選舉智能合約:

$ eosiocpp -o election.wast election.cpp

分別生成WAST和WASM文件。但這對EOSIO來說還不夠。我們還需要生成ABI文件:

$ eosiocpp -g election.abi election.cpp
Visual Studio Code的可選文件

為了增強開發體驗,我為Visual Studio Code(VSCode)創建了一個屬性文件c_cpp_properties.json,告訴它如何查找頭文件。該文件需要存儲在.vscode目錄中,如下所示:

.vscode/c_cpp_properties文件內容如下:

{
  "configurations": [
    {
      "name": "Linux",
      "includePath": [
        "${workspaceFolder}/**",
        "~/eos/contracts",
        "~/opt/boost/include"
      ],
      "defines": [],
      "compilerPath": "/usr/bin/clang++-4.0",
      "cStandard": "c11",
      "cppStandard": "c++17",
      "intelliSenseMode": "clang-x64"
    }
  ],
  "version": 4
}
啟動EOSIO

一直在使用配置良好的虛擬機(在第1部分中提到)。要啟動單節點Testnet服務器:

$ nodeos -e -p eosio --plugin eosio::wallet_api_plugin --plugin eosio::chain_api_plugin --plugin eosio::history_api_plugin --access-control-allow-origin=* --contracts-console

單擊此處獲取nodeos參數的更多信息。

創建帳戶

下一個任務是解鎖默認錢包。EOSIO將密鑰對存儲在錢包中。每次服務器重啟或每15分鐘需要解鎖一次。解鎖錢包:

$ cleos wallet unlock --password ${wallet_password}

我們需要分別創建一個所有者密鑰對和活動密鑰對。然后將該私鑰導入錢包。鍵入以下命令:

$ cleos create key # Create an owner key
$ cleos create key # Create an active key
$ cleos wallet import ${private_owner_key}
$ cleos wallet import ${private_active_key}

不要忘記在某個地方記錄這些密鑰對。

接下來的任務是創建一個新的帳戶來保存選舉智能合約。 鍵入以下命令:

$ cleos create account eosio election ${public_owner_key} ${public_active_key}

此外,為投票模擬創建兩個公民:

$ cleos create account eosio voter1 ${public_owner_key} ${public_active_key}
$ cleos create account eosio voter2 ${public_owner_key} ${public_active_key}
部署智能合約

輸入以下命令上傳選舉智能合約:

$ cleos set contract election ../election -p election

結果類似下圖:

運行智能合約

我們可以嘗試運行合約。

1.運行version操作

$ cleos push action election version "" -p election

我們可以從nodeos檢查控制臺輸出:

2.增加選舉候選人

$ cleos push action election addc "["Hillary Clinton"]" -p election
$ cleos push action election addc "["Donald J. Trump"]" -p election

3.顯示存儲在區塊鏈中的候選數據庫

$ cleos get table election election candidate

結果如圖所示:

4.模擬投票(兩位選民都被投票給唐納德·J·特朗普)

$ cleos push action election vote "["voter1", 1]" -p voter1
$ cleos push action election vote "["voter2", 1]" -p voter2

如果voter1再次投票:

$ cleos push action election vote "["voter1", 0]" -p voter1

EOSIO 將返回一個例外:

5.查看投票結果

$ cleos get table election election candidate

如你所見,候選人“Donald J. Trump”的投票數為2.這意味著選舉智能合約正在工作!

這就是EOS開發dapp的第二部分。

在下一部分中,我將創建一個Web應用程序,用于演示Web訪問者和區塊鏈之間的交互。

源代碼在這里github repo

分享一個交互式的在線編程實戰,EOS智能合約與DApp開發入門

EOS教程

本課程幫助你快速入門EOS區塊鏈去中心化應用的開發,內容涵蓋EOS工具鏈、賬戶與錢包、發行代幣、智能合約開發與部署、使用代碼與智能合約交互等核心知識點,最后綜合運用各知識點完成一個便簽DApp的開發。

這里是原文

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/24279.html

相關文章

  • EOS DApp開發入門(): 智能合約探究

    摘要:在看啟動腳本輸出的時候,發現了這兩樣輸出設置和智能合約,以及安裝合約開發工具。合約開發工具是的工具鏈和一組工具,用于促進平臺的合同編寫。系統智能合約,可以進行很多系統級別的操作,比如用戶投票將用戶注冊成為生產者。 Previously 在EOS DApp開發入門(一)中,通過docker image的方式架起了本地的eos區塊鏈,使Note chain DApp與本地區塊鏈進行交互,成...

    Honwhy 評論0 收藏0
  • 區塊平臺EOSIO開發智能合約dapp(一)

    摘要:與傳統方式不同,在去中心化的網絡及區塊鏈上運行后端代碼智能合約。這個博客涵蓋了什么在本博客中,我將展示如何設置區塊鏈并開發智能合約。 在我傾聽Bettina Warburg的演講之后,我對去中心化經濟(dApps)的概念著迷。傳統的Web應用程序是: 前端→后端→數據庫 相比之下,dApp網站是: 前端→智能合約→區塊鏈 例如,當你進入電子銀行時,網頁將調用后端代碼來獲取你的個人數據并...

    tylin 評論0 收藏0
  • 區塊平臺EOSIO開發智能合約dapp(三)

    摘要:在中被大量使用以便于開發。事實上,在中創建帳戶存在問題。這種方法使我可以輕松調用智能合約。結論這就是我的區塊鏈實驗系列的全部內容。 這是一步步的用EOSIO開發區塊鏈DApp的第三部分,上一部分中,我為EOSIO平臺開發了一個模擬選舉的智能合約。這部分我將開發一個webapp,允許訪問者投票給候選人。 以下是webapp的快速預覽: showImg(https://segmentfau...

    yiliang 評論0 收藏0
  • 區塊平臺EOSIO開發智能合約dapp(三)

    摘要:在中被大量使用以便于開發。事實上,在中創建帳戶存在問題。這種方法使我可以輕松調用智能合約。結論這就是我的區塊鏈實驗系列的全部內容。 這是一步步的用EOSIO開發區塊鏈DApp的第三部分,上一部分中,我為EOSIO平臺開發了一個模擬選舉的智能合約。這部分我將開發一個webapp,允許訪問者投票給候選人。 以下是webapp的快速預覽: showImg(https://segmentfau...

    CoyPan 評論0 收藏0

發表評論

0條評論

cuieney

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<