TARAXA
Loading...
Searching...
No Matches
pillar_chain_manager.hpp
Go to the documentation of this file.
1#pragma once
2
3#include <memory>
4
5#include "common/event.hpp"
7#include "logger/logging.hpp"
10
11namespace taraxa {
12class DbStorage;
13class Network;
14class KeyManager;
15struct FicusHardforkConfig;
16} // namespace taraxa
17
18namespace taraxa::final_chain {
19class FinalChain;
20}
21
22namespace taraxa::pillar_chain {
23
32 private:
34
35 public:
38
39 public:
40 PillarChainManager(const FicusHardforkConfig& ficus_hf_config, std::shared_ptr<DbStorage> db,
41 std::shared_ptr<final_chain::FinalChain> final_chain, std::shared_ptr<KeyManager> key_manager);
42
53 std::shared_ptr<PillarBlock> createPillarBlock(PbftPeriod period,
54 const std::shared_ptr<const final_chain::BlockHeader>& block_header,
55 const h256& bridge_root, const h256& bridge_epoch);
56
67 std::shared_ptr<PillarVote> genAndPlacePillarVote(PbftPeriod period, const blk_hash_t& pillar_block_hash,
68 const secret_t& node_sk, bool broadcast_vote);
69
74 void setNetwork(std::weak_ptr<Network> network);
75
82 bool isRelevantPillarVote(const std::shared_ptr<PillarVote> vote) const;
83
90 bool validatePillarVote(const std::shared_ptr<PillarVote> vote) const;
91
95 bool isPillarBlockLatestFinalized(const blk_hash_t& block_hash) const;
96
100 std::shared_ptr<PillarBlock> getLastFinalizedPillarBlock() const;
101
108 uint64_t addVerifiedPillarVote(const std::shared_ptr<PillarVote>& vote);
109
116 std::vector<std::shared_ptr<PillarVote>> finalizePillarBlock(const blk_hash_t& pillar_block_hash);
117
121 std::shared_ptr<PillarBlock> getCurrentPillarBlock() const;
122
133 std::vector<std::shared_ptr<PillarVote>> getVerifiedPillarVotes(PbftPeriod period, const blk_hash_t pillar_block_hash,
134 bool above_threshold = false) const;
135
139 bool isValidPillarBlock(const std::shared_ptr<PillarBlock>& pillar_block) const;
140
145 std::optional<uint64_t> getPillarConsensusThreshold(PbftPeriod period) const;
146
147 private:
156 std::vector<PillarBlock::ValidatorVoteCountChange> getOrderedValidatorsVoteCountsChanges(
157 const std::vector<state_api::ValidatorVoteCount>& current_vote_counts,
158 const std::vector<state_api::ValidatorVoteCount>& previous_pillar_block_vote_counts);
159
166 void saveNewPillarBlock(const std::shared_ptr<PillarBlock>& pillar_block,
167 std::vector<state_api::ValidatorVoteCount>&& new_vote_counts);
168
169 private:
170 // Node config
172
173 std::shared_ptr<DbStorage> db_;
174 std::weak_ptr<Network> network_;
175 std::shared_ptr<final_chain::FinalChain> final_chain_;
176 std::shared_ptr<KeyManager> key_manager_;
177
178 // Last finalized pillar block - saved into db together with > threshold votes
179 std::shared_ptr<PillarBlock> last_finalized_pillar_block_;
180 // Current pillar block
181 std::shared_ptr<PillarBlock> current_pillar_block_;
182 // Full list of validators vote counts for tbe current pillar block period - no concurrent access protection needed
183 std::vector<state_api::ValidatorVoteCount> current_pillar_block_vote_counts_;
184
185 // Pillar votes for latest_pillar_block_.period - 1, latest_pillar_block_.period and potential +1 future pillar
186 // block period
188
189 // Protects last_finalized_pillar_block_ & current_pillar_block_
190 mutable std::shared_mutex mutex_;
191
193};
194
197} // namespace taraxa::pillar_chain
Definition pillar_votes.hpp:10
bool isRelevantPillarVote(const std::shared_ptr< PillarVote > vote) const
Checks if vote is related to saved latest_pillar_block_ and it is not already saved.
Definition pillar_chain_manager.cpp:212
logger::Logger logger_
Definition pillar_chain_manager.hpp:192
std::shared_ptr< PillarVote > genAndPlacePillarVote(PbftPeriod period, const blk_hash_t &pillar_block_hash, const secret_t &node_sk, bool broadcast_vote)
Generate and place pillar vote for provided pillar_block_hash in case the whole pillar block is prese...
Definition pillar_chain_manager.cpp:114
std::vector< std::shared_ptr< PillarVote > > finalizePillarBlock(const blk_hash_t &pillar_block_hash)
Finalize pillar block.
Definition pillar_chain_manager.cpp:142
const decltype(pillar_block_finalized_emitter_) ::Subscriber & pillar_block_finalized_
Definition pillar_chain_manager.hpp:36
std::vector< state_api::ValidatorVoteCount > current_pillar_block_vote_counts_
Definition pillar_chain_manager.hpp:183
std::shared_ptr< PillarBlock > current_pillar_block_
Definition pillar_chain_manager.hpp:181
std::weak_ptr< Network > network_
Definition pillar_chain_manager.hpp:174
bool validatePillarVote(const std::shared_ptr< PillarVote > vote) const
Validates pillar vote.
Definition pillar_chain_manager.cpp:245
std::shared_ptr< final_chain::FinalChain > final_chain_
Definition pillar_chain_manager.hpp:175
std::shared_ptr< DbStorage > db_
Definition pillar_chain_manager.hpp:173
bool isValidPillarBlock(const std::shared_ptr< PillarBlock > &pillar_block) const
Definition pillar_chain_manager.cpp:326
std::shared_ptr< PillarBlock > last_finalized_pillar_block_
Definition pillar_chain_manager.hpp:179
const util::EventEmitter< const PillarBlockData & > pillar_block_finalized_emitter_
Definition pillar_chain_manager.hpp:33
std::shared_ptr< PillarBlock > createPillarBlock(PbftPeriod period, const std::shared_ptr< const final_chain::BlockHeader > &block_header, const h256 &bridge_root, const h256 &bridge_epoch)
Definition pillar_chain_manager.cpp:50
std::vector< std::shared_ptr< PillarVote > > getVerifiedPillarVotes(PbftPeriod period, const blk_hash_t pillar_block_hash, bool above_threshold=false) const
Get all pillar votes for specified pillar block.
Definition pillar_chain_manager.cpp:313
std::vector< PillarBlock::ValidatorVoteCountChange > getOrderedValidatorsVoteCountsChanges(const std::vector< state_api::ValidatorVoteCount > &current_vote_counts, const std::vector< state_api::ValidatorVoteCount > &previous_pillar_block_vote_counts)
Return a vector of validators vote counts changes between the current and previous pillar block Chang...
Definition pillar_chain_manager.cpp:363
const FicusHardforkConfig & kFicusHfConfig
Definition pillar_chain_manager.hpp:171
void saveNewPillarBlock(const std::shared_ptr< PillarBlock > &pillar_block, std::vector< state_api::ValidatorVoteCount > &&new_vote_counts)
Save new pillar block into db & class data members.
Definition pillar_chain_manager.cpp:106
std::optional< uint64_t > getPillarConsensusThreshold(PbftPeriod period) const
Definition pillar_chain_manager.cpp:349
std::shared_mutex mutex_
Definition pillar_chain_manager.hpp:190
void setNetwork(std::weak_ptr< Network > network)
Set network as a weak pointer.
Definition pillar_chain_manager.cpp:428
std::shared_ptr< PillarBlock > getCurrentPillarBlock() const
Definition pillar_chain_manager.cpp:207
PillarVotes pillar_votes_
Definition pillar_chain_manager.hpp:187
bool isPillarBlockLatestFinalized(const blk_hash_t &block_hash) const
Definition pillar_chain_manager.cpp:191
std::shared_ptr< PillarBlock > getLastFinalizedPillarBlock() const
Definition pillar_chain_manager.cpp:202
uint64_t addVerifiedPillarVote(const std::shared_ptr< PillarVote > &vote)
Add a vote to the pillar votes map.
Definition pillar_chain_manager.cpp:274
std::shared_ptr< KeyManager > key_manager_
Definition pillar_chain_manager.hpp:176
PillarChainMgr class contains functionality related to pillar chain.
Definition pillar_chain_manager.hpp:31
Definition app_base.hpp:22
std::shared_ptr< spdlog::logger > Logger
Definition logging.hpp:12
Definition app_base.hpp:25
Definition app.hpp:16
EthBlockNumber PbftPeriod
Definition types.hpp:25
Definition hardfork.hpp:43
Definition event.hpp:48