1
0
Fork 0
mirror of https://github.com/ton-blockchain/ton synced 2025-02-12 19:22:37 +00:00
ton/validator/impl/shard.hpp
SpyCheese 908415d00b
Accelerator, part 1 (#1119)
This commit contains some parts of https://github.com/ton-blockchain/ton/tree/accelerator
This is auxiliary code that mostly does not change node behavior.

1) Semiprivate overlays and other improvements in overlays code
2) Rename actual_min_split -> monitor_min_split, fix building shard overlays
3) Loading block candidates by block id from DB, fix accept_block after validator restart
4) Cells: ProofStorageStat and changes in CellUsageTree
5) Remove some unused code, other minor changes
2024-08-23 11:46:40 +03:00

175 lines
6.5 KiB
C++

/*
This file is part of TON Blockchain Library.
TON Blockchain Library is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation, either version 2 of the License, or
(at your option) any later version.
TON Blockchain Library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License
along with TON Blockchain Library. If not, see <http://www.gnu.org/licenses/>.
Copyright 2017-2020 Telegram Systems LLP
*/
#pragma once
#include "interfaces/shard.h"
#include "vm/db/StaticBagOfCellsDb.h"
#include "block/mc-config.h"
#include "config.hpp"
namespace ton {
namespace validator {
using td::Ref;
class ShardStateQ : virtual public ShardState {
protected:
BlockIdExt blkid;
private:
RootHash rhash;
td::BufferSlice data;
std::vector<std::shared_ptr<vm::StaticBagOfCellsDb>> bocs_;
Ref<vm::Cell> root;
LogicalTime lt{0};
UnixTime utime{0};
bool before_split_{false};
bool fake_split_{false};
bool fake_merge_{false};
td::optional<BlockIdExt> master_ref;
protected:
friend class Ref<ShardStateQ>;
ShardStateQ(const ShardStateQ& other);
ShardStateQ(ShardStateQ&& other) = default;
public:
td::Status init();
ShardStateQ(const BlockIdExt& _id, td::BufferSlice _data);
ShardStateQ(const BlockIdExt& _id, Ref<vm::Cell> _root, td::BufferSlice _data = {});
virtual ~ShardStateQ() = default;
static td::Result<Ref<ShardStateQ>> fetch(const BlockIdExt& _id, td::BufferSlice _data, Ref<vm::Cell> _root = {});
bool disable_boc() const override {
return false;
}
ShardIdFull get_shard() const override {
return ShardIdFull(blkid);
}
BlockSeqno get_seqno() const override {
return blkid.id.seqno;
}
BlockIdExt get_block_id() const override {
return blkid;
}
RootHash root_hash() const override {
return rhash;
}
Ref<vm::Cell> root_cell() const override {
return root;
}
bool before_split() const override {
return before_split_;
}
UnixTime get_unix_time() const override {
return utime;
}
LogicalTime get_logical_time() const override {
return lt;
}
td::optional<BlockIdExt> get_master_ref() const override {
return master_ref;
}
td::Status validate_deep() const override;
ShardStateQ* make_copy() const override;
td::Result<Ref<MessageQueue>> message_queue() const override;
td::Status apply_block(BlockIdExt id, Ref<BlockData> block) override;
td::Result<Ref<ShardState>> merge_with(const ShardState& with) const override;
td::Result<std::pair<Ref<ShardState>, Ref<ShardState>>> split() const override;
td::Result<td::BufferSlice> serialize() const override;
td::Status serialize_to_file(td::FileFd& fd) const override;
};
#if TD_MSVC
#pragma warning(push)
#pragma warning(disable : 4250) // MasterchainState is an interface, so there is no problem here
#endif
class MasterchainStateQ : public MasterchainState, public ShardStateQ {
public:
MasterchainStateQ(const BlockIdExt& _id, td::BufferSlice _data);
MasterchainStateQ(const BlockIdExt& _id, Ref<vm::Cell> _root, td::BufferSlice _data = {});
virtual ~MasterchainStateQ() = default;
td::Status apply_block(BlockIdExt id, Ref<BlockData> block) override;
Ref<ValidatorSet> get_validator_set(ShardIdFull shard) const override;
Ref<ValidatorSet> get_next_validator_set(ShardIdFull shard) const override;
Ref<ValidatorSet> get_total_validator_set(int next) const override; // next = -1 -> prev, next = 0 -> cur
Ref<ValidatorSet> get_validator_set(ShardIdFull shard, UnixTime ts, CatchainSeqno cc_seqno) const;
bool rotated_all_shards() const override;
std::vector<Ref<McShardHash>> get_shards() const override;
td::Ref<McShardHash> get_shard_from_config(ShardIdFull shard) const override;
bool ancestor_is_valid(BlockIdExt id) const override {
return check_old_mc_block_id(id);
}
bool workchain_is_active(WorkchainId workchain_id) const override {
return has_workchain(workchain_id);
}
bool has_workchain(WorkchainId workchain) const {
return config_ && config_->has_workchain(workchain);
}
td::uint32 monitor_min_split_depth(WorkchainId workchain_id) const override;
td::uint32 min_split_depth(WorkchainId workchain_id) const override;
BlockSeqno min_ref_masterchain_seqno() const override;
td::Status prepare() override;
ZeroStateIdExt get_zerostate_id() const {
return zerostate_id_;
}
ValidatorSessionConfig get_consensus_config() const override {
return config_->get_consensus_config();
}
block::SizeLimitsConfig::ExtMsgLimits get_ext_msg_limits() const override {
auto R = config_->get_size_limits_config();
return R.is_error() ? block::SizeLimitsConfig::ExtMsgLimits() : R.ok_ref().ext_msg_limits;
}
BlockIdExt last_key_block_id() const override;
BlockIdExt next_key_block_id(BlockSeqno seqno) const override;
BlockIdExt prev_key_block_id(BlockSeqno seqno) const override;
bool is_key_state() const override;
MasterchainStateQ* make_copy() const override;
static td::Result<Ref<MasterchainStateQ>> fetch(const BlockIdExt& _id, td::BufferSlice _data,
Ref<vm::Cell> _root = {});
bool get_old_mc_block_id(ton::BlockSeqno seqno, ton::BlockIdExt& blkid,
ton::LogicalTime* end_lt = nullptr) const override;
bool check_old_mc_block_id(const ton::BlockIdExt& blkid, bool strict = false) const override;
std::shared_ptr<block::ConfigInfo> get_config() const {
return config_;
}
td::Result<td::Ref<ConfigHolder>> get_config_holder() const override {
if (!config_) {
return td::Status::Error(ErrorCode::notready, "config not found");
} else {
return td::make_ref<ConfigHolderQ>(config_);
}
}
private:
ZeroStateIdExt zerostate_id_;
std::shared_ptr<block::ConfigInfo> config_;
std::shared_ptr<block::ValidatorSet> cur_validators_, next_validators_;
MasterchainStateQ(const MasterchainStateQ& other) = default;
td::Status mc_init();
td::Status mc_reinit();
Ref<ValidatorSet> compute_validator_set(ShardIdFull shard, const block::ValidatorSet& vset, UnixTime time,
CatchainSeqno cc_seqno) const;
};
#if TD_MSVC
#pragma warning(pop)
#endif
} // namespace validator
} // namespace ton