mirror of
				https://github.com/ton-blockchain/ton
				synced 2025-03-09 15:40:10 +00:00 
			
		
		
		
	Lite-mode for validate-query, more collated data in collator
This commit is contained in:
		
							parent
							
								
									849d995346
								
							
						
					
					
						commit
						625516c568
					
				
					 7 changed files with 214 additions and 37 deletions
				
			
		|  | @ -25,6 +25,8 @@ namespace ton { | |||
| 
 | ||||
| namespace validator { | ||||
| 
 | ||||
| enum ValidateMode { fake = 1, lite = 2 }; | ||||
| 
 | ||||
| td::actor::ActorOwn<Db> create_db_actor(td::actor::ActorId<ValidatorManager> manager, std::string db_root_); | ||||
| td::actor::ActorOwn<LiteServerCache> create_liteserver_cache_actor(td::actor::ActorId<ValidatorManager> manager, | ||||
|                                                                    std::string db_root); | ||||
|  | @ -73,7 +75,7 @@ void run_check_proof_link_query(BlockIdExt id, td::Ref<ProofLink> proof, td::act | |||
| void run_validate_query(ShardIdFull shard, UnixTime min_ts, BlockIdExt min_masterchain_block_id, | ||||
|                         std::vector<BlockIdExt> prev, BlockCandidate candidate, td::Ref<ValidatorSet> validator_set, | ||||
|                         td::actor::ActorId<ValidatorManager> manager, td::Timestamp timeout, | ||||
|                         td::Promise<ValidateCandidateResult> promise, bool is_fake = false); | ||||
|                         td::Promise<ValidateCandidateResult> promise, unsigned mode = 0); | ||||
| void run_collate_query(ShardIdFull shard, td::uint32 min_ts, const BlockIdExt& min_masterchain_block_id, | ||||
|                        std::vector<BlockIdExt> prev, Ed25519_PublicKey local_id, td::Ref<ValidatorSet> validator_set, | ||||
|                        td::actor::ActorId<ValidatorManager> manager, td::Timestamp timeout, | ||||
|  |  | |||
|  | @ -205,7 +205,11 @@ class Collator final : public td::actor::Actor { | |||
|   unsigned block_create_total_{0}; | ||||
|   std::vector<ExtMessage::Hash> bad_ext_msgs_, delay_ext_msgs_; | ||||
|   Ref<vm::Cell> shard_account_blocks_;  // ShardAccountBlocks
 | ||||
| 
 | ||||
|   std::map<td::Bits256, Ref<BlockData>> blocks_with_state_proofs_; | ||||
|   std::vector<vm::MerkleProofBuilder> neighbor_proof_builders_; | ||||
|   std::vector<Ref<vm::Cell>> collated_roots_; | ||||
| 
 | ||||
|   std::unique_ptr<ton::BlockCandidate> block_candidate; | ||||
| 
 | ||||
|   td::PerfWarningTimer perf_timer_{"collate", 0.1}; | ||||
|  | @ -235,7 +239,8 @@ class Collator final : public td::actor::Actor { | |||
|   void after_get_aux_shard_state(ton::BlockIdExt blkid, td::Result<Ref<ShardState>> res); | ||||
|   bool fix_one_processed_upto(block::MsgProcessedUpto& proc, const ton::ShardIdFull& owner); | ||||
|   bool fix_processed_upto(block::MsgProcessedUptoCollection& upto); | ||||
|   void got_neighbor_out_queue(int i, td::Result<Ref<MessageQueue>> res); | ||||
|   void got_neighbor_block_data(td::Result<Ref<BlockData>> res); | ||||
|   void got_neighbor_block_state(int i, td::Result<Ref<ShardState>> res); | ||||
|   bool adjust_shard_config(); | ||||
|   bool store_shard_fees(ShardIdFull shard, const block::CurrencyCollection& fees, | ||||
|                         const block::CurrencyCollection& created); | ||||
|  |  | |||
|  | @ -502,6 +502,7 @@ void Collator::after_get_block_data(int idx, td::Result<Ref<BlockData>> res) { | |||
|       prev_mc_block = prev_block_data[0]; | ||||
|       mc_block_root = prev_mc_block->root_cell(); | ||||
|     } | ||||
|     blocks_with_state_proofs_[prev_block_data[idx]->root_cell()->get_hash().bits()] = prev_block_data[idx]; | ||||
|   } | ||||
|   check_pending(); | ||||
| } | ||||
|  | @ -614,26 +615,59 @@ bool Collator::request_neighbor_msg_queues() { | |||
|     neighbors_.emplace_back(*shard_ptr); | ||||
|   } | ||||
|   int i = 0; | ||||
|   neighbor_proof_builders_.resize(neighbors_.size()); | ||||
|   for (block::McShardDescr& descr : neighbors_) { | ||||
|     LOG(DEBUG) << "neighbor #" << i << " : " << descr.blk_.to_str(); | ||||
|     if (descr.blk_.seqno() != 0) { | ||||
|       ++pending; | ||||
|       send_closure_later(manager, &ValidatorManager::wait_block_data_short, descr.blk_, priority(), timeout, | ||||
|                          [self = get_self(), i](td::Result<Ref<BlockData>> res) { | ||||
|                            LOG(DEBUG) << "got answer to wait_block_data for neighbor #" << i; | ||||
|                            send_closure_later(std::move(self), &Collator::got_neighbor_block_data, std::move(res)); | ||||
|                          }); | ||||
|     } | ||||
|     ++pending; | ||||
|     send_closure_later(manager, &ValidatorManager::wait_block_message_queue_short, descr.blk_, priority(), timeout, | ||||
|                        [self = get_self(), i](td::Result<Ref<MessageQueue>> res) { | ||||
|                          td::actor::send_closure(std::move(self), &Collator::got_neighbor_out_queue, i, std::move(res)); | ||||
|     send_closure_later(manager, &ValidatorManager::wait_block_state_short, descr.blk_, priority(), timeout, | ||||
|                        [self = get_self(), i](td::Result<Ref<ShardState>> res) { | ||||
|                          LOG(DEBUG) << "got answer to wait_block_state for neighbor #" << i; | ||||
|                          send_closure_later(std::move(self), &Collator::got_neighbor_block_state, i, std::move(res)); | ||||
|                        }); | ||||
|     ++i; | ||||
|   } | ||||
|   return true; | ||||
| } | ||||
| 
 | ||||
| void Collator::got_neighbor_out_queue(int i, td::Result<Ref<MessageQueue>> res) { | ||||
|   LOG(DEBUG) << "obtained outbound queue for neighbor #" << i; | ||||
| void Collator::got_neighbor_block_data(td::Result<Ref<BlockData>> res) { | ||||
|   --pending; | ||||
|   if (res.is_error()) { | ||||
|     fatal_error(res.move_as_error()); | ||||
|     return; | ||||
|   } | ||||
|   Ref<MessageQueue> outq_descr = res.move_as_ok(); | ||||
|   auto block_data = res.move_as_ok(); | ||||
|   blocks_with_state_proofs_[block_data->root_cell()->get_hash().bits()] = block_data; | ||||
|   check_pending(); | ||||
| } | ||||
| 
 | ||||
| void Collator::got_neighbor_block_state(int i, td::Result<Ref<ShardState>> res) { | ||||
|   --pending; | ||||
|   if (res.is_error()) { | ||||
|     fatal_error(res.move_as_error()); | ||||
|     return; | ||||
|   } | ||||
|   Ref<ShardState> state = res.move_as_ok(); | ||||
|   neighbor_proof_builders_.at(i) = vm::MerkleProofBuilder{state->root_cell()}; | ||||
|   auto new_state = ShardStateQ::fetch(state->get_block_id(), {}, neighbor_proof_builders_.at(i).root()); | ||||
|   if (new_state.is_error()) { | ||||
|     fatal_error(new_state.move_as_error()); | ||||
|     return; | ||||
|   } | ||||
|   auto outq_descr_res = new_state.move_as_ok()->message_queue(); | ||||
|   if (outq_descr_res.is_error()) { | ||||
|     fatal_error(outq_descr_res.move_as_error()); | ||||
|     return; | ||||
|   } | ||||
|   LOG(DEBUG) << "obtained outbound queue for neighbor #" << i; | ||||
|   Ref<MessageQueue> outq_descr = outq_descr_res.move_as_ok(); | ||||
|   block::McShardDescr& descr = neighbors_.at(i); | ||||
|   if (outq_descr->get_block_id() != descr.blk_) { | ||||
|     LOG(DEBUG) << "outq_descr->id = " << outq_descr->get_block_id().to_str() << " ; descr.id = " << descr.blk_.to_str(); | ||||
|  | @ -3949,7 +3983,6 @@ Ref<vm::Cell> Collator::collate_shard_block_descr_set() { | |||
| } | ||||
| 
 | ||||
| bool Collator::create_collated_data() { | ||||
|   // TODO: store something into collated_roots_
 | ||||
|   // 1. store the set of used shard block descriptions
 | ||||
|   if (!used_shard_block_descr_.empty()) { | ||||
|     auto cell = collate_shard_block_descr_set(); | ||||
|  | @ -3959,7 +3992,47 @@ bool Collator::create_collated_data() { | |||
|     } | ||||
|     collated_roots_.push_back(std::move(cell)); | ||||
|   } | ||||
|   // 2. ...
 | ||||
|   // 2. Proofs for hashes of states: previous states + neighbors
 | ||||
|   for (const auto& p : blocks_with_state_proofs_) { | ||||
|     vm::MerkleProofBuilder mpb{p.second->root_cell()}; | ||||
|     block::gen::Block::Record block; | ||||
|     if (!tlb::unpack_cell(mpb.root(), block) || block.state_update->load_cell().is_error()) { | ||||
|       return fatal_error("cannot generate Merkle proof for previous block"); | ||||
|     } | ||||
|     Ref<vm::Cell> proof = mpb.extract_proof(); | ||||
|     if (proof.is_null()) { | ||||
|       return fatal_error("cannot generate Merkle proof for previous block"); | ||||
|     } | ||||
|     collated_roots_.push_back(std::move(proof)); | ||||
|   } | ||||
|   // 3. Previous state proof (only shadchains)
 | ||||
|   std::map<td::Bits256, Ref<vm::Cell>> proofs; | ||||
|   if (!is_masterchain()) { | ||||
|     state_usage_tree_->set_use_mark_for_is_loaded(false); | ||||
|     Ref<vm::Cell> state_proof = vm::MerkleProof::generate(prev_state_root_, state_usage_tree_.get()); | ||||
|     if (state_proof.is_null()) { | ||||
|       return fatal_error("cannot generate Merkle proof for previous state"); | ||||
|     } | ||||
|     proofs[prev_state_root_->get_hash().bits()] = std::move(state_proof); | ||||
|   } | ||||
|   // 4. Proofs for message queues
 | ||||
|   for (vm::MerkleProofBuilder &mpb : neighbor_proof_builders_) { | ||||
|     Ref<vm::Cell> proof = mpb.extract_proof(); | ||||
|     if (proof.is_null()) { | ||||
|       return fatal_error("cannot generate Merkle proof for neighbor"); | ||||
|     } | ||||
|     auto it = proofs.emplace(mpb.root()->get_hash().bits(), proof); | ||||
|     if (!it.second) { | ||||
|       it.first->second = vm::MerkleProof::combine(it.first->second, std::move(proof)); | ||||
|       if (it.first->second.is_null()) { | ||||
|         return fatal_error("cannot combine merkle proofs"); | ||||
|       } | ||||
|     } | ||||
|   } | ||||
| 
 | ||||
|   for (auto& p : proofs) { | ||||
|     collated_roots_.push_back(std::move(p.second)); | ||||
|   } | ||||
|   return true; | ||||
| } | ||||
| 
 | ||||
|  |  | |||
|  | @ -191,17 +191,18 @@ void run_check_proof_link_query(BlockIdExt id, td::Ref<ProofLink> proof, td::act | |||
| void run_validate_query(ShardIdFull shard, UnixTime min_ts, BlockIdExt min_masterchain_block_id, | ||||
|                         std::vector<BlockIdExt> prev, BlockCandidate candidate, td::Ref<ValidatorSet> validator_set, | ||||
|                         td::actor::ActorId<ValidatorManager> manager, td::Timestamp timeout, | ||||
|                         td::Promise<ValidateCandidateResult> promise, bool is_fake) { | ||||
|                         td::Promise<ValidateCandidateResult> promise, unsigned mode) { | ||||
|   BlockSeqno seqno = 0; | ||||
|   for (auto& p : prev) { | ||||
|     if (p.seqno() > seqno) { | ||||
|       seqno = p.seqno(); | ||||
|     } | ||||
|   } | ||||
|   bool is_fake = mode & ValidateMode::fake; | ||||
|   td::actor::create_actor<ValidateQuery>( | ||||
|       PSTRING() << (is_fake ? "fakevalidate" : "validateblock") << shard.to_str() << ":" << (seqno + 1), shard, min_ts, | ||||
|       min_masterchain_block_id, std::move(prev), std::move(candidate), std::move(validator_set), std::move(manager), | ||||
|       timeout, std::move(promise), is_fake) | ||||
|       timeout, std::move(promise), mode) | ||||
|       .release(); | ||||
| } | ||||
| 
 | ||||
|  |  | |||
|  | @ -31,6 +31,7 @@ | |||
| #include "vm/cells/MerkleProof.h" | ||||
| #include "vm/cells/MerkleUpdate.h" | ||||
| #include "common/errorlog.h" | ||||
| #include "fabric.h" | ||||
| #include <ctime> | ||||
| 
 | ||||
| namespace ton { | ||||
|  | @ -51,7 +52,7 @@ std::string ErrorCtx::as_string() const { | |||
| ValidateQuery::ValidateQuery(ShardIdFull shard, UnixTime min_ts, BlockIdExt min_masterchain_block_id, | ||||
|                              std::vector<BlockIdExt> prev, BlockCandidate candidate, Ref<ValidatorSet> validator_set, | ||||
|                              td::actor::ActorId<ValidatorManager> manager, td::Timestamp timeout, | ||||
|                              td::Promise<ValidateCandidateResult> promise, bool is_fake) | ||||
|                              td::Promise<ValidateCandidateResult> promise, unsigned mode) | ||||
|     : shard_(shard) | ||||
|     , id_(candidate.id) | ||||
|     , min_ts(min_ts) | ||||
|  | @ -62,7 +63,8 @@ ValidateQuery::ValidateQuery(ShardIdFull shard, UnixTime min_ts, BlockIdExt min_ | |||
|     , manager(std::move(manager)) | ||||
|     , timeout(timeout) | ||||
|     , main_promise(std::move(promise)) | ||||
|     , is_fake_(is_fake) | ||||
|     , is_fake_(mode & ValidateMode::fake) | ||||
|     , is_lite_(mode & ValidateMode::lite) | ||||
|     , shard_pfx_(shard_.shard) | ||||
|     , shard_pfx_len_(ton::shard_prefix_length(shard_)) { | ||||
|   proc_hash_.zero(); | ||||
|  | @ -257,18 +259,20 @@ 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)
 | ||||
|   // 3. load state(s) corresponding to previous block(s) (non-lite mode or masterchain)
 | ||||
|   prev_states.resize(prev_blocks.size()); | ||||
|   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"; | ||||
|     ++pending; | ||||
|     td::actor::send_closure_later(manager, &ValidatorManager::wait_block_state_short, prev_blocks[i], priority(), | ||||
|                                   timeout, [self = get_self(), i](td::Result<Ref<ShardState>> 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)); | ||||
|                                   }); | ||||
|   if  (is_masterchain() || !is_lite_) { | ||||
|     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"; | ||||
|       ++pending; | ||||
|       td::actor::send_closure_later(manager, &ValidatorManager::wait_block_state_short, prev_blocks[i], priority(), | ||||
|                                     timeout, [self = get_self(), i](td::Result<Ref<ShardState>> 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)); | ||||
|                                     }); | ||||
|     } | ||||
|   } | ||||
|   // 4. unpack block candidate (while necessary data is being loaded)
 | ||||
|   if (!unpack_block_candidate()) { | ||||
|  | @ -988,6 +992,9 @@ bool ValidateQuery::check_this_shard_mc_info() { | |||
|  */ | ||||
| 
 | ||||
| bool ValidateQuery::compute_prev_state() { | ||||
|   if (!is_masterchain() && is_lite_) { | ||||
|     return compute_prev_state_lite_mode(); | ||||
|   } | ||||
|   CHECK(prev_states.size() == 1u + after_merge_); | ||||
|   prev_state_root_ = prev_states[0]->root_cell(); | ||||
|   CHECK(prev_state_root_.not_null()); | ||||
|  | @ -1006,6 +1013,46 @@ bool ValidateQuery::compute_prev_state() { | |||
|   return true; | ||||
| } | ||||
| 
 | ||||
| bool ValidateQuery::compute_prev_state_lite_mode() { | ||||
|   td::Bits256 state_hash; | ||||
|   if (id_.seqno() == 1) { | ||||
|     if (prev_blocks.size() != 1) { | ||||
|       return reject_query("seqno is 1, but number of previous blocks is not 1"); | ||||
|     } | ||||
|     state_hash = prev_blocks[0].root_hash; | ||||
|   } else { | ||||
|     std::vector<Ref<vm::Cell>> prev_state_roots(prev_blocks.size()); | ||||
|     for (size_t i = 0; i < prev_blocks.size(); ++i) { | ||||
|       prev_state_roots[i] = get_virt_state_root(prev_blocks[i].root_hash); | ||||
|       if (prev_state_roots[i].is_null()) { | ||||
|         return reject_query(PSTRING() << "cannot get hash of previous state root: " << prev_blocks[i]); | ||||
|       } | ||||
|     } | ||||
| 
 | ||||
|     if (prev_state_roots.size() == 1) { | ||||
|       state_hash = prev_state_roots[0]->get_hash().bits(); | ||||
|     } else { | ||||
|       CHECK(prev_state_roots.size() == 2); | ||||
|       Ref<vm::Cell> merged; | ||||
|       if (!block::gen::t_ShardState.cell_pack_split_state(merged, prev_state_roots[0], prev_state_roots[1])) { | ||||
|         return fatal_error(-667, "cannot construct mechanically merged previously state"); | ||||
|       } | ||||
|       state_hash = merged->get_hash().bits(); | ||||
|     } | ||||
|   } | ||||
|   if (state_hash != prev_state_hash_) { | ||||
|     return reject_query("previous state hash mismatch for block "s + id_.to_str() + " : block header declares " + | ||||
|                         prev_state_hash_.to_hex() + " , actual " + state_hash.to_hex()); | ||||
|   } | ||||
|   auto it = virt_roots_.find(state_hash); | ||||
|   if (it == virt_roots_.end()) { | ||||
|     return reject_query(PSTRING() << "no state root for previous block in collated data (hash = " | ||||
|                                   << state_hash.to_hex() << ")"); | ||||
|   } | ||||
|   prev_state_root_ = it->second; | ||||
|   return true; | ||||
| } | ||||
| 
 | ||||
| bool ValidateQuery::compute_next_state() { | ||||
|   LOG(DEBUG) << "computing next state"; | ||||
|   auto res = vm::MerkleUpdate::validate(state_update_); | ||||
|  | @ -1209,15 +1256,42 @@ bool ValidateQuery::request_neighbor_queues() { | |||
|     neighbors_.emplace_back(*shard_ptr); | ||||
|   } | ||||
|   int i = 0; | ||||
|   for (block::McShardDescr& descr : neighbors_) { | ||||
|     LOG(DEBUG) << "requesting outbound queue of 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<Ref<MessageQueue>> res) { | ||||
|                          td::actor::send_closure(std::move(self), &ValidateQuery::got_neighbor_out_queue, i, | ||||
|                                                  std::move(res)); | ||||
|                        }); | ||||
|     ++i; | ||||
|   if (is_lite_) { | ||||
|     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; | ||||
|       if (descr.blk_.seqno() == 0) { | ||||
|         state_root_hash = descr.blk_.root_hash; | ||||
|       } else { | ||||
|         Ref<vm::Cell> state_root = get_virt_state_root(descr.blk_.root_hash); | ||||
|         if (state_root.is_null()) { | ||||
|           return reject_query(PSTRING() << "cannot get hash of state root: " << descr.blk_); | ||||
|         } | ||||
|         state_root_hash = state_root->get_hash().bits(); | ||||
|       } | ||||
|       auto it = virt_roots_.find(state_root_hash); | ||||
|       if (it == virt_roots_.end()) { | ||||
|         return reject_query(PSTRING() << "cannot get state root form collated data: " << descr.blk_); | ||||
|       } | ||||
|       auto state = ShardStateQ::fetch(descr.blk_, {}, it->second); | ||||
|       if (state.is_error()) { | ||||
|         return reject_query("cannot fetch shard state from collated data", state.move_as_error()); | ||||
|       } | ||||
|       ++pending; | ||||
|       send_closure_later(get_self(), &ValidateQuery::got_neighbor_out_queue, i, state.move_as_ok()->message_queue()); | ||||
|       ++i; | ||||
|     } | ||||
|   } else { | ||||
|     for (block::McShardDescr& descr : neighbors_) { | ||||
|       LOG(DEBUG) << "requesting outbound queue of 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<Ref<MessageQueue>> res) { | ||||
|                            td::actor::send_closure(std::move(self), &ValidateQuery::got_neighbor_out_queue, i, | ||||
|                                                    std::move(res)); | ||||
|                          }); | ||||
|       ++i; | ||||
|     } | ||||
|   } | ||||
|   return true; | ||||
| } | ||||
|  | @ -5430,6 +5504,24 @@ bool ValidateQuery::check_mc_block_extra() { | |||
|   return true; | ||||
| } | ||||
| 
 | ||||
| Ref<vm::Cell> ValidateQuery::get_virt_state_root(td::Bits256 block_root_hash) { | ||||
|   auto it = virt_roots_.find(block_root_hash); | ||||
|   if (it == virt_roots_.end()) { | ||||
|     return {}; | ||||
|   } | ||||
|   Ref<vm::Cell> root = it->second; | ||||
|   block::gen::Block::Record block; | ||||
|   if (!tlb::unpack_cell(root, block)) { | ||||
|     return {}; | ||||
|   } | ||||
|   vm::CellSlice upd_cs{vm::NoVmSpec(), block.state_update}; | ||||
|   if (!(upd_cs.is_special() && upd_cs.prefetch_long(8) == 4  // merkle update
 | ||||
|         && upd_cs.size_ext() == 0x20228)) { | ||||
|     return {}; | ||||
|   } | ||||
|   return vm::MerkleProof::virtualize_raw(upd_cs.prefetch_ref(1), {0, 1}); | ||||
| } | ||||
| 
 | ||||
| /*
 | ||||
|  * | ||||
|  *   MAIN VALIDATOR FUNCTION | ||||
|  | @ -5533,7 +5625,7 @@ bool ValidateQuery::try_validate() { | |||
|   } catch (vm::VmError& err) { | ||||
|     return fatal_error(-666, err.get_msg()); | ||||
|   } catch (vm::VmVirtError& err) { | ||||
|     return fatal_error(-666, err.get_msg()); | ||||
|     return reject_query(err.get_msg()); | ||||
|   } | ||||
|   return save_candidate(); | ||||
| } | ||||
|  |  | |||
|  | @ -118,7 +118,7 @@ class ValidateQuery : public td::actor::Actor { | |||
|   ValidateQuery(ShardIdFull shard, UnixTime min_ts, BlockIdExt min_masterchain_block_id, std::vector<BlockIdExt> prev, | ||||
|                 BlockCandidate candidate, td::Ref<ValidatorSet> validator_set, | ||||
|                 td::actor::ActorId<ValidatorManager> manager, td::Timestamp timeout, | ||||
|                 td::Promise<ValidateCandidateResult> promise, bool is_fake = false); | ||||
|                 td::Promise<ValidateCandidateResult> promise, unsigned mode = 0); | ||||
| 
 | ||||
|  private: | ||||
|   int verbosity{3 * 1}; | ||||
|  | @ -142,6 +142,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 prev_key_block_exists_{false}; | ||||
|   bool debug_checks_{false}; | ||||
|   bool outq_cleanup_partial_{false}; | ||||
|  | @ -286,6 +287,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_next_state(); | ||||
|   bool unpack_merge_prev_state(); | ||||
|   bool unpack_prev_state(); | ||||
|  | @ -368,6 +370,8 @@ class ValidateQuery : public td::actor::Actor { | |||
|   bool check_one_shard_fee(ShardIdFull shard, const block::CurrencyCollection& fees, | ||||
|                            const block::CurrencyCollection& create); | ||||
|   bool check_mc_block_extra(); | ||||
| 
 | ||||
|   Ref<vm::Cell> get_virt_state_root(td::Bits256 block_root_hash); | ||||
| }; | ||||
| 
 | ||||
| }  // namespace validator
 | ||||
|  |  | |||
|  | @ -153,7 +153,7 @@ void ValidatorManagerImpl::validate_fake(BlockCandidate candidate, std::vector<B | |||
|   }); | ||||
|   auto shard = candidate.id.shard_full(); | ||||
|   run_validate_query(shard, 0, last, prev, std::move(candidate), std::move(val_set), actor_id(this), | ||||
|                      td::Timestamp::in(10.0), std::move(P), true /* fake */); | ||||
|                      td::Timestamp::in(10.0), std::move(P), ValidateMode::fake); | ||||
| } | ||||
| 
 | ||||
| void ValidatorManagerImpl::write_fake(BlockCandidate candidate, std::vector<BlockIdExt> prev, BlockIdExt last, | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue