diff --git a/validator/impl/collator-impl.h b/validator/impl/collator-impl.h index c0450310..0e706c35 100644 --- a/validator/impl/collator-impl.h +++ b/validator/impl/collator-impl.h @@ -39,9 +39,12 @@ namespace validator { using td::Ref; class Collator final : public td::actor::Actor { - static constexpr int supported_version = 1; - static constexpr long long supported_capabilities = - ton::capCreateStatsEnabled | ton::capBounceMsgBody | ton::capReportVersion; + static constexpr int supported_version() { + return 1; + } + static constexpr long long supported_capabilities() { + return ton::capCreateStatsEnabled | ton::capBounceMsgBody | ton::capReportVersion; + } using LtCellRef = block::LtCellRef; using NewOutMsg = block::NewOutMsg; const ShardIdFull shard; diff --git a/validator/impl/collator.cpp b/validator/impl/collator.cpp index 5623f8c6..6d185f63 100644 --- a/validator/impl/collator.cpp +++ b/validator/impl/collator.cpp @@ -176,7 +176,7 @@ void Collator::start_up() { LOG(DEBUG) << "sending wait_block_state() query #" << i << " for " << prev_blocks[i].to_str() << " to Manager"; ++pending; td::actor::send_closure_later(manager, &ValidatorManager::wait_block_state_short, prev_blocks[i], priority(), - timeout, [ self = get_self(), i ](td::Result> res) { + timeout, [self = get_self(), i](td::Result> res) { LOG(DEBUG) << "got answer to wait_block_state query #" << i; td::actor::send_closure_later(std::move(self), &Collator::after_get_shard_state, i, std::move(res)); @@ -187,7 +187,7 @@ void Collator::start_up() { LOG(DEBUG) << "sending wait_block_data() query #" << i << " for " << prev_blocks[i].to_str() << " to Manager"; ++pending; td::actor::send_closure_later(manager, &ValidatorManager::wait_block_data_short, prev_blocks[i], priority(), - timeout, [ self = get_self(), i ](td::Result> res) { + timeout, [self = get_self(), i](td::Result> res) { LOG(DEBUG) << "got answer to wait_block_data query #" << i; td::actor::send_closure_later(std::move(self), &Collator::after_get_block_data, i, std::move(res)); @@ -197,8 +197,8 @@ void Collator::start_up() { // 4. load external messages LOG(DEBUG) << "sending get_external_messages() query to Manager"; ++pending; - td::actor::send_closure_later(manager, &ValidatorManager::get_external_messages, - shard, [self = get_self()](td::Result>> res)->void { + td::actor::send_closure_later(manager, &ValidatorManager::get_external_messages, shard, + [self = get_self()](td::Result>> res) -> void { LOG(DEBUG) << "got answer to get_external_messages() query"; td::actor::send_closure_later(std::move(self), &Collator::after_get_external_messages, std::move(res)); @@ -208,8 +208,8 @@ void Collator::start_up() { LOG(DEBUG) << "sending get_shard_blocks() query to Manager"; ++pending; td::actor::send_closure_later( - manager, &ValidatorManager::get_shard_blocks, - prev_blocks[0], [self = get_self()](td::Result>> res)->void { + manager, &ValidatorManager::get_shard_blocks, prev_blocks[0], + [self = get_self()](td::Result>> res) -> void { LOG(DEBUG) << "got answer to get_shard_blocks() query"; td::actor::send_closure_later(std::move(self), &Collator::after_get_shard_blocks, std::move(res)); }); @@ -326,7 +326,7 @@ bool Collator::request_aux_mc_state(BlockSeqno seqno, Ref& st LOG(DEBUG) << "sending auxiliary wait_block_state() query for " << blkid.to_str() << " to Manager"; ++pending; td::actor::send_closure_later(manager, &ValidatorManager::wait_block_state_short, blkid, priority(), timeout, - [ self = get_self(), blkid ](td::Result> res) { + [self = get_self(), blkid](td::Result> res) { LOG(DEBUG) << "got answer to wait_block_state query for " << blkid.to_str(); td::actor::send_closure_later(std::move(self), &Collator::after_get_aux_shard_state, blkid, std::move(res)); @@ -414,8 +414,8 @@ void Collator::after_get_mc_state(td::Result, Bl // NB. it is needed only for creating a correct ExtBlkRef reference to it, which requires start_lt and end_lt LOG(DEBUG) << "sending wait_block_data() query #-1 for " << mc_block_id_.to_str() << " to Manager"; ++pending; - td::actor::send_closure_later(manager, &ValidatorManager::wait_block_data_short, mc_block_id_, priority(), - timeout, [self = get_self()](td::Result> res) { + td::actor::send_closure_later(manager, &ValidatorManager::wait_block_data_short, mc_block_id_, priority(), timeout, + [self = get_self()](td::Result> res) { LOG(DEBUG) << "got answer to wait_block_data query #-1"; td::actor::send_closure_later(std::move(self), &Collator::after_get_block_data, -1, std::move(res)); @@ -530,14 +530,14 @@ bool Collator::unpack_last_mc_state() { << ", " << block_limits_->bytes.hard() << "]"; LOG(DEBUG) << "block limits: gas [" << block_limits_->gas.underload() << ", " << block_limits_->gas.soft() << ", " << block_limits_->gas.hard() << "]"; - if (config_->has_capabilities() && (config_->get_capabilities() & ~supported_capabilities)) { + if (config_->has_capabilities() && (config_->get_capabilities() & ~supported_capabilities())) { LOG(ERROR) << "block generation capabilities " << config_->get_capabilities() - << " have been enabled in global configuration, but we support only " << supported_capabilities + << " have been enabled in global configuration, but we support only " << supported_capabilities() << " (upgrade validator software?)"; } - if (config_->get_global_version() > supported_version) { + if (config_->get_global_version() > supported_version()) { LOG(ERROR) << "block version " << config_->get_global_version() - << " have been enabled in global configuration, but we support only " << supported_version + << " have been enabled in global configuration, but we support only " << supported_version() << " (upgrade validator software?)"; } // TODO: extract start_lt and end_lt from prev_mc_block as well @@ -567,7 +567,7 @@ bool Collator::request_neighbor_msg_queues() { LOG(DEBUG) << "neighbor #" << i << " : " << descr.blk_.to_str(); ++pending; send_closure_later(manager, &ValidatorManager::wait_block_message_queue_short, descr.blk_, priority(), timeout, - [ self = get_self(), i ](td::Result> res) { + [self = get_self(), i](td::Result> res) { td::actor::send_closure(std::move(self), &Collator::got_neighbor_out_queue, i, std::move(res)); }); ++i; @@ -2938,24 +2938,24 @@ bool Collator::update_shard_config(const block::WorkchainSet& wc_set, const bloc WorkchainId wc_id{ton::workchainInvalid}; Ref wc_info; ton::BlockSeqno& min_seqno = min_ref_mc_seqno_; - return shard_conf_->process_sibling_shard_hashes([ - &wc_set, &wc_id, &wc_info, &ccvc, &min_seqno, now = now_, update_cc - ](block::McShardHash & cur, const block::McShardHash* sibling) { - if (!cur.is_valid()) { - return -2; - } - if (wc_id != cur.workchain()) { - wc_id = cur.workchain(); - auto it = wc_set.find(wc_id); - if (it == wc_set.end()) { - wc_info.clear(); - } else { - wc_info = it->second; - } - } - min_seqno = std::min(min_seqno, cur.min_ref_mc_seqno_); - return update_one_shard(cur, sibling, wc_info.get(), now, ccvc, update_cc); - }); + return shard_conf_->process_sibling_shard_hashes( + [&wc_set, &wc_id, &wc_info, &ccvc, &min_seqno, now = now_, update_cc](block::McShardHash& cur, + const block::McShardHash* sibling) { + if (!cur.is_valid()) { + return -2; + } + if (wc_id != cur.workchain()) { + wc_id = cur.workchain(); + auto it = wc_set.find(wc_id); + if (it == wc_set.end()) { + wc_info.clear(); + } else { + wc_info = it->second; + } + } + min_seqno = std::min(min_seqno, cur.min_ref_mc_seqno_); + return update_one_shard(cur, sibling, wc_info.get(), now, ccvc, update_cc); + }); } bool Collator::create_mc_state_extra() { @@ -3603,7 +3603,7 @@ bool Collator::create_block_info(Ref& block_info) { } bool Collator::store_version(vm::CellBuilder& cb) const { - return block::gen::t_GlobalVersion.pack_capabilities(cb, supported_version, supported_capabilities); + return block::gen::t_GlobalVersion.pack_capabilities(cb, supported_version(), supported_capabilities()); } bool Collator::store_zero_state_ref(vm::CellBuilder& cb) { @@ -3801,7 +3801,7 @@ bool Collator::create_block_candidate() { // 4. save block candidate LOG(INFO) << "saving new BlockCandidate"; td::actor::send_closure_later(manager, &ValidatorManager::set_block_candidate, block_candidate->id, - block_candidate->clone(), [self = get_self()](td::Result saved)->void { + block_candidate->clone(), [self = get_self()](td::Result saved) -> void { LOG(DEBUG) << "got answer to set_block_candidate"; td::actor::send_closure_later(std::move(self), &Collator::return_block_candidate, std::move(saved)); diff --git a/validator/impl/validate-query.cpp b/validator/impl/validate-query.cpp index dd041a6c..fd693679 100644 --- a/validator/impl/validate-query.cpp +++ b/validator/impl/validate-query.cpp @@ -256,7 +256,7 @@ void ValidateQuery::start_up() { LOG(DEBUG) << "sending wait_block_state() query #" << i << " for " << prev_blocks[i].to_str() << " to Manager"; ++pending; td::actor::send_closure_later(manager, &ValidatorManager::wait_block_state_short, prev_blocks[i], priority(), - timeout, [ self = get_self(), i ](td::Result> res)->void { + timeout, [self = get_self(), i](td::Result> res) -> void { LOG(DEBUG) << "got answer to wait_block_state_short query #" << i; td::actor::send_closure_later( std::move(self), &ValidateQuery::after_get_shard_state, i, std::move(res)); @@ -270,16 +270,16 @@ void ValidateQuery::start_up() { // 5. request masterchain state referred to in the block if (!is_masterchain()) { ++pending; - td::actor::send_closure_later(manager, &ValidatorManager::wait_block_state_short, mc_blkid_, priority(), - timeout, [self = get_self()](td::Result> res) { + td::actor::send_closure_later(manager, &ValidatorManager::wait_block_state_short, mc_blkid_, priority(), timeout, + [self = get_self()](td::Result> res) { LOG(DEBUG) << "got answer to wait_block_state() query for masterchain block"; td::actor::send_closure_later(std::move(self), &ValidateQuery::after_get_mc_state, std::move(res)); }); // 5.1. request corresponding block handle ++pending; - td::actor::send_closure_later(manager, &ValidatorManager::get_block_handle, mc_blkid_, - true, [self = get_self()](td::Result res) { + td::actor::send_closure_later(manager, &ValidatorManager::get_block_handle, mc_blkid_, true, + [self = get_self()](td::Result res) { LOG(DEBUG) << "got answer to get_block_handle() query for masterchain block"; td::actor::send_closure_later(std::move(self), &ValidateQuery::got_mc_handle, std::move(res)); @@ -679,14 +679,14 @@ bool ValidateQuery::try_unpack_mc_state() { config_->set_block_id_ext(mc_blkid_); ihr_enabled_ = config_->ihr_enabled(); create_stats_enabled_ = config_->create_stats_enabled(); - if (config_->has_capabilities() && (config_->get_capabilities() & ~supported_capabilities)) { + if (config_->has_capabilities() && (config_->get_capabilities() & ~supported_capabilities())) { LOG(ERROR) << "block generation capabilities " << config_->get_capabilities() - << " have been enabled in global configuration, but we support only " << supported_capabilities + << " have been enabled in global configuration, but we support only " << supported_capabilities() << " (upgrade validator software?)"; } - if (config_->get_global_version() > supported_version) { + if (config_->get_global_version() > supported_version()) { LOG(ERROR) << "block version " << config_->get_global_version() - << " have been enabled in global configuration, but we support only " << supported_version + << " have been enabled in global configuration, but we support only " << supported_version() << " (upgrade validator software?)"; } @@ -1205,7 +1205,7 @@ bool ValidateQuery::request_neighbor_queues() { LOG(DEBUG) << "neighbor #" << i << " : " << descr.blk_.to_str(); ++pending; send_closure_later(manager, &ValidatorManager::wait_block_message_queue_short, descr.blk_, priority(), timeout, - [ self = get_self(), i ](td::Result> res) { + [self = get_self(), i](td::Result> res) { td::actor::send_closure(std::move(self), &ValidateQuery::got_neighbor_out_queue, i, std::move(res)); }); @@ -1323,12 +1323,13 @@ bool ValidateQuery::request_aux_mc_state(BlockSeqno seqno, Ref> res) { - LOG(DEBUG) << "got answer to wait_block_state query for " << blkid.to_str(); - td::actor::send_closure_later(std::move(self), &ValidateQuery::after_get_aux_shard_state, blkid, std::move(res)); - }); + td::actor::send_closure_later(manager, &ValidatorManager::wait_block_state_short, blkid, priority(), timeout, + [self = get_self(), blkid](td::Result> res) { + LOG(DEBUG) << "got answer to wait_block_state query for " << blkid.to_str(); + td::actor::send_closure_later(std::move(self), + &ValidateQuery::after_get_aux_shard_state, blkid, + std::move(res)); + }); state.clear(); return true; } @@ -1667,8 +1668,8 @@ bool ValidateQuery::check_shard_layout() { WorkchainId wc_id{ton::workchainInvalid}; Ref wc_info; - if (!new_shard_conf_->process_sibling_shard_hashes([ self = this, &wc_set, &wc_id, &wc_info, &ccvc ]( - block::McShardHash & cur, const block::McShardHash* sibling) { + if (!new_shard_conf_->process_sibling_shard_hashes([self = this, &wc_set, &wc_id, &wc_info, &ccvc]( + block::McShardHash& cur, const block::McShardHash* sibling) { if (!cur.is_valid()) { return -2; } @@ -2326,14 +2327,14 @@ bool ValidateQuery::precheck_account_updates() { LOG(INFO) << "pre-checking all Account updates between the old and the new state"; try { CHECK(ps_.account_dict_ && ns_.account_dict_); - if (!ps_.account_dict_->scan_diff(*ns_.account_dict_, - [this](td::ConstBitPtr key, int key_len, Ref old_val_extra, - Ref new_val_extra) { - CHECK(key_len == 256); - return precheck_one_account_update(key, std::move(old_val_extra), - std::move(new_val_extra)); - }, - 3 /* check augmentation of changed nodes */)) { + if (!ps_.account_dict_->scan_diff( + *ns_.account_dict_, + [this](td::ConstBitPtr key, int key_len, Ref old_val_extra, + Ref new_val_extra) { + CHECK(key_len == 256); + return precheck_one_account_update(key, std::move(old_val_extra), std::move(new_val_extra)); + }, + 3 /* check augmentation of changed nodes */)) { return reject_query("invalid ShardAccounts dictionary in the new state"); } } catch (vm::VmError& err) { @@ -2687,14 +2688,14 @@ bool ValidateQuery::precheck_message_queue_update() { try { CHECK(ps_.out_msg_queue_ && ns_.out_msg_queue_); CHECK(out_msg_dict_); - if (!ps_.out_msg_queue_->scan_diff(*ns_.out_msg_queue_, - [this](td::ConstBitPtr key, int key_len, Ref old_val_extra, - Ref new_val_extra) { - CHECK(key_len == 352); - return precheck_one_message_queue_update(key, std::move(old_val_extra), - std::move(new_val_extra)); - }, - 3 /* check augmentation of changed nodes */)) { + if (!ps_.out_msg_queue_->scan_diff( + *ns_.out_msg_queue_, + [this](td::ConstBitPtr key, int key_len, Ref old_val_extra, + Ref new_val_extra) { + CHECK(key_len == 352); + return precheck_one_message_queue_update(key, std::move(old_val_extra), std::move(new_val_extra)); + }, + 3 /* check augmentation of changed nodes */)) { return reject_query("invalid OutMsgQueue dictionary in the new state"); } } catch (vm::VmError& err) { @@ -4673,21 +4674,22 @@ bool ValidateQuery::check_one_library_update(td::ConstBitPtr key, Ref(256); } - if (!old_publishers->scan_diff(*new_publishers, - [ this, lib_key = key ](td::ConstBitPtr key, int key_len, Ref old_val, - Ref new_val) { - CHECK(key_len == 256); - if (old_val.not_null() && !old_val->empty_ext()) { - return false; - } - if (new_val.not_null() && !new_val->empty_ext()) { - return false; - } - CHECK(old_val.not_null() != new_val.not_null()); - lib_publishers2_.emplace_back(lib_key, key, new_val.not_null()); - return true; - }, - 3 /* check augmentation of changed nodes */)) { + if (!old_publishers->scan_diff( + *new_publishers, + [this, lib_key = key](td::ConstBitPtr key, int key_len, Ref old_val, + Ref new_val) { + CHECK(key_len == 256); + if (old_val.not_null() && !old_val->empty_ext()) { + return false; + } + if (new_val.not_null() && !new_val->empty_ext()) { + return false; + } + CHECK(old_val.not_null() != new_val.not_null()); + lib_publishers2_.emplace_back(lib_key, key, new_val.not_null()); + return true; + }, + 3 /* check augmentation of changed nodes */)) { return reject_query("invalid publishers set for shard library with hash "s + key.to_hex(256)); } return true; @@ -5009,14 +5011,15 @@ bool ValidateQuery::check_mc_state_extra() { try { vm::AugmentedDictionary old_prev_dict{old_extra.r1.prev_blocks, 32, block::tlb::aug_OldMcBlocksInfo}; vm::AugmentedDictionary new_prev_dict{new_extra.r1.prev_blocks, 32, block::tlb::aug_OldMcBlocksInfo}; - if (!old_prev_dict.scan_diff(new_prev_dict, - [this](td::ConstBitPtr key, int key_len, Ref old_val_extra, - Ref new_val_extra) { - CHECK(key_len == 32); - return check_one_prev_dict_update( - (unsigned)key.get_uint(32), std::move(old_val_extra), std::move(new_val_extra)); - }, - 3 /* check augmentation of changed nodes */)) { + if (!old_prev_dict.scan_diff( + new_prev_dict, + [this](td::ConstBitPtr key, int key_len, Ref old_val_extra, + Ref new_val_extra) { + CHECK(key_len == 32); + return check_one_prev_dict_update((unsigned)key.get_uint(32), std::move(old_val_extra), + std::move(new_val_extra)); + }, + 3 /* check augmentation of changed nodes */)) { return reject_query("invalid previous block dictionary in the new state"); } td::BitArray<32> key; diff --git a/validator/impl/validate-query.hpp b/validator/impl/validate-query.hpp index 00391c59..031e3204 100644 --- a/validator/impl/validate-query.hpp +++ b/validator/impl/validate-query.hpp @@ -107,9 +107,12 @@ inline ErrorCtxSet ErrorCtx::set_guard(std::vector str_list) { */ class ValidateQuery : public td::actor::Actor { - static constexpr int supported_version = 1; - static constexpr long long supported_capabilities = - ton::capCreateStatsEnabled | ton::capBounceMsgBody | ton::capReportVersion; + static constexpr int supported_version() { + return 1; + } + static constexpr long long supported_capabilities() { + return ton::capCreateStatsEnabled | ton::capBounceMsgBody | ton::capReportVersion; + } public: ValidateQuery(ShardIdFull shard, UnixTime min_ts, BlockIdExt min_masterchain_block_id, std::vector prev,