TARAXA
Loading...
Searching...
No Matches
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"
10#include "final_chain/data.hpp"
13#include "storage/storage.hpp"
14
15namespace taraxa::final_chain {
16
29 protected:
32
33 public:
36
37 ~FinalChain() = default;
38 FinalChain(const std::shared_ptr<DbStorage>& db, const taraxa::FullNodeConfig& config);
39 FinalChain(const FinalChain&) = delete;
41 FinalChain& operator=(const FinalChain&) = delete;
43
44 void stop();
45
47
56 std::future<std::shared_ptr<const FinalizationResult>> finalize(PeriodData&& period_data,
57 std::vector<h256>&& finalized_dag_blk_hashes,
58 std::shared_ptr<DagBlock>&& anchor = nullptr);
59
66 std::shared_ptr<const BlockHeader> blockHeader(std::optional<EthBlockNumber> n = {}) const;
67
73
80 std::optional<EthBlockNumber> blockNumber(h256 const& h) const;
81
88 std::optional<h256> blockHash(std::optional<EthBlockNumber> n = {}) const;
89
96 std::optional<h256> finalChainHash(EthBlockNumber n) const;
97
102 void updateStateConfig(const state_api::Config& new_config);
103
109 std::shared_ptr<const TransactionHashes> transactionHashes(std::optional<EthBlockNumber> n = {}) const;
110
116 const SharedTransactions transactions(std::optional<EthBlockNumber> n = {}) const;
117
123 std::optional<TransactionLocation> transactionLocation(h256 const& trx_hash) const;
124
131 std::optional<TransactionReceipt> transactionReceipt(EthBlockNumber blk_n, uint64_t position,
132 std::optional<trx_hash_t> trx_hash = {}) const;
133
134 std::shared_ptr<Transaction> transaction(EthBlockNumber blk_n, uint32_t position) const {
135 auto blk_trxs = transactions_cache_.getFromCache(blk_n);
136 if (blk_trxs) {
137 return (*blk_trxs)[position];
138 }
139 return db_->getTransaction(blk_n, position);
140 }
141
147 uint64_t transactionCount(std::optional<EthBlockNumber> n = {}) const;
148
156 std::vector<EthBlockNumber> withBlockBloom(LogBloom const& b, EthBlockNumber from, EthBlockNumber to) const;
157
165 std::optional<state_api::Account> getAccount(addr_t const& addr, std::optional<EthBlockNumber> blk_n = {}) const;
166
174 h256 getAccountStorage(addr_t const& addr, u256 const& key, std::optional<EthBlockNumber> blk_n = {}) const;
181 bytes getCode(addr_t const& addr, std::optional<EthBlockNumber> blk_n = {}) const;
182
190 state_api::ExecutionResult call(state_api::EVMTransaction const& trx, std::optional<EthBlockNumber> blk_n = {}) const;
191
199 std::string trace(std::vector<state_api::EVMTransaction> state_trxs, std::vector<state_api::EVMTransaction> trxs,
200 EthBlockNumber blk_n, std::optional<state_api::Tracing> params = {}) const;
201
207 uint64_t dposEligibleTotalVoteCount(EthBlockNumber blk_num) const;
208
215 uint64_t dposEligibleVoteCount(EthBlockNumber blk_num, addr_t const& addr) const;
216
223 bool dposIsEligible(EthBlockNumber blk_num, addr_t const& addr) const;
224
232
237 void prune(EthBlockNumber blk_n);
238
242 void waitForFinalized();
243
244 std::vector<state_api::ValidatorStake> dposValidatorsTotalStakes(EthBlockNumber blk_num) const;
245
247
252 std::vector<state_api::ValidatorVoteCount> dposValidatorsVoteCounts(EthBlockNumber blk_num) const;
253
258 uint64_t dposYield(EthBlockNumber blk_num) const;
259
264 u256 dposTotalSupply(EthBlockNumber blk_num) const;
265
270 h256 getBridgeRoot(EthBlockNumber blk_num) const;
271
276 h256 getBridgeEpoch(EthBlockNumber blk_num) const;
277
278 // TODO move out of here:
279 std::pair<val_t, bool> getBalance(addr_t const& addr) const;
280 std::shared_ptr<const FinalizationResult> finalize_(PeriodData&& new_blk,
281 std::vector<h256>&& finalized_dag_blk_hashes,
282 std::shared_ptr<DagBlock>&& anchor);
283
284 SharedTransactionReceipts blockReceipts(std::optional<EthBlockNumber> n = {}) const;
285
286 private:
287 const SharedTransactions getTransactions(std::optional<EthBlockNumber> n = {}) const;
288 std::shared_ptr<TransactionHashes> getTransactionHashes(std::optional<EthBlockNumber> n = {}) const;
289 SharedTransactionReceipts getBlockReceipts(std::optional<EthBlockNumber> n = {}) const;
290 std::shared_ptr<const BlockHeader> getBlockHeader(EthBlockNumber n) const;
291 std::optional<h256> getBlockHash(EthBlockNumber n) const;
292 EthBlockNumber lastIfAbsent(const std::optional<EthBlockNumber>& client_blk_n) const;
293 static state_api::EVMTransaction toEvmTransaction(const SharedTransaction& trx);
294 static void appendEvmTransactions(std::vector<state_api::EVMTransaction>& evm_trxs, const SharedTransactions& trxs);
295 BlocksBlooms blockBlooms(const h256& chunk_id) const;
297 std::vector<EthBlockNumber> withBlockBloom(const LogBloom& b, EthBlockNumber from, EthBlockNumber to,
298 EthBlockNumber level, EthBlockNumber index) const;
299 bool isNeedToFinalize(EthBlockNumber blk_num) const;
300
302 std::vector<SharedTransaction> makeSystemTransactions(PbftPeriod blk_num);
303
304 std::shared_ptr<BlockHeader> makeGenesisHeader(std::string&& raw_header) const;
305 std::shared_ptr<BlockHeader> makeGenesisHeader(const h256& state_root) const;
306
307 std::pair<h256, LogBloom> processReceipts(Batch& batch, EthBlockNumber blk_n, const TransactionReceipts& receipts);
308 std::shared_ptr<BlockHeader> appendBlock(Batch& batch, const PbftBlock& pbft_blk, const h256& state_root,
309 u256 total_reward, const SharedTransactions& transactions = {},
310 const TransactionReceipts& receipts = {});
311 std::shared_ptr<BlockHeader> appendBlock(Batch& batch, std::shared_ptr<BlockHeader> header,
313 const TransactionReceipts& receipts = {});
314
315 private:
316 std::shared_ptr<DbStorage> db_;
317 const uint64_t kBlockGasLimit;
319 const bool kLightNode = false;
320 const uint32_t kMaxLevelsPerPeriod;
322
323 // It is not prepared to use more then 1 thread. Examine it if you want to change threads count
324 boost::asio::thread_pool executor_thread_{1};
325
326 std::atomic<uint64_t> num_executed_dag_blk_ = 0;
327 std::atomic<uint64_t> num_executed_trx_ = 0;
328
330
336
340
342
343 std::condition_variable finalized_cv_;
344 std::mutex finalized_mtx_;
345
346 std::atomic<EthBlockNumber> last_block_number_;
347
350};
351
354} // namespace taraxa::final_chain
Definition FixedHash.h:35
Definition cache.hpp:31
Definition cache.hpp:102
std::optional< Value > getFromCache(uint64_t block_num) const
Definition cache.hpp:125
class that is managing rewards stats processing and hardforks(intervals changes) So intermediate bloc...
Definition rewards_stats.hpp:13
std::string trace(std::vector< state_api::EVMTransaction > state_trxs, std::vector< state_api::EVMTransaction > trxs, 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:488
logger::Logger logger_
Definition final_chain.hpp:349
MapByBlockCache< addr_t, uint64_t > dpos_vote_count_cache_
Definition final_chain.hpp:338
const uint64_t kBlockGasLimit
Definition final_chain.hpp:317
ValueByBlockCache< std::shared_ptr< const BlockHeader > > block_headers_cache_
Definition final_chain.hpp:331
SharedTransaction makeBridgeFinalizationTransaction()
Definition final_chain.cpp:129
std::optional< EthBlockNumber > blockNumber(h256 const &h) const
Method to get block number by hash.
Definition final_chain.cpp:382
std::shared_ptr< DbStorage > db_
Definition final_chain.hpp:316
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:464
FinalChain & operator=(FinalChain &&)=delete
std::atomic< uint64_t > num_executed_dag_blk_
Definition final_chain.hpp:326
EthBlockNumber delegation_delay_
Definition final_chain.hpp:329
std::shared_ptr< BlockHeader > makeGenesisHeader(std::string &&raw_header) const
Definition final_chain.cpp:586
static state_api::EVMTransaction toEvmTransaction(const SharedTransaction &trx)
Definition final_chain.cpp:647
void prune(EthBlockNumber blk_n)
Prune state db for all blocks older than blk_n.
Definition final_chain.cpp:289
SharedTransactionReceipts getBlockReceipts(std::optional< EthBlockNumber > n={}) const
Definition final_chain.cpp:426
decltype(block_finalized_emitter_) ::Subscriber const & block_finalized_
Definition final_chain.hpp:34
void stop()
Definition final_chain.cpp:113
void waitForFinalized()
Wait until next block is finalized.
Definition final_chain.cpp:533
h256 getBridgeEpoch(EthBlockNumber blk_num) const
Definition final_chain.cpp:551
uint256_t dposTotalAmountDelegated(EthBlockNumber blk_num) const
Definition final_chain.cpp:525
const SharedTransactions getTransactions(std::optional< EthBlockNumber > n={}) const
Definition final_chain.cpp:579
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:390
static void appendEvmTransactions(std::vector< state_api::EVMTransaction > &evm_trxs, const SharedTransactions &trxs)
Definition final_chain.cpp:654
std::optional< h256 > blockHash(std::optional< EthBlockNumber > n={}) const
Method to get block hash by block number.
Definition final_chain.cpp:386
ValueByBlockCache< uint64_t > total_vote_count_cache_
Definition final_chain.hpp:337
FinalChain & operator=(const FinalChain &)=delete
std::optional< TransactionReceipt > transactionReceipt(EthBlockNumber blk_n, uint64_t position, std::optional< trx_hash_t > trx_hash={}) const
Method to get transaction receipt by block number and position.
Definition final_chain.cpp:401
std::optional< h256 > getBlockHash(EthBlockNumber n) const
Definition final_chain.cpp:635
std::atomic< uint64_t > num_executed_trx_
Definition final_chain.hpp:327
std::shared_ptr< const TransactionHashes > transactionHashes(std::optional< EthBlockNumber > n={}) const
Method to get all transaction hashes from the block.
Definition final_chain.cpp:434
FinalChain(const FinalChain &)=delete
std::shared_ptr< TransactionHashes > getTransactionHashes(std::optional< EthBlockNumber > n={}) const
Definition final_chain.cpp:567
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:472
ValueByBlockCache< SharedTransactionReceipts > block_receipts_cache_
Definition final_chain.hpp:341
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:115
std::atomic< EthBlockNumber > last_block_number_
Definition final_chain.hpp:346
std::vector< SharedTransaction > makeSystemTransactions(PbftPeriod blk_num)
Definition final_chain.cpp:148
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:454
std::vector< state_api::ValidatorStake > dposValidatorsTotalStakes(EthBlockNumber blk_num) const
Definition final_chain.cpp:521
const SharedTransactions transactions(std::optional< EthBlockNumber > n={}) const
Method to get all transactions from the block.
Definition final_chain.cpp:438
std::condition_variable finalized_cv_
Definition final_chain.hpp:343
std::optional< TransactionLocation > transactionLocation(h256 const &trx_hash) const
Method to get transaction location by hash.
Definition final_chain.cpp:397
uint64_t dposYield(EthBlockNumber blk_num) const
Definition final_chain.cpp:538
const uint32_t kMaxLevelsPerPeriod
Definition final_chain.hpp:320
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:513
std::shared_ptr< Transaction > transaction(EthBlockNumber blk_n, uint32_t position) const
Definition final_chain.hpp:134
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:509
uint64_t transactionCount(std::optional< EthBlockNumber > n={}) const
Method to get transactions count in block.
Definition final_chain.cpp:430
MapByBlockCache< addr_t, std::optional< const state_api::Account > > accounts_cache_
Definition final_chain.hpp:335
BlocksBlooms blockBlooms(const h256 &chunk_id) const
Definition final_chain.cpp:660
bool isNeedToFinalize(EthBlockNumber blk_num) const
Definition final_chain.cpp:138
std::vector< state_api::ValidatorVoteCount > dposValidatorsVoteCounts(EthBlockNumber blk_num) const
Definition final_chain.cpp:529
uint64_t dposEligibleTotalVoteCount(EthBlockNumber blk_num) const
total count of eligible votes are in DPOS precompiled contract
Definition final_chain.cpp:505
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:166
const bool kLightNode
Definition final_chain.hpp:319
ValueByBlockCache< const SharedTransactions > transactions_cache_
Definition final_chain.hpp:333
ValueByBlockCache< std::optional< const h256 > > block_hashes_cache_
Definition final_chain.hpp:332
h256 getBridgeRoot(EthBlockNumber blk_num) const
Definition final_chain.cpp:542
bytes getCode(addr_t const &addr, std::optional< EthBlockNumber > blk_n={}) const
Returns code at a given address.
Definition final_chain.cpp:468
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:459
const FullNodeConfig & kConfig
Definition final_chain.hpp:348
StateAPI state_api_
Definition final_chain.hpp:318
FinalChain(FinalChain &&)=delete
rewards::Stats rewards_
Definition final_chain.hpp:321
std::pair< val_t, bool > getBalance(addr_t const &addr) const
Definition final_chain.cpp:560
SharedTransactionReceipts blockReceipts(std::optional< EthBlockNumber > n={}) const
Definition final_chain.cpp:419
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:315
u256 dposTotalSupply(EthBlockNumber blk_num) const
Definition final_chain.cpp:540
MapByBlockCache< addr_t, uint64_t > dpos_is_eligible_cache_
Definition final_chain.hpp:339
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:517
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:442
std::shared_ptr< const BlockHeader > getBlockHeader(EthBlockNumber n) const
Definition final_chain.cpp:603
boost::asio::thread_pool executor_thread_
Definition final_chain.hpp:324
std::optional< h256 > finalChainHash(EthBlockNumber n) const
Method to get the final chain hash by block number.
Definition final_chain.cpp:618
EthBlockNumber lastBlockNumber() const
Method to get last block number(chain size)
Definition final_chain.cpp:380
EthBlockNumber lastIfAbsent(const std::optional< EthBlockNumber > &client_blk_n) const
Definition final_chain.cpp:643
EthBlockNumber delegationDelay() const
Definition final_chain.cpp:127
ValueByBlockCache< std::shared_ptr< const TransactionHashes > > transaction_hashes_cache_
Definition final_chain.hpp:334
std::mutex finalized_mtx_
Definition final_chain.hpp:344
static h256 blockBloomsChunkId(EthBlockNumber level, EthBlockNumber index)
Definition final_chain.cpp:667
std::pair< h256, LogBloom > processReceipts(Batch &batch, EthBlockNumber blk_n, const TransactionReceipts &receipts)
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:73
The PbftBlock class is a PBFT block class that includes PBFT block hash, previous PBFT block hash,...
Definition pbft_block.hpp:22
PeriodData class is for block execution, that includes PBFT block, certify votes, DAG blocks,...
Definition period_data.hpp:26
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 app_base.hpp:22
std::shared_ptr< spdlog::logger > Logger
Definition logging.hpp:12
dev::FixedHash< crypto_vrf_PUBLICKEYBYTES > vrf_pk_t
Definition vrf_wrapper.hpp:11
rocksdb::WriteBatch Batch
Definition storage.hpp:70
std::shared_ptr< Transaction > SharedTransaction
Definition transaction.hpp:84
uint64_t EthBlockNumber
Definition types.hpp:24
std::shared_ptr< std::vector< TransactionReceipt > > SharedTransactionReceipts
Definition receipt.hpp:54
std::vector< TransactionReceipt > TransactionReceipts
Definition receipt.hpp:35
std::vector< byte > bytes
Definition types.hpp:53
EthBlockNumber PbftPeriod
Definition types.hpp:25
std::vector< SharedTransaction > SharedTransactions
Definition transaction.hpp:86
boost::multiprecision::uint256_t uint256_t
Definition types.hpp:30
dev::h2048 LogBloom
Definition receipt.hpp:8
uint160_hash_t addr_t
Definition types.hpp:40
Definition config.hpp:41
Definition state_config.hpp:59
Definition event.hpp:48