摘要:示例智能合約的目的是模擬選舉。這告訴了智能合約中處理程序的定義。接下來的任務(wù)是創(chuàng)建一個(gè)新的帳戶來保存選舉智能合約。
這是一步步的用EOSIO開發(fā)區(qū)塊鏈DApp的第二部分,這部分將主要是為EOSIO平臺(tái)開發(fā)智能合約。
示例智能合約的目的是模擬選舉。我創(chuàng)建了一個(gè)EOSIO用戶來托管智能合約。創(chuàng)建了兩個(gè)公民用戶來投票給候選人。投票記錄保存在EOSIO區(qū)塊鏈中。在此示例中,所有操作都在命令模式下運(yùn)行。讓我們開始吧。
開發(fā)智能合約EOSIO執(zhí)行以WebAssembly標(biāo)準(zhǔn)開發(fā)的智能合約。所以我用C++開發(fā)了選舉智能合約。以下是election.cpp的完整源代碼:
#includeusing 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()是一個(gè)宏語句,用于自動(dòng)生成ABI文件而不是手動(dòng)編寫。ABI文件用于定義提交動(dòng)作處理程序。這告訴了EOSIO智能合約中處理程序的定義。
EOSIO為我們提供了多索引數(shù)據(jù)庫API,可以將數(shù)據(jù)保存到區(qū)塊鏈中。在上面的選舉智能合約中,我定義了兩個(gè)multi_index(類似于SQL表):候選人和選民。實(shí)際上是兩個(gè)數(shù)組存儲(chǔ)兩個(gè)結(jié)構(gòu):候選者和選民。我使用C++ STL來操作multi_index,例如add,update,delete。
請注意,兩個(gè)結(jié)構(gòu)在開頭標(biāo)有/// @abi table。這是告訴EOSIO abi生成器在election.abi文件中生成ABI表。這很方便。
編譯選舉智能合約:
$ eosiocpp -o election.wast election.cpp
分別生成WAST和WASM文件。但這對EOSIO來說還不夠。我們還需要生成ABI文件:
$ eosiocpp -g election.abi election.cppVisual Studio Code的可選文件
為了增強(qiáng)開發(fā)體驗(yàn),我為Visual Studio Code(VSCode)創(chuàng)建了一個(gè)屬性文件c_cpp_properties.json,告訴它如何查找頭文件。該文件需要存儲(chǔ)在.vscode目錄中,如下所示:
.vscode/c_cpp_properties文件內(nèi)容如下:
{ "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 }啟動(dòng)EOSIO
一直在使用配置良好的虛擬機(jī)(在第1部分中提到)。要啟動(dòng)單節(jié)點(diǎn)Testnet服務(wù)器:
$ 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參數(shù)的更多信息。
創(chuàng)建帳戶下一個(gè)任務(wù)是解鎖默認(rèn)錢包。EOSIO將密鑰對存儲(chǔ)在錢包中。每次服務(wù)器重啟或每15分鐘需要解鎖一次。解鎖錢包:
$ cleos wallet unlock --password ${wallet_password}
我們需要分別創(chuàng)建一個(gè)所有者密鑰對和活動(dòng)密鑰對。然后將該私鑰導(dǎo)入錢包。鍵入以下命令:
$ 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}
不要忘記在某個(gè)地方記錄這些密鑰對。
接下來的任務(wù)是創(chuàng)建一個(gè)新的帳戶來保存選舉智能合約。 鍵入以下命令:
$ cleos create account eosio election ${public_owner_key} ${public_active_key}
此外,為投票模擬創(chuàng)建兩個(gè)公民:
$ 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
結(jié)果類似下圖:
運(yùn)行智能合約我們可以嘗試運(yùn)行合約。
1.運(yùn)行version操作
$ cleos push action election version "" -p election
我們可以從nodeos檢查控制臺(tái)輸出:
2.增加選舉候選人
$ cleos push action election addc "["Hillary Clinton"]" -p election $ cleos push action election addc "["Donald J. Trump"]" -p election
3.顯示存儲(chǔ)在區(qū)塊鏈中的候選數(shù)據(jù)庫
$ cleos get table election election candidate
結(jié)果如圖所示:
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 將返回一個(gè)例外:
5.查看投票結(jié)果
$ cleos get table election election candidate
如你所見,候選人“Donald J. Trump”的投票數(shù)為2.這意味著選舉智能合約正在工作!
這就是EOS開發(fā)dapp的第二部分。
在下一部分中,我將創(chuàng)建一個(gè)Web應(yīng)用程序,用于演示W(wǎng)eb訪問者和區(qū)塊鏈之間的交互。
源代碼在這里github repo
分享一個(gè)交互式的在線編程實(shí)戰(zhàn),EOS智能合約與DApp開發(fā)入門:
EOS教程
本課程幫助你快速入門EOS區(qū)塊鏈去中心化應(yīng)用的開發(fā),內(nèi)容涵蓋EOS工具鏈、賬戶與錢包、發(fā)行代幣、智能合約開發(fā)與部署、使用代碼與智能合約交互等核心知識(shí)點(diǎn),最后綜合運(yùn)用各知識(shí)點(diǎn)完成一個(gè)便簽DApp的開發(fā)。
這里是原文
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/24279.html
摘要:在看啟動(dòng)腳本輸出的時(shí)候,發(fā)現(xiàn)了這兩樣輸出設(shè)置和智能合約,以及安裝合約開發(fā)工具。合約開發(fā)工具是的工具鏈和一組工具,用于促進(jìn)平臺(tái)的合同編寫。系統(tǒng)智能合約,可以進(jìn)行很多系統(tǒng)級(jí)別的操作,比如用戶投票將用戶注冊成為生產(chǎn)者。 Previously 在EOS DApp開發(fā)入門(一)中,通過docker image的方式架起了本地的eos區(qū)塊鏈,使Note chain DApp與本地區(qū)塊鏈進(jìn)行交互,成...
摘要:與傳統(tǒng)方式不同,在去中心化的網(wǎng)絡(luò)及區(qū)塊鏈上運(yùn)行后端代碼智能合約。這個(gè)博客涵蓋了什么在本博客中,我將展示如何設(shè)置區(qū)塊鏈并開發(fā)智能合約。 在我傾聽Bettina Warburg的演講之后,我對去中心化經(jīng)濟(jì)(dApps)的概念著迷。傳統(tǒng)的Web應(yīng)用程序是: 前端→后端→數(shù)據(jù)庫 相比之下,dApp網(wǎng)站是: 前端→智能合約→區(qū)塊鏈 例如,當(dāng)你進(jìn)入電子銀行時(shí),網(wǎng)頁將調(diào)用后端代碼來獲取你的個(gè)人數(shù)據(jù)并...
摘要:在中被大量使用以便于開發(fā)。事實(shí)上,在中創(chuàng)建帳戶存在問題。這種方法使我可以輕松調(diào)用智能合約。結(jié)論這就是我的區(qū)塊鏈實(shí)驗(yàn)系列的全部內(nèi)容。 這是一步步的用EOSIO開發(fā)區(qū)塊鏈DApp的第三部分,上一部分中,我為EOSIO平臺(tái)開發(fā)了一個(gè)模擬選舉的智能合約。這部分我將開發(fā)一個(gè)webapp,允許訪問者投票給候選人。 以下是webapp的快速預(yù)覽: showImg(https://segmentfau...
摘要:在中被大量使用以便于開發(fā)。事實(shí)上,在中創(chuàng)建帳戶存在問題。這種方法使我可以輕松調(diào)用智能合約。結(jié)論這就是我的區(qū)塊鏈實(shí)驗(yàn)系列的全部內(nèi)容。 這是一步步的用EOSIO開發(fā)區(qū)塊鏈DApp的第三部分,上一部分中,我為EOSIO平臺(tái)開發(fā)了一個(gè)模擬選舉的智能合約。這部分我將開發(fā)一個(gè)webapp,允許訪問者投票給候選人。 以下是webapp的快速預(yù)覽: showImg(https://segmentfau...
閱讀 2823·2021-10-08 10:04
閱讀 3285·2021-09-10 11:20
閱讀 535·2019-08-30 10:54
閱讀 3328·2019-08-29 17:25
閱讀 2310·2019-08-29 16:24
閱讀 896·2019-08-29 12:26
閱讀 1453·2019-08-23 18:35
閱讀 1944·2019-08-23 17:53