1
0
Fork 0
mirror of https://github.com/ton-blockchain/ton synced 2025-03-09 15:40:10 +00:00

Save and send block candidates in collator nodes

This commit is contained in:
SpyCheese 2024-07-24 18:02:59 +03:00
parent 4b68c7b165
commit 4c8d25ac1b
2 changed files with 35 additions and 16 deletions

View file

@ -256,7 +256,8 @@ static td::BufferSlice serialize_error(td::Status error) {
return create_serialize_tl_object<ton_api::collatorNode_generateBlockError>(error.code(), error.message().c_str()); return create_serialize_tl_object<ton_api::collatorNode_generateBlockError>(error.code(), error.message().c_str());
} }
static BlockCandidate change_creator(BlockCandidate block, Ed25519_PublicKey creator) { static BlockCandidate change_creator(BlockCandidate block, Ed25519_PublicKey creator, CatchainSeqno* cc_seqno = nullptr,
td::uint32* val_set_hash = nullptr) {
CHECK(!block.id.is_masterchain()); CHECK(!block.id.is_masterchain());
if (block.pubkey == creator) { if (block.pubkey == creator) {
return block; return block;
@ -264,8 +265,10 @@ static BlockCandidate change_creator(BlockCandidate block, Ed25519_PublicKey cre
auto root = vm::std_boc_deserialize(block.data).move_as_ok(); auto root = vm::std_boc_deserialize(block.data).move_as_ok();
block::gen::Block::Record blk; block::gen::Block::Record blk;
block::gen::BlockExtra::Record extra; block::gen::BlockExtra::Record extra;
block::gen::BlockInfo::Record info;
CHECK(tlb::unpack_cell(root, blk)); CHECK(tlb::unpack_cell(root, blk));
CHECK(tlb::unpack_cell(blk.extra, extra)); CHECK(tlb::unpack_cell(blk.extra, extra));
CHECK(tlb::unpack_cell(blk.info, info));
extra.created_by = creator.as_bits256(); extra.created_by = creator.as_bits256();
CHECK(tlb::pack_cell(blk.extra, extra)); CHECK(tlb::pack_cell(blk.extra, extra));
CHECK(tlb::pack_cell(root, blk)); CHECK(tlb::pack_cell(root, blk));
@ -274,6 +277,13 @@ static BlockCandidate change_creator(BlockCandidate block, Ed25519_PublicKey cre
block.id.root_hash = root->get_hash().bits(); block.id.root_hash = root->get_hash().bits();
block.id.file_hash = block::compute_file_hash(block.data.as_slice()); block.id.file_hash = block::compute_file_hash(block.data.as_slice());
block.pubkey = creator; block.pubkey = creator;
if (cc_seqno) {
*cc_seqno = info.gen_catchain_seqno;
}
if (val_set_hash) {
*val_set_hash = info.gen_validator_list_hash_short;
}
return block; return block;
} }
@ -304,9 +314,16 @@ void CollatorNode::receive_query(adnl::AdnlNodeIdShort src, td::BufferSlice data
prev_blocks.push_back(create_block_id(b)); prev_blocks.push_back(create_block_id(b));
} }
Ed25519_PublicKey creator(f->creator_); Ed25519_PublicKey creator(f->creator_);
new_promise = [new_promise = std::move(new_promise), creator](td::Result<BlockCandidate> R) mutable { new_promise = [new_promise = std::move(new_promise), creator,
manager = manager_](td::Result<BlockCandidate> R) mutable {
TRY_RESULT_PROMISE(new_promise, block, std::move(R)); TRY_RESULT_PROMISE(new_promise, block, std::move(R));
new_promise.set_value(change_creator(std::move(block), creator)); CatchainSeqno cc_seqno;
td::uint32 val_set_hash;
block = change_creator(std::move(block), creator, &cc_seqno, &val_set_hash);
td::Promise<td::Unit> P =
new_promise.wrap([block = block.clone()](td::Unit&&) mutable -> BlockCandidate { return std::move(block); });
td::actor::send_closure(manager, &ValidatorManager::set_block_candidate, block.id, std::move(block), cc_seqno,
val_set_hash, std::move(P));
}; };
if (!shard.is_valid_ext()) { if (!shard.is_valid_ext()) {
new_promise.set_error(td::Status::Error(PSTRING() << "invalid shard " << shard.to_str())); new_promise.set_error(td::Status::Error(PSTRING() << "invalid shard " << shard.to_str()));

View file

@ -352,9 +352,9 @@ void FullNodeImpl::send_shard_block_info(BlockIdExt block_id, CatchainSeqno cc_s
td::actor::send_closure(private_block_overlays_.begin()->second, td::actor::send_closure(private_block_overlays_.begin()->second,
&FullNodePrivateBlockOverlay::send_shard_block_info, block_id, cc_seqno, data.clone()); &FullNodePrivateBlockOverlay::send_shard_block_info, block_id, cc_seqno, data.clone());
} }
auto private_overlay = fast_sync_overlays_.choose_overlay(ShardIdFull(masterchainId)); auto fast_sync_overlay = fast_sync_overlays_.choose_overlay(ShardIdFull(masterchainId));
if (!private_overlay.empty()) { if (!fast_sync_overlay.empty()) {
td::actor::send_closure(private_overlay, &FullNodeFastSyncOverlay::send_shard_block_info, block_id, cc_seqno, td::actor::send_closure(fast_sync_overlay, &FullNodeFastSyncOverlay::send_shard_block_info, block_id, cc_seqno,
data.clone()); data.clone());
} }
td::actor::send_closure(shard, &FullNodeShard::send_shard_block_info, block_id, cc_seqno, std::move(data)); td::actor::send_closure(shard, &FullNodeShard::send_shard_block_info, block_id, cc_seqno, std::move(data));
@ -372,9 +372,9 @@ void FullNodeImpl::send_block_candidate(BlockIdExt block_id, CatchainSeqno cc_se
td::actor::send_closure(private_block_overlays_.begin()->second, &FullNodePrivateBlockOverlay::send_block_candidate, td::actor::send_closure(private_block_overlays_.begin()->second, &FullNodePrivateBlockOverlay::send_block_candidate,
block_id, cc_seqno, validator_set_hash, data.clone()); block_id, cc_seqno, validator_set_hash, data.clone());
} }
auto private_overlay = fast_sync_overlays_.choose_overlay(block_id.shard_full()); auto fast_sync_overlay = fast_sync_overlays_.choose_overlay(block_id.shard_full());
if (!private_overlay.empty()) { if (!fast_sync_overlay.empty()) {
td::actor::send_closure(private_overlay, &FullNodeFastSyncOverlay::send_block_candidate, block_id, cc_seqno, td::actor::send_closure(fast_sync_overlay, &FullNodeFastSyncOverlay::send_block_candidate, block_id, cc_seqno,
validator_set_hash, data.clone()); validator_set_hash, data.clone());
} }
if (broadcast_block_candidates_in_public_overlay_) { if (broadcast_block_candidates_in_public_overlay_) {
@ -393,13 +393,15 @@ void FullNodeImpl::send_broadcast(BlockBroadcast broadcast, bool custom_overlays
VLOG(FULL_NODE_WARNING) << "dropping OUT broadcast to unknown shard"; VLOG(FULL_NODE_WARNING) << "dropping OUT broadcast to unknown shard";
return; return;
} }
if (broadcast.block_id.is_masterchain() && !private_block_overlays_.empty()) { if (broadcast.block_id.is_masterchain()) {
td::actor::send_closure(private_block_overlays_.begin()->second, &FullNodePrivateBlockOverlay::send_broadcast, if (!private_block_overlays_.empty()) {
broadcast.clone()); td::actor::send_closure(private_block_overlays_.begin()->second, &FullNodePrivateBlockOverlay::send_broadcast,
} broadcast.clone());
auto private_overlay = fast_sync_overlays_.choose_overlay(broadcast.block_id.shard_full()); }
if (!private_overlay.empty()) { auto fast_sync_overlay = fast_sync_overlays_.choose_overlay(broadcast.block_id.shard_full());
td::actor::send_closure(private_overlay, &FullNodeFastSyncOverlay::send_broadcast, broadcast.clone()); if (!fast_sync_overlay.empty()) {
td::actor::send_closure(fast_sync_overlay, &FullNodeFastSyncOverlay::send_broadcast, broadcast.clone());
}
} }
td::actor::send_closure(shard, &FullNodeShard::send_broadcast, std::move(broadcast)); td::actor::send_closure(shard, &FullNodeShard::send_broadcast, std::move(broadcast));
} }