Skip to content

Commit 9452c36

Browse files
LS queries to nonfinal blocks (ton-blockchain#941)
Co-authored-by: SpyCheese <[email protected]>
1 parent 0feaaf5 commit 9452c36

23 files changed

+809
-150
lines changed

tl-utils/lite-utils.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -155,7 +155,9 @@ std::string lite_query_name_by_id(int id) {
155155
{lite_api::liteServer_getConfigParams::ID, "getConfigParams"},
156156
{lite_api::liteServer_getValidatorStats::ID, "getValidatorStats"},
157157
{lite_api::liteServer_getLibraries::ID, "getLibraries"},
158-
{lite_api::liteServer_getShardBlockProof::ID, "getShardBlockProof"}};
158+
{lite_api::liteServer_getShardBlockProof::ID, "getShardBlockProof"},
159+
{lite_api::liteServer_nonfinal_getCandidate::ID, "nonfinal.getCandidate"},
160+
{lite_api::liteServer_nonfinal_getValidatorGroups::ID, "nonfinal.getValidatorGroups"}};
159161
auto it = names.find(id);
160162
if (it == names.end()) {
161163
return "unknown";

tl/generate/scheme/lite_api.tl

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,12 @@ liteServer.lookupBlockResult id:tonNode.blockIdExt mode:# mc_block_id:tonNode.bl
6060

6161
liteServer.debug.verbosity value:int = liteServer.debug.Verbosity;
6262

63+
liteServer.nonfinal.candidateId block_id:tonNode.blockIdExt creator:int256 collated_data_hash:int256 = liteServer.nonfinal.CandidateId;
64+
liteServer.nonfinal.candidate id:liteServer.nonfinal.candidateId data:bytes collated_data:bytes = liteServer.nonfinal.Candidate;
65+
liteServer.nonfinal.candidateInfo id:liteServer.nonfinal.candidateId available:Bool approved_weight:long signed_weight:long total_weight:long = liteServer.nonfinal.CandidateInfo;
66+
liteServer.nonfinal.validatorGroupInfo next_block_id:tonNode.blockId cc_seqno:int prev:(vector tonNode.blockIdExt) candidates:(vector liteServer.nonfinal.candidateInfo) = liteServer.nonfinal.ValidatorGroupInfo;
67+
liteServer.nonfinal.validatorGroups groups:(vector liteServer.nonfinal.validatorGroupInfo) = liteServer.nonfinal.ValidatorGroups;
68+
6369
---functions---
6470

6571
liteServer.getMasterchainInfo = liteServer.MasterchainInfo;
@@ -89,6 +95,9 @@ liteServer.getLibraries library_list:(vector int256) = liteServer.LibraryResult;
8995
liteServer.getLibrariesWithProof id:tonNode.blockIdExt mode:# library_list:(vector int256) = liteServer.LibraryResultWithProof;
9096
liteServer.getShardBlockProof id:tonNode.blockIdExt = liteServer.ShardBlockProof;
9197

98+
liteServer.nonfinal.getValidatorGroups mode:# wc:mode.0?int shard:mode.1?long = liteServer.nonfinal.ValidatorGroups;
99+
liteServer.nonfinal.getCandidate id:liteServer.nonfinal.candidateId = liteServer.nonfinal.Candidate;
100+
92101
liteServer.queryPrefix = Object;
93102
liteServer.query data:bytes = Object;
94103
liteServer.waitMasterchainSeqno seqno:int timeout_ms:int = Object; // query prefix

tl/generate/scheme/lite_api.tlo

1.58 KB
Binary file not shown.

validator-engine/validator-engine.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1368,6 +1368,7 @@ td::Status ValidatorEngine::load_global_config() {
13681368
validator_options_.write().set_max_open_archive_files(max_open_archive_files_);
13691369
validator_options_.write().set_archive_preload_period(archive_preload_period_);
13701370
validator_options_.write().set_disable_rocksdb_stats(disable_rocksdb_stats_);
1371+
validator_options_.write().set_nonfinal_ls_queries_enabled(nonfinal_ls_queries_enabled_);
13711372

13721373
std::vector<ton::BlockIdExt> h;
13731374
for (auto &x : conf.validator_->hardforks_) {
@@ -3820,6 +3821,9 @@ int main(int argc, char *argv[]) {
38203821
p.add_option('\0', "disable-rocksdb-stats", "disable gathering rocksdb statistics (enabled by default)", [&]() {
38213822
acts.push_back([&x]() { td::actor::send_closure(x, &ValidatorEngine::set_disable_rocksdb_stats, true); });
38223823
});
3824+
p.add_option('\0', "nonfinal-ls", "enable special LS queries to non-finalized blocks", [&]() {
3825+
acts.push_back([&x]() { td::actor::send_closure(x, &ValidatorEngine::set_nonfinal_ls_queries_enabled); });
3826+
});
38233827
auto S = p.run(argc, argv);
38243828
if (S.is_error()) {
38253829
LOG(ERROR) << "failed to parse options: " << S.move_as_error();

validator-engine/validator-engine.hpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -207,6 +207,7 @@ class ValidatorEngine : public td::actor::Actor {
207207
size_t max_open_archive_files_ = 0;
208208
double archive_preload_period_ = 0.0;
209209
bool disable_rocksdb_stats_ = false;
210+
bool nonfinal_ls_queries_enabled_ = false;
210211
bool read_config_ = false;
211212
bool started_keyring_ = false;
212213
bool started_ = false;
@@ -276,6 +277,9 @@ class ValidatorEngine : public td::actor::Actor {
276277
void set_disable_rocksdb_stats(bool value) {
277278
disable_rocksdb_stats_ = value;
278279
}
280+
void set_nonfinal_ls_queries_enabled() {
281+
nonfinal_ls_queries_enabled_ = true;
282+
}
279283
void start_up() override;
280284
ValidatorEngine() {
281285
}

validator-session/validator-session-state.h

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -376,6 +376,15 @@ class ValidatorSessionRoundState : public ValidatorSessionDescription::RootObjec
376376
void dump(ValidatorSessionDescription& desc, td::StringBuilder& sb, td::uint32 att) const;
377377
void dump_cur_attempt(ValidatorSessionDescription& desc, td::StringBuilder& sb) const;
378378

379+
void for_each_sent_block(std::function<void(const SessionBlockCandidate*)> foo) const {
380+
if (!sent_blocks_) {
381+
return;
382+
}
383+
for (td::uint32 i = 0; i < sent_blocks_->size(); ++i) {
384+
foo(sent_blocks_->at(i));
385+
}
386+
}
387+
379388
private:
380389
const SentBlock* precommitted_block_;
381390
const td::uint32 seqno_;
@@ -516,6 +525,19 @@ class ValidatorSessionState : public ValidatorSessionDescription::RootObject {
516525
cur_round_->dump_cur_attempt(desc, sb);
517526
}
518527

528+
void for_each_cur_round_sent_block(std::function<void(const SessionBlockCandidate*)> foo) const {
529+
cur_round_->for_each_sent_block(std::move(foo));
530+
}
531+
532+
const SentBlock* get_cur_round_precommitted_block() const {
533+
bool found;
534+
return cur_round_->get_precommitted_block(found);
535+
}
536+
537+
const CntVector<const SessionBlockCandidateSignature*>* get_cur_round_signatures() const {
538+
return cur_round_->get_signatures();
539+
}
540+
519541
static const ValidatorSessionState* make_one(ValidatorSessionDescription& desc, const ValidatorSessionState* state,
520542
td::uint32 src_idx, td::uint32 att, bool& made);
521543
static const ValidatorSessionState* make_all(ValidatorSessionDescription& desc, const ValidatorSessionState* state,

validator-session/validator-session.cpp

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -929,6 +929,53 @@ void ValidatorSessionImpl::get_current_stats(td::Promise<ValidatorSessionStats>
929929
promise.set_result(std::move(stats));
930930
}
931931

932+
void ValidatorSessionImpl::get_validator_group_info_for_litequery(
933+
td::uint32 cur_round,
934+
td::Promise<std::vector<tl_object_ptr<lite_api::liteServer_nonfinal_candidateInfo>>> promise) {
935+
if (cur_round != cur_round_ || real_state_->cur_round_seqno() != cur_round) {
936+
promise.set_value({});
937+
return;
938+
}
939+
std::vector<tl_object_ptr<lite_api::liteServer_nonfinal_candidateInfo>> result;
940+
real_state_->for_each_cur_round_sent_block([&](const SessionBlockCandidate *block) {
941+
if (block->get_block() == nullptr) {
942+
return;
943+
}
944+
auto candidate = create_tl_object<lite_api::liteServer_nonfinal_candidateInfo>();
945+
946+
candidate->id_ = create_tl_object<lite_api::liteServer_nonfinal_candidateId>();
947+
candidate->id_->block_id_ = create_tl_object<lite_api::tonNode_blockIdExt>();
948+
candidate->id_->block_id_->root_hash_ =
949+
block->get_block()->get_root_hash(); // other fields will be filled in validator-group.cpp
950+
candidate->id_->block_id_->file_hash_ = block->get_block()->get_file_hash();
951+
candidate->id_->creator_ =
952+
description().get_source_public_key(block->get_block()->get_src_idx()).ed25519_value().raw();
953+
candidate->id_->collated_data_hash_ = block->get_block()->get_collated_data_file_hash();
954+
955+
candidate->total_weight_ = description().get_total_weight();
956+
candidate->approved_weight_ = 0;
957+
candidate->signed_weight_ = 0;
958+
for (td::uint32 i = 0; i < description().get_total_nodes(); ++i) {
959+
if (real_state_->check_block_is_approved_by(description(), i, block->get_id())) {
960+
candidate->approved_weight_ += description().get_node_weight(i);
961+
}
962+
}
963+
auto precommited = real_state_->get_cur_round_precommitted_block();
964+
if (SentBlock::get_block_id(precommited) == SentBlock::get_block_id(block->get_block())) {
965+
auto signatures = real_state_->get_cur_round_signatures();
966+
if (signatures) {
967+
for (td::uint32 i = 0; i < description().get_total_nodes(); ++i) {
968+
if (signatures->at(i)) {
969+
candidate->signed_weight_ += description().get_node_weight(i);
970+
}
971+
}
972+
}
973+
}
974+
result.push_back(std::move(candidate));
975+
});
976+
promise.set_result(std::move(result));
977+
}
978+
932979
void ValidatorSessionImpl::start_up() {
933980
CHECK(!rldp_.empty());
934981
cur_round_ = 0;

validator-session/validator-session.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
#include "catchain/catchain-types.h"
2929

3030
#include "validator-session-types.h"
31+
#include "auto/tl/lite_api.h"
3132

3233
namespace ton {
3334

@@ -92,6 +93,9 @@ class ValidatorSession : public td::actor::Actor {
9293
virtual void start() = 0;
9394
virtual void destroy() = 0;
9495
virtual void get_current_stats(td::Promise<ValidatorSessionStats> promise) = 0;
96+
virtual void get_validator_group_info_for_litequery(
97+
td::uint32 cur_round,
98+
td::Promise<std::vector<tl_object_ptr<lite_api::liteServer_nonfinal_candidateInfo>>> promise) = 0;
9599

96100
static td::actor::ActorOwn<ValidatorSession> create(
97101
catchain::CatChainSessionId session_id, ValidatorSessionOptions opts, PublicKeyHash local_id,

validator-session/validator-session.hpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -175,6 +175,9 @@ class ValidatorSessionImpl : public ValidatorSession {
175175
void start() override;
176176
void destroy() override;
177177
void get_current_stats(td::Promise<ValidatorSessionStats> promise) override;
178+
void get_validator_group_info_for_litequery(
179+
td::uint32 cur_round,
180+
td::Promise<std::vector<tl_object_ptr<lite_api::liteServer_nonfinal_candidateInfo>>> promise) override;
178181

179182
void process_blocks(std::vector<catchain::CatChainBlock *> blocks);
180183
void finished_processing();

validator/impl/CMakeLists.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ endif()
77
set(TON_VALIDATOR_SOURCE
88
accept-block.cpp
99
block.cpp
10+
candidates-buffer.cpp
1011
check-proof.cpp
1112
collator.cpp
1213
config.cpp
@@ -24,6 +25,7 @@ set(TON_VALIDATOR_SOURCE
2425

2526
accept-block.hpp
2627
block.hpp
28+
candidates-buffer.hpp
2729
check-proof.hpp
2830
collate-query-impl.h
2931
collator-impl.h

0 commit comments

Comments
 (0)