Scorum
registration_committee.cpp
Go to the documentation of this file.
2 
4 
6 
8 
11 
12 namespace scorum {
13 namespace chain {
14 
16  : _base_type(db)
17  , _account_svc(db.account_service())
18  , _reg_pool_svc(db.registration_pool_service())
19 {
20 }
21 
23 {
25 
26  const auto& idx = db_impl().get_index<registration_committee_member_index>().indices().get<by_id>();
27  for (auto it = idx.cbegin(); it != idx.cend(); ++it)
28  {
29  ret.push_back(std::cref(*it));
30  }
31 
32  return ret;
33 }
34 
37 {
38  try
39  {
40  return db_impl().get<registration_committee_member_object, by_account_name>(account);
41  }
42  FC_CAPTURE_AND_RETHROW((account))
43 }
44 
46 dbs_registration_committee::create_committee(const std::vector<account_name_type>& accounts)
47 {
48  FC_ASSERT(!accounts.empty(), "Registration committee must have at least one member.");
49  FC_ASSERT(SCORUM_REGISTRATION_COMMITTEE_MAX_MEMBERS_LIMIT > 0, "Invalid ${1} value.",
51 
52  // check existence here to allow unit tests check input data even if object exists in DB
53  FC_ASSERT(get_committee().empty(), "Can't create more than one committee.");
54 
55  // create unique accout list form genesis unordered data
56  using sorted_type = std::map<account_name_type, std::reference_wrapper<const account_object>>;
57  sorted_type items;
58  for (const auto& account_name : accounts)
59  {
60  const account_object& accout = _account_svc.get_account(account_name);
61 
62  items.insert(sorted_type::value_type(accout.name, std::cref(accout)));
63  }
64 
65  // add members
66  for (const auto& item : items)
67  {
69  {
70  wlog("Too many committee members in genesis state. More than ${1} are ignored.",
72  break;
73  }
74  const account_object& accout = item.second;
75  _add_member(accout);
76  }
77 
78  if (!get_members_count())
79  {
80  FC_ASSERT(false, "Can't initialize at least one member.");
81  }
82 
83  return get_committee();
84 }
85 
87 {
88  // to fill empty committee it is used create_committee
89  FC_ASSERT(!get_committee().empty(), "No committee to add member.");
90 
91  const account_object& accout = _account_svc.get_account(account_name);
92 
93  _add_member(accout);
94 }
95 
97 {
98  // committee must exist after exclude (at least one member)
99  FC_ASSERT(get_committee().size() > 1, "No committee to exclude member.");
100 
101  const account_object& accout = _account_svc.get_account(account_name);
102 
103  _exclude_member(accout);
104 }
105 
107  const member_info_modifier_type& modifier)
108 {
109  db_impl().modify(member, [&](registration_committee_member_object& m) { modifier(m); });
110 }
111 
113 {
114  return db_impl().get_index<registration_committee_member_index>().indices().size();
115 }
116 
118 {
119  const auto& idx = db_impl().get_index<registration_committee_member_index>().indices().get<by_account_name>();
120  return idx.find(account_name) != idx.cend();
121 }
122 
124 {
125  _reg_pool_svc.update([&](registration_pool_object& m) { m.invite_quorum = quorum; });
126 }
127 
129 {
130  _reg_pool_svc.update([&](registration_pool_object& m) { m.dropout_quorum = quorum; });
131 }
132 
134 {
135  _reg_pool_svc.update([&](registration_pool_object& m) { m.change_quorum = quorum; });
136 }
137 
139 {
140  return _reg_pool_svc.get().invite_quorum;
141 }
142 
144 {
145  return _reg_pool_svc.get().dropout_quorum;
146 }
147 
149 {
150  return _reg_pool_svc.get().change_quorum;
151 }
152 
153 const registration_committee_member_object& dbs_registration_committee::_add_member(const account_object& account)
154 {
155  FC_ASSERT(!is_exists(account.name), "Member already exists.");
157  "Can't add member. Limit ${1} is reached.", ("1", SCORUM_REGISTRATION_COMMITTEE_MAX_MEMBERS_LIMIT));
158 
160  [&](registration_committee_member_object& member) { member.account = account.name; });
161 
162  return new_member;
163 }
164 
165 void dbs_registration_committee::_exclude_member(const account_object& account)
166 {
167  FC_ASSERT(is_exists(account.name), "Member does not exist.");
168 
169  const registration_committee_member_object& member = get_member(account.name);
170 
171  db_impl().remove(member);
172 }
173 
174 namespace utils {
175 
176 bool is_quorum(size_t votes, size_t members_count, size_t quorum)
177 {
178  using safe_size_type = fc::safe<size_t>;
179 
180  const size_t voted_percent = (safe_size_type(votes) * SCORUM_100_PERCENT / members_count).value;
181 
182  return voted_percent >= SCORUM_PERCENT(quorum) ? true : false;
183 }
184 
185 } // namespace utils
186 } // namespace chain
187 } // namespace scorum
tracks the blockchain state in an extensible manner
Definition: database.hpp:52
dba::db_index & db_impl()
Definition: dbs_base.cpp:22
void change_base_quorum(const percent_type quorum) override
void change_exclude_member_quorum(const percent_type quorum) override
committee_members_cref_type get_committee() const override
committee_members_cref_type create_committee(const std::vector< account_name_type > &accounts) override
void update_member_info(const registration_committee_member_object &, const member_info_modifier_type &modifier) override
bool is_exists(const account_name_type &) const override
const registration_committee_member_object & get_member(const account_name_type &) const override
void add_member(const account_name_type &) override
void change_add_member_quorum(const percent_type quorum) override
void exclude_member(const account_name_type &) override
#define SCORUM_PERCENT(X)
Definition: config.hpp:203
#define SCORUM_100_PERCENT
Definition: config.hpp:200
#define SCORUM_REGISTRATION_COMMITTEE_MAX_MEMBERS_LIMIT
Definition: config.hpp:168
size_t size(db_index &db_idx)
Definition: db_accessor.hpp:25
bool is_quorum(size_t votes, size_t members_count, size_t quorum)
shared_multi_index_container< registration_committee_member_object, indexed_by< ordered_unique< tag< by_id >, member< registration_committee_member_object, registration_committee_member_id_type, &registration_committee_member_object::id > >, ordered_unique< tag< by_account_name >, member< registration_committee_member_object, account_name_type, &registration_committee_member_object::account > > > > registration_committee_member_index
fc::fixed_string_16 account_name_type
Definition: types.hpp:62
uint16_t percent_type
Definition: types.hpp:69
Definition: asset.cpp:15
virtual const account_object & get_account(const account_name_type &) const =0
virtual void update(const modifier_type &modifier)=0
virtual const object_type & get() const =0
std::function< void(registration_committee_member_object &)> member_info_modifier_type
std::vector< committee_member_object_cref_type > committee_members_cref_type