这是一步步的用EOSIO开发区块链DApp的第二部分,这部分将主要是为EOSIO平台开发智能合约。
示例智能合约的目的是模拟选举。我创建了一个EOSIO用户来托管智能合约。创建了两个公民用户来投票给候选人。投票记录保存在EOSIO区块链中。在此示例中,所有操作都在命令模式下运行。让我们开始吧。
开发智能合约
EOSIO执行以WebAssembly标准开发的智能合约。所以我用C++开发了选举智能合约。以下是election.cpp
的完整源代码:
#include <eosiolib/eosio.hpp>
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<N(candidate), candidate> 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<N(voter), voter, indexed_by<N(_candidate_key), const_mem_fun<voter, uint64_t, &voter::candidate_key>>> 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\n");
};
/// @abi action
void addc(std::string name) {
print("Adding candidate ", name, "\n");
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,