TARAXA
final_chain.hpp
Go to the documentation of this file.
1 #pragma once
2 
3 #include <future>
4 
5 #include "common/event.hpp"
6 #include "common/types.hpp"
7 #include "config/config.hpp"
9 #include "final_chain/cache.hpp"
10 #include "final_chain/data.hpp"
13 #include "storage/storage.hpp"
14 
15 namespace taraxa::final_chain {
16 
28 class FinalChain {
29  protected:
32 
33  public:
36 
37  FinalChain() = default;
38  ~FinalChain() = default;
39  FinalChain(const std::shared_ptr<DbStorage>& db, const taraxa::FullNodeConfig& config, const addr_t& node_addr);
40  FinalChain(const FinalChain&) = delete;
41  FinalChain(FinalChain&&) = delete;
42  FinalChain& operator=(const FinalChain&) = delete;
44 
45  void stop();
46 
48 
57  std::future<std::shared_ptr<const FinalizationResult>> finalize(PeriodData&& period_data,
58  std::vector<h256>&& finalized_dag_blk_hashes,
59  std::shared_ptr<DagBlock>&& anchor = nullptr);
60 
67  std::shared_ptr<const BlockHeader> blockHeader(std::optional<EthBlockNumber> n = {}) const;
68 
74 
81  std::optional<EthBlockNumber> blockNumber(h256 const& h) const;
82 
89  std::optional<h256> blockHash(std::optional<EthBlockNumber> n = {}) const;
90 
97  std::optional<h256> finalChainHash(EthBlockNumber n) const;
98 
103  void updateStateConfig(const state_api::Config& new_config);
104 
110  std::shared_ptr<const TransactionHashes> transactionHashes(std::optional<EthBlockNumber> n = {}) const;
111 
117  const SharedTransactions transactions(std::optional<EthBlockNumber> n = {}) const;
118 
124  std::optional<TransactionLocation> transactionLocation(h256 const& trx_hash) const;
125 
131  std::optional<TransactionReceipt> transactionReceipt(h256 const& _transactionHash) const;
132 
138  uint64_t transactionCount(std::optional<EthBlockNumber> n = {}) const;
139 
147  std::vector<EthBlockNumber> withBlockBloom(LogBloom const& b, EthBlockNumber from, EthBlockNumber to) const;
148 
156  std::optional<state_api::Account> getAccount(addr_t const& addr, std::optional<EthBlockNumber> blk_n = {}) const;
157 
165  h256 getAccountStorage(addr_t const& addr, u256 const& key, std::optional<EthBlockNumber> blk_n = {}) const;
172  bytes getCode(addr_t const& addr, std::optional<EthBlockNumber> blk_n = {}) const;
173 
181  state_api::ExecutionResult call(state_api::EVMTransaction const& trx, std::optional<EthBlockNumber> blk_n = {}) const;
182 
190  std::string trace(std::vector<state_api::EVMTransaction> trx, EthBlockNumber blk_n,
191  std::optional<state_api::Tracing> params = {}) const;
192 
198  uint64_t dposEligibleTotalVoteCount(EthBlockNumber blk_num) const;
199 
206  uint64_t dposEligibleVoteCount(EthBlockNumber blk_num, addr_t const& addr) const;
207 
214  bool dposIsEligible(EthBlockNumber blk_num, addr_t const& addr) const;
215 
222  vrf_wrapper::vrf_pk_t dposGetVrfKey(EthBlockNumber blk_n, const addr_t& addr) const;
223 
228  void prune(EthBlockNumber blk_n);
229 
233  void waitForFinalized();
234 
235  std::vector<state_api::ValidatorStake> dposValidatorsTotalStakes(EthBlockNumber blk_num) const;
236 
238 
243  std::vector<state_api::ValidatorVoteCount> dposValidatorsVoteCounts(EthBlockNumber blk_num) const;
244 
249  uint64_t dposYield(EthBlockNumber blk_num) const;
250 
255  u256 dposTotalSupply(EthBlockNumber blk_num) const;
256 
261  h256 getBridgeRoot(EthBlockNumber blk_num) const;
262 
267  h256 getBridgeEpoch(EthBlockNumber blk_num) const;
268 
269  // TODO move out of here:
270  std::pair<val_t, bool> getBalance(addr_t const& addr) const;
271  std::shared_ptr<const FinalizationResult> finalize_(PeriodData&& new_blk,
272  std::vector<h256>&& finalized_dag_blk_hashes,
273  std::shared_ptr<DagBlock>&& anchor);
274 
275  private:
276  std::shared_ptr<TransactionHashes> getTransactionHashes(std::optional<EthBlockNumber> n = {}) const;
277  const SharedTransactions getTransactions(std::optional<EthBlockNumber> n = {}) const;
278  std::shared_ptr<const BlockHeader> getBlockHeader(EthBlockNumber n) const;
279  std::optional<h256> getBlockHash(EthBlockNumber n) const;
280  EthBlockNumber lastIfAbsent(const std::optional<EthBlockNumber>& client_blk_n) const;
281  static state_api::EVMTransaction toEvmTransaction(const SharedTransaction& trx);
282  static void appendEvmTransactions(std::vector<state_api::EVMTransaction>& evm_trxs, const SharedTransactions& trxs);
283  BlocksBlooms blockBlooms(const h256& chunk_id) const;
285  std::vector<EthBlockNumber> withBlockBloom(const LogBloom& b, EthBlockNumber from, EthBlockNumber to,
286  EthBlockNumber level, EthBlockNumber index) const;
287  bool isNeedToFinalize(EthBlockNumber blk_num) const;
288 
290  std::vector<SharedTransaction> makeSystemTransactions(PbftPeriod blk_num);
291 
292  std::shared_ptr<BlockHeader> makeGenesisHeader(std::string&& raw_header) const;
293  std::shared_ptr<BlockHeader> makeGenesisHeader(const h256& state_root) const;
294 
295  std::shared_ptr<BlockHeader> appendBlock(Batch& batch, const PbftBlock& pbft_blk, const h256& state_root,
296  u256 total_reward, const SharedTransactions& transactions = {},
297  const TransactionReceipts& receipts = {});
298  std::shared_ptr<BlockHeader> appendBlock(Batch& batch, std::shared_ptr<BlockHeader> header,
299  const SharedTransactions& transactions = {},
300  const TransactionReceipts& receipts = {});
301 
302  private:
303  std::shared_ptr<DbStorage> db_;
304  const uint64_t kBlockGasLimit;
306  const bool kLightNode = false;
307  const uint32_t kMaxLevelsPerPeriod;
309 
310  // It is not prepared to use more then 1 thread. Examine it if you want to change threads count
311  boost::asio::thread_pool executor_thread_{1};
312 
313  std::atomic<uint64_t> num_executed_dag_blk_ = 0;
314  std::atomic<uint64_t> num_executed_trx_ = 0;
315 
317 
323 
327 
328  std::condition_variable finalized_cv_;
329  std::mutex finalized_mtx_;
330 
331  std::atomic<EthBlockNumber> last_block_number_;
332 
335 };
336 
339 } // namespace taraxa::final_chain
Definition: FixedHash.h:35
Definition: cache.hpp:30
Definition: cache.hpp:101
class that is managing rewards stats processing and hardforks(intervals changes) So intermediate bloc...
Definition: rewards_stats.hpp:13
MapByBlockCache< addr_t, uint64_t > dpos_vote_count_cache_
Definition: final_chain.hpp:325
const uint64_t kBlockGasLimit
Definition: final_chain.hpp:304
ValueByBlockCache< std::shared_ptr< const BlockHeader > > block_headers_cache_
Definition: final_chain.hpp:318
SharedTransaction makeBridgeFinalizationTransaction()
Definition: final_chain.cpp:114
std::optional< EthBlockNumber > blockNumber(h256 const &h) const
Method to get block number by hash.
Definition: final_chain.cpp:363
std::shared_ptr< DbStorage > db_
Definition: final_chain.hpp:303
h256 getAccountStorage(addr_t const &addr, u256 const &key, std::optional< EthBlockNumber > blk_n={}) const
Returns the value from a storage position at a given address.
Definition: final_chain.cpp:426
std::atomic< uint64_t > num_executed_dag_blk_
Definition: final_chain.hpp:313
EthBlockNumber delegation_delay_
Definition: final_chain.hpp:316
std::shared_ptr< BlockHeader > makeGenesisHeader(std::string &&raw_header) const
Definition: final_chain.cpp:547
static state_api::EVMTransaction toEvmTransaction(const SharedTransaction &trx)
Definition: final_chain.cpp:608
void prune(EthBlockNumber blk_n)
Prune state db for all blocks older than blk_n.
Definition: final_chain.cpp:274
decltype(block_finalized_emitter_) ::Subscriber const & block_finalized_
Definition: final_chain.hpp:34
void stop()
Definition: final_chain.cpp:98
void waitForFinalized()
Wait until next block is finalized.
Definition: final_chain.cpp:494
h256 getBridgeEpoch(EthBlockNumber blk_num) const
Definition: final_chain.cpp:512
uint256_t dposTotalAmountDelegated(EthBlockNumber blk_num) const
Definition: final_chain.cpp:486
const SharedTransactions getTransactions(std::optional< EthBlockNumber > n={}) const
Definition: final_chain.cpp:540
decltype(block_applying_emitter_) ::Subscriber const & block_applying_
Definition: final_chain.hpp:35
std::shared_ptr< const BlockHeader > blockHeader(std::optional< EthBlockNumber > n={}) const
Method to get block header by block number.
Definition: final_chain.cpp:371
static void appendEvmTransactions(std::vector< state_api::EVMTransaction > &evm_trxs, const SharedTransactions &trxs)
Definition: final_chain.cpp:615
std::optional< h256 > blockHash(std::optional< EthBlockNumber > n={}) const
Method to get block hash by block number.
Definition: final_chain.cpp:367
ValueByBlockCache< uint64_t > total_vote_count_cache_
Definition: final_chain.hpp:324
FinalChain & operator=(FinalChain &&)=delete
std::optional< h256 > getBlockHash(EthBlockNumber n) const
Definition: final_chain.cpp:596
std::atomic< uint64_t > num_executed_trx_
Definition: final_chain.hpp:314
std::shared_ptr< const TransactionHashes > transactionHashes(std::optional< EthBlockNumber > n={}) const
Method to get all transaction hashes from the block.
Definition: final_chain.cpp:396
std::optional< TransactionReceipt > transactionReceipt(h256 const &_transactionHash) const
Method to get transaction receipt by hash.
Definition: final_chain.cpp:382
FinalChain(const FinalChain &)=delete
std::shared_ptr< TransactionHashes > getTransactionHashes(std::optional< EthBlockNumber > n={}) const
Definition: final_chain.cpp:528
state_api::ExecutionResult call(state_api::EVMTransaction const &trx, std::optional< EthBlockNumber > blk_n={}) const
Executes a new message call immediately without creating a transaction on the block chain....
Definition: final_chain.cpp:434
std::future< std::shared_ptr< const FinalizationResult > > finalize(PeriodData &&period_data, std::vector< h256 > &&finalized_dag_blk_hashes, std::shared_ptr< DagBlock > &&anchor=nullptr)
Method which finalizes a block and executes it in EVM.
Definition: final_chain.cpp:100
std::atomic< EthBlockNumber > last_block_number_
Definition: final_chain.hpp:331
std::vector< SharedTransaction > makeSystemTransactions(PbftPeriod blk_num)
Definition: final_chain.cpp:133
std::optional< state_api::Account > getAccount(addr_t const &addr, std::optional< EthBlockNumber > blk_n={}) const
Method to get account information.
Definition: final_chain.cpp:416
std::vector< state_api::ValidatorStake > dposValidatorsTotalStakes(EthBlockNumber blk_num) const
Definition: final_chain.cpp:482
const SharedTransactions transactions(std::optional< EthBlockNumber > n={}) const
Method to get all transactions from the block.
Definition: final_chain.cpp:400
std::condition_variable finalized_cv_
Definition: final_chain.hpp:328
std::optional< TransactionLocation > transactionLocation(h256 const &trx_hash) const
Method to get transaction location by hash.
Definition: final_chain.cpp:378
uint64_t dposYield(EthBlockNumber blk_num) const
Definition: final_chain.cpp:499
const uint32_t kMaxLevelsPerPeriod
Definition: final_chain.hpp:307
util::EventEmitter< uint64_t > const block_applying_emitter_
Definition: final_chain.hpp:31
bool dposIsEligible(EthBlockNumber blk_num, addr_t const &addr) const
method to check if address have enough votes to participate in consensus
Definition: final_chain.cpp:474
uint64_t dposEligibleVoteCount(EthBlockNumber blk_num, addr_t const &addr) const
total count of eligible votes account has in DPOS precompiled contract
Definition: final_chain.cpp:470
uint64_t transactionCount(std::optional< EthBlockNumber > n={}) const
Method to get transactions count in block.
Definition: final_chain.cpp:392
MapByBlockCache< addr_t, std::optional< const state_api::Account > > accounts_cache_
Definition: final_chain.hpp:322
BlocksBlooms blockBlooms(const h256 &chunk_id) const
Definition: final_chain.cpp:621
bool isNeedToFinalize(EthBlockNumber blk_num) const
Definition: final_chain.cpp:123
std::vector< state_api::ValidatorVoteCount > dposValidatorsVoteCounts(EthBlockNumber blk_num) const
Definition: final_chain.cpp:490
uint64_t dposEligibleTotalVoteCount(EthBlockNumber blk_num) const
total count of eligible votes are in DPOS precompiled contract
Definition: final_chain.cpp:466
std::shared_ptr< const FinalizationResult > finalize_(PeriodData &&new_blk, std::vector< h256 > &&finalized_dag_blk_hashes, std::shared_ptr< DagBlock > &&anchor)
Definition: final_chain.cpp:151
const bool kLightNode
Definition: final_chain.hpp:306
ValueByBlockCache< const SharedTransactions > transactions_cache_
Definition: final_chain.hpp:320
std::string trace(std::vector< state_api::EVMTransaction > trx, EthBlockNumber blk_n, std::optional< state_api::Tracing > params={}) const
Trace execution of a new message call immediately without creating a transactions on the block chain....
Definition: final_chain.cpp:450
ValueByBlockCache< std::optional< const h256 > > block_hashes_cache_
Definition: final_chain.hpp:319
h256 getBridgeRoot(EthBlockNumber blk_num) const
Definition: final_chain.cpp:503
bytes getCode(addr_t const &addr, std::optional< EthBlockNumber > blk_n={}) const
Returns code at a given address.
Definition: final_chain.cpp:430
void updateStateConfig(const state_api::Config &new_config)
Needed if we are changing params with hardfork and it affects Go part of code. For example DPOS contr...
Definition: final_chain.cpp:421
const FullNodeConfig & kConfig
Definition: final_chain.hpp:333
StateAPI state_api_
Definition: final_chain.hpp:305
FinalChain(FinalChain &&)=delete
rewards::Stats rewards_
Definition: final_chain.hpp:308
std::pair< val_t, bool > getBalance(addr_t const &addr) const
Definition: final_chain.cpp:521
util::EventEmitter< std::shared_ptr< FinalizationResult > > const block_finalized_emitter_
Definition: final_chain.hpp:30
std::shared_ptr< BlockHeader > appendBlock(Batch &batch, const PbftBlock &pbft_blk, const h256 &state_root, u256 total_reward, const SharedTransactions &transactions={}, const TransactionReceipts &receipts={})
Definition: final_chain.cpp:300
u256 dposTotalSupply(EthBlockNumber blk_num) const
Definition: final_chain.cpp:501
MapByBlockCache< addr_t, uint64_t > dpos_is_eligible_cache_
Definition: final_chain.hpp:326
vrf_wrapper::vrf_pk_t dposGetVrfKey(EthBlockNumber blk_n, const addr_t &addr) const
Get the vrf key object from DPOS state.
Definition: final_chain.cpp:478
std::vector< EthBlockNumber > withBlockBloom(LogBloom const &b, EthBlockNumber from, EthBlockNumber to) const
Method used to search for contract logs with bloom filter.
Definition: final_chain.cpp:404
std::shared_ptr< const BlockHeader > getBlockHeader(EthBlockNumber n) const
Definition: final_chain.cpp:564
boost::asio::thread_pool executor_thread_
Definition: final_chain.hpp:311
FinalChain & operator=(const FinalChain &)=delete
std::optional< h256 > finalChainHash(EthBlockNumber n) const
Method to get the final chain hash by block number.
Definition: final_chain.cpp:579
EthBlockNumber lastBlockNumber() const
Method to get last block number(chain size)
Definition: final_chain.cpp:361
EthBlockNumber lastIfAbsent(const std::optional< EthBlockNumber > &client_blk_n) const
Definition: final_chain.cpp:604
EthBlockNumber delegationDelay() const
Definition: final_chain.cpp:112
ValueByBlockCache< std::shared_ptr< const TransactionHashes > > transaction_hashes_cache_
Definition: final_chain.hpp:321
std::mutex finalized_mtx_
Definition: final_chain.hpp:329
static h256 blockBloomsChunkId(EthBlockNumber level, EthBlockNumber index)
Definition: final_chain.cpp:628
main responsibility is blocks execution in EVM, getting data from EVM state
Definition: final_chain.hpp:28
Definition: state_api.hpp:20
std::array< LogBloom, c_bloomIndexSize > BlocksBlooms
Definition: data.hpp:68
dev::h2048 LogBloom
Definition: data.hpp:22
std::vector< TransactionReceipt > TransactionReceipts
Definition: data.hpp:94
PeriodData class is for block execution, that includes PBFT block, certify votes, DAG blocks,...
Definition: period_data.hpp:25
#define LOG_OBJECTS_DEFINE
Definition: logger.hpp:60
boost::multiprecision::number< boost::multiprecision::cpp_int_backend< 256, 256, boost::multiprecision::unsigned_magnitude, boost::multiprecision::unchecked, void > > u256
Definition: Common.h:98
FixedHash< 32 > h256
Definition: FixedHash.h:453
Definition: dag_block_proposer.hpp:21
dev::FixedHash< crypto_vrf_PUBLICKEYBYTES > vrf_pk_t
Definition: vrf_wrapper.hpp:11
rocksdb::WriteBatch Batch
Definition: storage.hpp:73
std::shared_ptr< Transaction > SharedTransaction
Definition: transaction.hpp:79
uint64_t EthBlockNumber
Definition: types.hpp:23
std::vector< byte > bytes
Definition: types.hpp:53
EthBlockNumber PbftPeriod
Definition: types.hpp:24
std::vector< SharedTransaction > SharedTransactions
Definition: transaction.hpp:81
boost::multiprecision::uint256_t uint256_t
Definition: types.hpp:29
uint160_hash_t addr_t
Definition: types.hpp:39
Definition: config.hpp:24
Definition: state_config.hpp:59
Definition: event.hpp:48