Scorum
proposal_executor.cpp
Go to the documentation of this file.
2 
4 
7 
10 
12 
13 namespace scorum {
14 namespace chain {
15 
17  : _base_type(s)
18  , services(s)
19  , proposal_service(services.proposal_service())
20  , evaluators(services)
21  , _db(s)
22 {
26  new registration_committee::proposal_exclude_member_evaluator(services, removed_members));
27 
31  new development_committee::proposal_exclude_member_evaluator(services, removed_members));
32 
35 
39 
42 }
43 
45 {
46  execute_proposal(proposal);
47  update_proposals_voting_list_and_execute();
48 }
49 
50 bool dbs_proposal_executor::is_quorum(const proposal_object& proposal)
51 {
52  auto committee = proposal.operation.visit(get_operation_committee_visitor(services));
53  const size_t votes = proposal_service.get_votes(proposal);
54  const size_t members_count = committee.as_committee_i().get_members_count();
55 
56  return utils::is_quorum(votes, members_count, proposal.quorum_percent);
57 }
58 
59 void dbs_proposal_executor::execute_proposal(const proposal_object& proposal)
60 {
61  if (is_quorum(proposal))
62  {
63  auto& evaluator = evaluators.get_evaluator(proposal.operation);
64 
65  auto note = _db.create_notification(proposal_virtual_operation(proposal.operation));
66 
68  evaluator.apply(proposal.operation);
70 
71  proposal_service.remove(proposal);
72  }
73 }
74 
75 void dbs_proposal_executor::update_proposals_voting_list_and_execute()
76 {
77  while (!removed_members.empty())
78  {
79  account_name_type member = *removed_members.begin();
80 
81  proposal_service.for_all_proposals_remove_from_voting_list(member);
82 
83  auto proposals = proposal_service.get_proposals();
84 
85  for (const auto& p : proposals)
86  {
87  execute_proposal(p);
88  }
89 
90  removed_members.erase(member);
91  }
92 }
93 
94 } // namespace scorum
95 } // namespace chain
tracks the blockchain state in an extensible manner
Definition: database.hpp:52
operation_notification create_notification(const operation &op) const
Definition: database.cpp:1029
void notify_pre_apply_operation(const operation_notification &note)
Definition: database.cpp:1019
void notify_post_apply_operation(const operation_notification &note)
Definition: database.cpp:1024
void operator()(const proposal_object &proposal) override
void register_evaluator(Args &&... args)
evaluator< OperationType > & get_evaluator(const OperationType &op)
scorum::chain::proposal_exclude_member_evaluator< development_committee_exclude_member_operation > proposal_exclude_member_evaluator
scorum::chain::proposal_exclude_member_evaluator< registration_committee_exclude_member_operation > proposal_exclude_member_evaluator
bool is_quorum(size_t votes, size_t members_count, size_t quorum)
fc::fixed_string_16 account_name_type
Definition: types.hpp:62
signed_transaction proposal(const std::string &initiator, uint32_t lifetime_sec, C &&constructor)
Definition: wallet.cpp:2754
Definition: asset.cpp:15
virtual void for_all_proposals_remove_from_voting_list(const account_name_type &member)=0
virtual size_t get_votes(const proposal_object &proposal)=0
virtual proposal_refs_type get_proposals()=0
virtual size_t get_members_count() const =0
std::vector< typename Visitor::result_type > visit(Visitor &&visitor)
Definition: transaction.hpp:29