From 011e97f53c1610ead70e59f662f14d4a7be268d6 Mon Sep 17 00:00:00 2001 From: SpyCheese Date: Mon, 15 Aug 2022 19:27:19 +0300 Subject: [PATCH] Flag "full collated data" in mc config; fix accept-block --- crypto/block/block.tlb | 8 ++++---- crypto/block/mc-config.cpp | 24 ++++++++++++++++++++++++ crypto/block/mc-config.h | 11 +++++++++++ ton/ton-types.h | 5 ----- validator/fabric.h | 2 +- validator/impl/accept-block.cpp | 2 ++ validator/impl/accept-block.hpp | 1 + validator/impl/collator-impl.h | 1 + validator/impl/collator.cpp | 5 +++++ validator/impl/shard.cpp | 21 --------------------- validator/impl/shard.hpp | 4 +++- validator/impl/validate-query.cpp | 16 ++++++++-------- validator/impl/validate-query.hpp | 6 +++--- validator/interfaces/shard.h | 2 +- validator/manager.cpp | 8 ++++---- validator/validator-group.cpp | 9 +++++---- validator/validator-group.hpp | 6 +++--- 17 files changed, 76 insertions(+), 55 deletions(-) diff --git a/crypto/block/block.tlb b/crypto/block/block.tlb index c9a95535..8cb6c2f0 100644 --- a/crypto/block/block.tlb +++ b/crypto/block/block.tlb @@ -734,15 +734,15 @@ misbehaviour_punishment_config_v1#01 = MisbehaviourPunishmentConfig; _ MisbehaviourPunishmentConfig = ConfigParam 40; +// collator_nodes: each collator is (workchain:int32 shard:uint64 adnl_id:uint256) +colator_config#a0 full_collated_data:Bool collator_nodes:(HashmapE 352 Unit) = CollatorConfig; +_ CollatorConfig = ConfigParam 41; + oracle_bridge_params#_ bridge_address:bits256 oracle_mutlisig_address:bits256 oracles:(HashmapE 256 uint256) external_chain_address:bits256 = OracleBridgeParams; _ OracleBridgeParams = ConfigParam 71; // Ethereum bridge _ OracleBridgeParams = ConfigParam 72; // Binance Smart Chain bridge _ OracleBridgeParams = ConfigParam 73; // Polygon bridge -// Set of collators: each collator is (workchain:int32 shard:int64 adnl_id:int256) -colator_set#a0 collators:(HashmapE 352 Unit) = CollatorSet; -_ CollatorSet = ConfigParam 81; - // // PROOFS // diff --git a/crypto/block/mc-config.cpp b/crypto/block/mc-config.cpp index b5409a62..a1ddfb3e 100644 --- a/crypto/block/mc-config.cpp +++ b/crypto/block/mc-config.cpp @@ -2132,4 +2132,28 @@ Ref ConfigInfo::lookup_library(td::ConstBitPtr root_hash) const { return lib; } +CollatorConfig Config::get_collator_config(bool need_collator_nodes) const { + CollatorConfig collator_config; + gen::CollatorConfig::Record rec; + auto cell = get_config_param(41); + if (cell.is_null() || !tlb::unpack_cell(std::move(cell), rec)) { + return collator_config; + } + collator_config.full_collated_data = rec.full_collated_data; + if (need_collator_nodes) { + vm::Dictionary dict{rec.collator_nodes->prefetch_ref(), 32 + 64 + 256}; + dict.check_for_each([&](Ref, td::ConstBitPtr key, int n) { + CHECK(n == 32 + 64 + 256); + auto workchain = (td::int32)key.get_int(32); + key.advance(32); + td::uint64 shard = key.get_uint(64); + key.advance(64); + td::Bits256 adnl_id(key); + collator_config.collator_nodes.push_back({ton::ShardIdFull(workchain, shard), adnl_id}); + return true; + }); + } + return collator_config; +} + } // namespace block diff --git a/crypto/block/mc-config.h b/crypto/block/mc-config.h index 8be3f6e6..7058117b 100644 --- a/crypto/block/mc-config.h +++ b/crypto/block/mc-config.h @@ -482,6 +482,16 @@ class ShardConfig { bool set_shard_info(ton::ShardIdFull shard, Ref value); }; +struct CollatorNodeDescr { + ton::ShardIdFull shard; + ton::NodeIdShort adnl_id; +}; + +struct CollatorConfig { + bool full_collated_data = false; + std::vector collator_nodes; +}; + class Config { enum { default_mc_catchain_lifetime = 200, @@ -593,6 +603,7 @@ class Config { std::vector compute_validator_set(ton::ShardIdFull shard, ton::UnixTime time, ton::CatchainSeqno cc_seqno) const; std::vector compute_total_validator_set(int next) const; + CollatorConfig get_collator_config(bool need_collator_nodes) const; static std::vector do_compute_validator_set(const block::CatchainValidatorsConfig& ccv_conf, ton::ShardIdFull shard, const block::ValidatorSet& vset, ton::UnixTime time, diff --git a/ton/ton-types.h b/ton/ton-types.h index 7d0101d1..36c137b9 100644 --- a/ton/ton-types.h +++ b/ton/ton-types.h @@ -484,9 +484,4 @@ struct ValidatorSessionConfig { static const td::uint32 BLOCK_HASH_COVERS_DATA_FROM_VERSION = 2; }; -struct CollatorNodeDescr { - ShardIdFull shard; - NodeIdShort adnl_id; -}; - } // namespace ton diff --git a/validator/fabric.h b/validator/fabric.h index 12452ec5..069a0470 100644 --- a/validator/fabric.h +++ b/validator/fabric.h @@ -25,7 +25,7 @@ namespace ton { namespace validator { -enum ValidateMode { fake = 1, lite = 2 }; +enum ValidateMode { fake = 1, full_collated_data = 2 }; td::actor::ActorOwn create_db_actor(td::actor::ActorId manager, std::string db_root_); td::actor::ActorOwn create_liteserver_cache_actor(td::actor::ActorId manager, diff --git a/validator/impl/accept-block.cpp b/validator/impl/accept-block.cpp index 6491a711..c3e20c0e 100644 --- a/validator/impl/accept-block.cpp +++ b/validator/impl/accept-block.cpp @@ -144,6 +144,7 @@ bool AcceptBlockQuery::precheck_header() { if (is_fork_ && !info.key_block) { return fatal_error("fork block is not a key block"); } + before_split_ = info.before_split; return true; } @@ -538,6 +539,7 @@ void AcceptBlockQuery::written_state(td::Ref upd_state) { } //handle_->set_masterchain_block(prev_[0]); + handle_->set_split(before_split_); handle_->set_state_root_hash(state_hash_); handle_->set_logical_time(lt_); handle_->set_unix_time(created_at_); diff --git a/validator/impl/accept-block.hpp b/validator/impl/accept-block.hpp index 1a1f2a54..e0e27ec2 100644 --- a/validator/impl/accept-block.hpp +++ b/validator/impl/accept-block.hpp @@ -115,6 +115,7 @@ class AcceptBlockQuery : public td::actor::Actor { UnixTime created_at_; RootHash state_keep_old_hash_, state_old_hash_, state_hash_; BlockIdExt mc_blkid_, prev_mc_blkid_; + bool before_split_; Ref last_mc_state_; BlockIdExt last_mc_id_; diff --git a/validator/impl/collator-impl.h b/validator/impl/collator-impl.h index c19199c8..b886173a 100644 --- a/validator/impl/collator-impl.h +++ b/validator/impl/collator-impl.h @@ -128,6 +128,7 @@ class Collator final : public td::actor::Actor { void alarm() override; int verbosity{3 * 0}; int verify{1}; + bool full_collated_data_ = false; ton::LogicalTime start_lt, max_lt; ton::UnixTime now_; ton::UnixTime prev_now_; diff --git a/validator/impl/collator.cpp b/validator/impl/collator.cpp index e116a935..3468bc5d 100644 --- a/validator/impl/collator.cpp +++ b/validator/impl/collator.cpp @@ -572,6 +572,8 @@ bool Collator::unpack_last_mc_state() { << " have been enabled in global configuration, but we support only " << supported_version() << " (upgrade validator software?)"; } + full_collated_data_ = config_->get_collator_config(false).full_collated_data; + LOG(DEBUG) << "full_collated_data is " << full_collated_data_; // TODO: extract start_lt and end_lt from prev_mc_block as well // std::cerr << " block::gen::ShardState::print_ref(mc_state_root) = "; // block::gen::t_ShardState.print_ref(std::cerr, mc_state_root, 2); @@ -3982,6 +3984,9 @@ bool Collator::create_collated_data() { } collated_roots_.push_back(std::move(cell)); } + if (!full_collated_data_) { + return true; + } // 2. Proofs for hashes of states: previous states + neighbors for (const auto& p : block_state_proofs_) { collated_roots_.push_back(p.second); diff --git a/validator/impl/shard.cpp b/validator/impl/shard.cpp index dbf24400..019ecbeb 100644 --- a/validator/impl/shard.cpp +++ b/validator/impl/shard.cpp @@ -511,27 +511,6 @@ bool MasterchainStateQ::check_old_mc_block_id(const ton::BlockIdExt& blkid, bool return config_ && config_->check_old_mc_block_id(blkid, strict); } -std::vector MasterchainStateQ::get_collator_set() const { - block::gen::CollatorSet::Record rec; - auto cell = config_->get_config_param(81); - if (cell.is_null() || !tlb::unpack_cell(std::move(cell), rec)) { - return {}; - } - vm::Dictionary dict{rec.collators->prefetch_ref(), 32 + 64 + 256}; - std::vector collators; - dict.check_for_each([&](Ref, td::ConstBitPtr key, int n) { - CHECK(n == 32 + 64 + 256); - auto workchain = (td::int32)key.get_int(32); - key.advance(32); - td::uint64 shard = key.get_uint(64); - key.advance(64); - td::Bits256 adnl_id(key); - collators.push_back({ShardIdFull(workchain, shard), adnl_id}); - return true; - }); - return collators; -} - td::uint32 MasterchainStateQ::min_split_depth(WorkchainId workchain_id) const { if (!config_) { return 0; diff --git a/validator/impl/shard.hpp b/validator/impl/shard.hpp index 2b411d94..6b95c7e4 100644 --- a/validator/impl/shard.hpp +++ b/validator/impl/shard.hpp @@ -150,7 +150,9 @@ class MasterchainStateQ : public MasterchainState, public ShardStateQ { block::WorkchainSet get_workchain_list() const override { return config_ ? config_->get_workchain_list() : block::WorkchainSet(); } - std::vector get_collator_set() const override; + block::CollatorConfig get_collator_config(bool need_collator_nodes) const override { + return config_ ? config_->get_collator_config(need_collator_nodes) : block::CollatorConfig(); + } private: ZeroStateIdExt zerostate_id_; diff --git a/validator/impl/validate-query.cpp b/validator/impl/validate-query.cpp index 369f1f2a..eeb2726c 100644 --- a/validator/impl/validate-query.cpp +++ b/validator/impl/validate-query.cpp @@ -63,10 +63,9 @@ ValidateQuery::ValidateQuery(ShardIdFull shard, BlockIdExt min_masterchain_block , timeout(timeout) , main_promise(std::move(promise)) , is_fake_(mode & ValidateMode::fake) - , is_lite_(mode & ValidateMode::lite) + , full_collated_data_(mode & ValidateMode::full_collated_data) , shard_pfx_(shard_.shard) , shard_pfx_len_(ton::shard_prefix_length(shard_)) { - proc_hash_.zero(); } void ValidateQuery::alarm() { @@ -158,6 +157,7 @@ void ValidateQuery::finish_query() { void ValidateQuery::start_up() { LOG(INFO) << "validate query for " << block_candidate.id.to_str() << " started"; + LOG(DEBUG) << "full_collated_data is " << full_collated_data_; alarm_timestamp() = timeout; rand_seed_.set_zero(); created_by_ = block_candidate.pubkey; @@ -258,9 +258,9 @@ void ValidateQuery::start_up() { td::actor::send_closure_later( std::move(self), &ValidateQuery::after_get_latest_mc_state, std::move(res)); }); - // 3. load state(s) corresponding to previous block(s) (non-lite mode or masterchain) + // 3. load state(s) corresponding to previous block(s) (not full-collaoted-data or masterchain) prev_states.resize(prev_blocks.size()); - if (is_masterchain() || !is_lite_) { + if (is_masterchain() || !full_collated_data_) { for (int i = 0; (unsigned)i < prev_blocks.size(); i++) { // 3.1. load state LOG(DEBUG) << "sending wait_block_state() query #" << i << " for " << prev_blocks[i].to_str() << " to Manager"; @@ -991,8 +991,8 @@ bool ValidateQuery::check_this_shard_mc_info() { */ bool ValidateQuery::compute_prev_state() { - if (!is_masterchain() && is_lite_) { - return compute_prev_state_lite_mode(); + if (!is_masterchain() && full_collated_data_) { + return compute_prev_state_from_collated_data(); } CHECK(prev_states.size() == 1u + after_merge_); prev_state_root_ = prev_states[0]->root_cell(); @@ -1012,7 +1012,7 @@ bool ValidateQuery::compute_prev_state() { return true; } -bool ValidateQuery::compute_prev_state_lite_mode() { +bool ValidateQuery::compute_prev_state_from_collated_data() { td::Bits256 state_hash; if (id_.seqno() == 1) { if (prev_blocks.size() != 1) { @@ -1255,7 +1255,7 @@ bool ValidateQuery::request_neighbor_queues() { neighbors_.emplace_back(*shard_ptr); } int i = 0; - if (is_lite_) { + if (full_collated_data_) { for (block::McShardDescr& descr : neighbors_) { LOG(DEBUG) << "getting outbound queue of neighbor #" << i << " from collated data : " << descr.blk_.to_str(); td::Bits256 state_root_hash; diff --git a/validator/impl/validate-query.hpp b/validator/impl/validate-query.hpp index 6fe8010f..48c20e6c 100644 --- a/validator/impl/validate-query.hpp +++ b/validator/impl/validate-query.hpp @@ -141,7 +141,7 @@ class ValidateQuery : public td::actor::Actor { bool is_key_block_{false}; bool update_shard_cc_{false}; bool is_fake_{false}; - bool is_lite_{false}; + bool full_collated_data_{false}; bool prev_key_block_exists_{false}; bool debug_checks_{false}; bool outq_cleanup_partial_{false}; @@ -221,7 +221,7 @@ class ValidateQuery : public td::actor::Actor { td::RefInt256 import_fees_; ton::LogicalTime proc_lt_{0}, claimed_proc_lt_{0}, min_enq_lt_{~0ULL}; - ton::Bits256 proc_hash_, claimed_proc_hash_, min_enq_hash_; + ton::Bits256 proc_hash_ = ton::Bits256::zero(), claimed_proc_hash_, min_enq_hash_; bool inbound_queues_empty_{false}; std::vector> msg_proc_lt_; @@ -286,7 +286,7 @@ class ValidateQuery : public td::actor::Actor { bool extract_collated_data(); bool try_validate(); bool compute_prev_state(); - bool compute_prev_state_lite_mode(); + bool compute_prev_state_from_collated_data(); bool compute_next_state(); bool unpack_merge_prev_state(); bool unpack_prev_state(); diff --git a/validator/interfaces/shard.h b/validator/interfaces/shard.h index ff458d60..15caa7b2 100644 --- a/validator/interfaces/shard.h +++ b/validator/interfaces/shard.h @@ -82,7 +82,7 @@ class MasterchainState : virtual public ShardState { virtual bool check_old_mc_block_id(const ton::BlockIdExt& blkid, bool strict = false) const = 0; virtual td::Result> get_config_holder() const = 0; virtual block::WorkchainSet get_workchain_list() const = 0; - virtual std::vector get_collator_set() const = 0; + virtual block::CollatorConfig get_collator_config(bool need_collator_nodes) const = 0; virtual td::Status prepare() { return td::Status::OK(); } diff --git a/validator/manager.cpp b/validator/manager.cpp index 6323c4f2..10f0ca48 100644 --- a/validator/manager.cpp +++ b/validator/manager.cpp @@ -2117,10 +2117,10 @@ td::actor::ActorOwn ValidatorManagerImpl::create_validator_group auto validator_id = get_validator(shard, validator_set); CHECK(!validator_id.is_zero()); auto G = td::actor::create_actor( - "validatorgroup", shard, validator_id, session_id, validator_set, last_masterchain_state_->get_collator_set(), - opts, keyring_, adnl_, rldp_, overlays_, - db_root_, actor_id(this), init_session, - opts_->check_unsafe_resync_allowed(validator_set->get_catchain_seqno()), opts_->validator_lite_mode()); + "validatorgroup", shard, validator_id, session_id, validator_set, + last_masterchain_state_->get_collator_config(true), opts, keyring_, adnl_, rldp_, overlays_, db_root_, + actor_id(this), init_session, opts_->check_unsafe_resync_allowed(validator_set->get_catchain_seqno()), + opts_->validator_lite_mode()); return G; } } diff --git a/validator/validator-group.cpp b/validator/validator-group.cpp index a72bded1..88a473ff 100644 --- a/validator/validator-group.cpp +++ b/validator/validator-group.cpp @@ -42,7 +42,7 @@ void ValidatorGroup::generate_block_candidate(td::uint32 round_id, td::Promise> promise); ValidatorGroup(ShardIdFull shard, PublicKeyHash local_id, ValidatorSessionId session_id, - td::Ref validator_set, std::vector collator_set, + td::Ref validator_set, block::CollatorConfig collator_config, validatorsession::ValidatorSessionOptions config, td::actor::ActorId keyring, td::actor::ActorId adnl, td::actor::ActorId rldp, td::actor::ActorId overlays, @@ -70,7 +70,7 @@ class ValidatorGroup : public td::actor::Actor { , local_id_(std::move(local_id)) , session_id_(session_id) , validator_set_(std::move(validator_set)) - , collator_set_(std::move(collator_set)) + , collator_config_(std::move(collator_config)) , config_(std::move(config)) , keyring_(keyring) , adnl_(adnl) @@ -110,7 +110,7 @@ class ValidatorGroup : public td::actor::Actor { BlockIdExt min_masterchain_block_id_; td::Ref validator_set_; - std::vector collator_set_; + block::CollatorConfig collator_config_; validatorsession::ValidatorSessionOptions config_; td::actor::ActorId keyring_;