mirror of
https://github.com/ton-blockchain/ton
synced 2025-03-09 15:40:10 +00:00
Automatically issue and import fast sync overlay certificates
This commit is contained in:
parent
09c4488fbf
commit
378b5e94c8
12 changed files with 661 additions and 183 deletions
|
@ -807,21 +807,21 @@ td::Status SignCertificateQuery::send() {
|
|||
auto sign = ton::create_serialize_tl_object<ton::ton_api::engine_validator_sign>(signer_.tl(), std::move(cid));
|
||||
auto pub = ton::create_serialize_tl_object<ton::ton_api::engine_validator_exportPublicKey>(signer_.tl());
|
||||
td::actor::send_closure(console_, &ValidatorEngineConsole::envelope_send_query, std::move(pub),
|
||||
td::PromiseCreator::lambda([SelfId = actor_id(this)](td::Result<td::BufferSlice> R) {
|
||||
if (R.is_error()) {
|
||||
td::actor::send_closure(SelfId, &SignCertificateQuery::handle_error, R.move_as_error());
|
||||
} else {
|
||||
td::actor::send_closure(SelfId, &SignCertificateQuery::receive_pubkey, R.move_as_ok());
|
||||
}
|
||||
}));
|
||||
td::PromiseCreator::lambda([SelfId = actor_id(this)](td::Result<td::BufferSlice> R) {
|
||||
if (R.is_error()) {
|
||||
td::actor::send_closure(SelfId, &SignCertificateQuery::handle_error, R.move_as_error());
|
||||
} else {
|
||||
td::actor::send_closure(SelfId, &SignCertificateQuery::receive_pubkey, R.move_as_ok());
|
||||
}
|
||||
}));
|
||||
td::actor::send_closure(console_, &ValidatorEngineConsole::envelope_send_query, std::move(sign),
|
||||
td::PromiseCreator::lambda([SelfId = actor_id(this)](td::Result<td::BufferSlice> R) {
|
||||
if (R.is_error()) {
|
||||
td::actor::send_closure(SelfId, &SignCertificateQuery::handle_error, R.move_as_error());
|
||||
} else {
|
||||
td::actor::send_closure(SelfId, &SignCertificateQuery::receive_signature, R.move_as_ok());
|
||||
}
|
||||
}));
|
||||
td::PromiseCreator::lambda([SelfId = actor_id(this)](td::Result<td::BufferSlice> R) {
|
||||
if (R.is_error()) {
|
||||
td::actor::send_closure(SelfId, &SignCertificateQuery::handle_error, R.move_as_error());
|
||||
} else {
|
||||
td::actor::send_closure(SelfId, &SignCertificateQuery::receive_signature, R.move_as_ok());
|
||||
}
|
||||
}));
|
||||
return td::Status::OK();
|
||||
}
|
||||
|
||||
|
@ -833,33 +833,32 @@ void SignCertificateQuery::receive_pubkey(td::BufferSlice R) {
|
|||
}
|
||||
pubkey_ = f.move_as_ok();
|
||||
has_pubkey_ = true;
|
||||
if(has_signature_) {
|
||||
if (has_signature_) {
|
||||
save_certificate();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
td::Status SignCertificateQuery::receive(td::BufferSlice data) {
|
||||
UNREACHABLE();
|
||||
}
|
||||
|
||||
void SignCertificateQuery::receive_signature(td::BufferSlice R) {
|
||||
auto f = ton::fetch_tl_object<ton::ton_api::engine_validator_signature>(R.as_slice(), true);
|
||||
if(f.is_error()){
|
||||
if (f.is_error()) {
|
||||
handle_error(f.move_as_error_prefix("Failed to get signature: "));
|
||||
return;
|
||||
}
|
||||
signature_ = std::move(f.move_as_ok()->signature_);
|
||||
if(has_pubkey_) {
|
||||
if (has_pubkey_) {
|
||||
save_certificate();
|
||||
}
|
||||
}
|
||||
|
||||
void SignCertificateQuery::save_certificate() {
|
||||
auto c = ton::create_serialize_tl_object<ton::ton_api::overlay_certificate>(
|
||||
std::move(pubkey_), expire_at_, max_size_, std::move(signature_));
|
||||
auto c = ton::create_serialize_tl_object<ton::ton_api::overlay_certificate>(std::move(pubkey_), expire_at_, max_size_,
|
||||
std::move(signature_));
|
||||
auto w = td::write_file(out_file_, c.as_slice());
|
||||
if(w.is_error()) {
|
||||
if (w.is_error()) {
|
||||
handle_error(w.move_as_error_prefix("Failed to write certificate to file: "));
|
||||
return;
|
||||
}
|
||||
|
@ -880,11 +879,8 @@ td::Status ImportCertificateQuery::send() {
|
|||
TRY_RESULT_PREFIX(cert, ton::fetch_tl_object<ton::ton_api::overlay_Certificate>(data.as_slice(), true),
|
||||
"incorrect certificate");
|
||||
auto b = ton::create_serialize_tl_object<ton::ton_api::engine_validator_importCertificate>(
|
||||
overlay_,
|
||||
ton::create_tl_object<ton::ton_api::adnl_id_short>(id_),
|
||||
ton::create_tl_object<ton::ton_api::engine_validator_keyHash>(kh_.tl()),
|
||||
std::move(cert)
|
||||
);
|
||||
overlay_, ton::create_tl_object<ton::ton_api::adnl_id_short>(id_),
|
||||
ton::create_tl_object<ton::ton_api::engine_validator_keyHash>(kh_.tl()), std::move(cert));
|
||||
td::actor::send_closure(console_, &ValidatorEngineConsole::envelope_send_query, std::move(b), create_promise());
|
||||
return td::Status::OK();
|
||||
}
|
||||
|
@ -1031,7 +1027,6 @@ td::Status GetOverlaysStatsJsonQuery::receive(td::BufferSlice data) {
|
|||
return td::Status::OK();
|
||||
}
|
||||
|
||||
|
||||
td::Status ImportCertificateQuery::receive(td::BufferSlice data) {
|
||||
TRY_RESULT_PREFIX(f, ton::fetch_tl_object<ton::ton_api::engine_validator_success>(data.as_slice(), true),
|
||||
"received incorrect answer: ");
|
||||
|
@ -1039,10 +1034,9 @@ td::Status ImportCertificateQuery::receive(td::BufferSlice data) {
|
|||
return td::Status::OK();
|
||||
}
|
||||
|
||||
|
||||
td::Status SignShardOverlayCertificateQuery::run() {
|
||||
TRY_RESULT_ASSIGN(wc_, tokenizer_.get_token<td::int32>());
|
||||
TRY_RESULT_ASSIGN(shard_, tokenizer_.get_token<td::int64>() );
|
||||
TRY_RESULT_ASSIGN(shard_, tokenizer_.get_token<td::int64>());
|
||||
TRY_RESULT_ASSIGN(key_, tokenizer_.get_token<ton::PublicKeyHash>());
|
||||
TRY_RESULT_ASSIGN(expire_at_, tokenizer_.get_token<td::int32>());
|
||||
TRY_RESULT_ASSIGN(max_size_, tokenizer_.get_token<td::uint32>());
|
||||
|
@ -1052,8 +1046,8 @@ td::Status SignShardOverlayCertificateQuery::run() {
|
|||
}
|
||||
|
||||
td::Status SignShardOverlayCertificateQuery::send() {
|
||||
auto b = ton::create_serialize_tl_object<ton::ton_api::engine_validator_signShardOverlayCertificate>
|
||||
(wc_, shard_, ton::create_tl_object<ton::ton_api::engine_validator_keyHash>(key_.tl()), expire_at_, max_size_);
|
||||
auto b = ton::create_serialize_tl_object<ton::ton_api::engine_validator_signShardOverlayCertificate>(
|
||||
wc_, shard_, ton::create_tl_object<ton::ton_api::engine_validator_keyHash>(key_.tl()), expire_at_, max_size_);
|
||||
td::actor::send_closure(console_, &ValidatorEngineConsole::envelope_send_query, std::move(b), create_promise());
|
||||
return td::Status::OK();
|
||||
}
|
||||
|
@ -1062,7 +1056,7 @@ td::Status SignShardOverlayCertificateQuery::receive(td::BufferSlice data) {
|
|||
TRY_RESULT_PREFIX(c, ton::fetch_tl_object<ton::ton_api::overlay_certificate>(data.as_slice(), true),
|
||||
"received incorrect cert: ");
|
||||
auto w = td::write_file(out_file_, data.as_slice());
|
||||
if(w.is_error()) {
|
||||
if (w.is_error()) {
|
||||
return w.move_as_error_prefix("Failed to write certificate to file: ");
|
||||
}
|
||||
td::TerminalIO::out() << "saved certificate\n";
|
||||
|
@ -1072,7 +1066,7 @@ td::Status SignShardOverlayCertificateQuery::receive(td::BufferSlice data) {
|
|||
|
||||
td::Status ImportShardOverlayCertificateQuery::run() {
|
||||
TRY_RESULT_ASSIGN(wc_, tokenizer_.get_token<td::int32>());
|
||||
TRY_RESULT_ASSIGN(shard_, tokenizer_.get_token<td::int64>() );
|
||||
TRY_RESULT_ASSIGN(shard_, tokenizer_.get_token<td::int64>());
|
||||
TRY_RESULT_ASSIGN(key_, tokenizer_.get_token<ton::PublicKeyHash>());
|
||||
TRY_RESULT_ASSIGN(in_file_, tokenizer_.get_token<std::string>());
|
||||
|
||||
|
@ -1083,8 +1077,8 @@ td::Status ImportShardOverlayCertificateQuery::send() {
|
|||
TRY_RESULT(data, td::read_file(in_file_));
|
||||
TRY_RESULT_PREFIX(cert, ton::fetch_tl_object<ton::ton_api::overlay_Certificate>(data.as_slice(), true),
|
||||
"incorrect certificate");
|
||||
auto b = ton::create_serialize_tl_object<ton::ton_api::engine_validator_importShardOverlayCertificate>
|
||||
(wc_, shard_, ton::create_tl_object<ton::ton_api::engine_validator_keyHash>(key_.tl()), std::move(cert));
|
||||
auto b = ton::create_serialize_tl_object<ton::ton_api::engine_validator_importShardOverlayCertificate>(
|
||||
wc_, shard_, ton::create_tl_object<ton::ton_api::engine_validator_keyHash>(key_.tl()), std::move(cert));
|
||||
td::actor::send_closure(console_, &ValidatorEngineConsole::envelope_send_query, std::move(b), create_promise());
|
||||
return td::Status::OK();
|
||||
}
|
||||
|
@ -1908,3 +1902,42 @@ td::Status ImportFastSyncMemberCertificateQuery::receive(td::BufferSlice data) {
|
|||
td::TerminalIO::out() << "success\n";
|
||||
return td::Status::OK();
|
||||
}
|
||||
|
||||
td::Status AddFastSyncOverlayClientQuery::run() {
|
||||
TRY_RESULT_ASSIGN(adnl_id_, tokenizer_.get_token<td::Bits256>());
|
||||
TRY_RESULT_ASSIGN(slot_, tokenizer_.get_token<td::int32>());
|
||||
TRY_STATUS(tokenizer_.check_endl());
|
||||
return td::Status::OK();
|
||||
}
|
||||
|
||||
td::Status AddFastSyncOverlayClientQuery::send() {
|
||||
auto b = ton::create_serialize_tl_object<ton::ton_api::engine_validator_addFastSyncClient>(adnl_id_, slot_);
|
||||
td::actor::send_closure(console_, &ValidatorEngineConsole::envelope_send_query, std::move(b), create_promise());
|
||||
return td::Status::OK();
|
||||
}
|
||||
|
||||
td::Status AddFastSyncOverlayClientQuery::receive(td::BufferSlice data) {
|
||||
TRY_RESULT_PREFIX(f, ton::fetch_tl_object<ton::ton_api::engine_validator_success>(data.as_slice(), true),
|
||||
"received incorrect answer: ");
|
||||
td::TerminalIO::out() << "success\n";
|
||||
return td::Status::OK();
|
||||
}
|
||||
|
||||
td::Status DelFastSyncOverlayClientQuery::run() {
|
||||
TRY_RESULT_ASSIGN(adnl_id_, tokenizer_.get_token<td::Bits256>());
|
||||
TRY_STATUS(tokenizer_.check_endl());
|
||||
return td::Status::OK();
|
||||
}
|
||||
|
||||
td::Status DelFastSyncOverlayClientQuery::send() {
|
||||
auto b = ton::create_serialize_tl_object<ton::ton_api::engine_validator_delFastSyncClient>(adnl_id_);
|
||||
td::actor::send_closure(console_, &ValidatorEngineConsole::envelope_send_query, std::move(b), create_promise());
|
||||
return td::Status::OK();
|
||||
}
|
||||
|
||||
td::Status DelFastSyncOverlayClientQuery::receive(td::BufferSlice data) {
|
||||
TRY_RESULT_PREFIX(f, ton::fetch_tl_object<ton::ton_api::engine_validator_success>(data.as_slice(), true),
|
||||
"received incorrect answer: ");
|
||||
td::TerminalIO::out() << "success\n";
|
||||
return td::Status::OK();
|
||||
}
|
||||
|
|
|
@ -979,9 +979,9 @@ class GetOverlaysStatsJsonQuery : public Query {
|
|||
std::string name() const override {
|
||||
return get_name();
|
||||
}
|
||||
|
||||
private:
|
||||
std::string file_name_;
|
||||
|
||||
private:
|
||||
std::string file_name_;
|
||||
};
|
||||
|
||||
class SignCertificateQuery : public Query {
|
||||
|
@ -996,7 +996,8 @@ class SignCertificateQuery : public Query {
|
|||
return "signcert";
|
||||
}
|
||||
static std::string get_help() {
|
||||
return "signcert <overlayid> <adnlid> <expireat> <maxsize> <signwith> <outfile>\tsign overlay certificate by <signwith> key";
|
||||
return "signcert <overlayid> <adnlid> <expireat> <maxsize> <signwith> <outfile>\tsign overlay certificate by "
|
||||
"<signwith> key";
|
||||
}
|
||||
std::string name() const override {
|
||||
return get_name();
|
||||
|
@ -1004,9 +1005,8 @@ class SignCertificateQuery : public Query {
|
|||
void receive_pubkey(td::BufferSlice R);
|
||||
void receive_signature(td::BufferSlice R);
|
||||
|
||||
|
||||
private:
|
||||
void save_certificate();
|
||||
void save_certificate();
|
||||
|
||||
td::Bits256 overlay_;
|
||||
td::Bits256 id_;
|
||||
|
@ -1057,14 +1057,14 @@ class SignShardOverlayCertificateQuery : public Query {
|
|||
return "signshardoverlaycert";
|
||||
}
|
||||
static std::string get_help() {
|
||||
return "signshardoverlaycert <workchain> <shardprefix> <key> <expireat> <maxsize> <outfile>\tsign certificate for <key> in currently active shard overlay";
|
||||
return "signshardoverlaycert <workchain> <shardprefix> <key> <expireat> <maxsize> <outfile>\tsign certificate for "
|
||||
"<key> in currently active shard overlay";
|
||||
}
|
||||
std::string name() const override {
|
||||
return get_name();
|
||||
}
|
||||
|
||||
private:
|
||||
|
||||
td::int32 wc_;
|
||||
td::int64 shard_;
|
||||
td::int32 expire_at_;
|
||||
|
@ -1073,7 +1073,6 @@ class SignShardOverlayCertificateQuery : public Query {
|
|||
std::string out_file_;
|
||||
};
|
||||
|
||||
|
||||
class ImportShardOverlayCertificateQuery : public Query {
|
||||
public:
|
||||
ImportShardOverlayCertificateQuery(td::actor::ActorId<ValidatorEngineConsole> console, Tokenizer tokenizer)
|
||||
|
@ -1086,14 +1085,14 @@ class ImportShardOverlayCertificateQuery : public Query {
|
|||
return "importshardoverlaycert";
|
||||
}
|
||||
static std::string get_help() {
|
||||
return "importshardoverlaycert <workchain> <shardprefix> <key> <certfile>\timport certificate for <key> in currently active shard overlay";
|
||||
return "importshardoverlaycert <workchain> <shardprefix> <key> <certfile>\timport certificate for <key> in "
|
||||
"currently active shard overlay";
|
||||
}
|
||||
std::string name() const override {
|
||||
return get_name();
|
||||
}
|
||||
|
||||
private:
|
||||
|
||||
td::int32 wc_;
|
||||
td::int64 shard_;
|
||||
ton::PublicKeyHash key_;
|
||||
|
@ -1134,7 +1133,8 @@ class GetPerfTimerStatsJsonQuery : public Query {
|
|||
return "getperftimerstatsjson";
|
||||
}
|
||||
static std::string get_help() {
|
||||
return "getperftimerstatsjson <outfile>\tgets min, average and max event processing time for last 60, 300 and 3600 seconds and writes to json file";
|
||||
return "getperftimerstatsjson <outfile>\tgets min, average and max event processing time for last 60, 300 and 3600 "
|
||||
"seconds and writes to json file";
|
||||
}
|
||||
std::string name() const override {
|
||||
return get_name();
|
||||
|
@ -1696,3 +1696,50 @@ class ImportFastSyncMemberCertificateQuery : public Query {
|
|||
td::Bits256 adnl_id_;
|
||||
std::string file_name_;
|
||||
};
|
||||
|
||||
class AddFastSyncOverlayClientQuery : public Query {
|
||||
public:
|
||||
AddFastSyncOverlayClientQuery(td::actor::ActorId<ValidatorEngineConsole> console, Tokenizer tokenizer)
|
||||
: Query(console, std::move(tokenizer)) {
|
||||
}
|
||||
td::Status run() override;
|
||||
td::Status send() override;
|
||||
td::Status receive(td::BufferSlice data) override;
|
||||
static std::string get_name() {
|
||||
return "addfastsyncoverlayclient";
|
||||
}
|
||||
static std::string get_help() {
|
||||
return "addfastsyncoverlayclient <adnl_id> <slot>\tstarts issuing member certificates "
|
||||
"to <adnl_id> (hex) on slot (int)";
|
||||
}
|
||||
std::string name() const override {
|
||||
return get_name();
|
||||
}
|
||||
|
||||
private:
|
||||
td::Bits256 adnl_id_;
|
||||
td::int32 slot_;
|
||||
};
|
||||
|
||||
class DelFastSyncOverlayClientQuery : public Query {
|
||||
public:
|
||||
DelFastSyncOverlayClientQuery(td::actor::ActorId<ValidatorEngineConsole> console, Tokenizer tokenizer)
|
||||
: Query(console, std::move(tokenizer)) {
|
||||
}
|
||||
td::Status run() override;
|
||||
td::Status send() override;
|
||||
td::Status receive(td::BufferSlice data) override;
|
||||
static std::string get_name() {
|
||||
return "delfastsyncoverlayclient";
|
||||
}
|
||||
static std::string get_help() {
|
||||
return "delfastsyncoverlayclient <adnl_id> <slot>\tstops issuing member certificates "
|
||||
"to <adnl_id> (hex)";
|
||||
}
|
||||
std::string name() const override {
|
||||
return get_name();
|
||||
}
|
||||
|
||||
private:
|
||||
td::Bits256 adnl_id_;
|
||||
};
|
||||
|
|
|
@ -168,6 +168,8 @@ void ValidatorEngineConsole::run() {
|
|||
add_query_runner(std::make_unique<QueryRunnerImpl<GetCollationManagerStatsQuery>>());
|
||||
add_query_runner(std::make_unique<QueryRunnerImpl<SignOverlayMemberCertificateQuery>>());
|
||||
add_query_runner(std::make_unique<QueryRunnerImpl<ImportFastSyncMemberCertificateQuery>>());
|
||||
add_query_runner(std::make_unique<QueryRunnerImpl<AddFastSyncOverlayClientQuery>>());
|
||||
add_query_runner(std::make_unique<QueryRunnerImpl<DelFastSyncOverlayClientQuery>>());
|
||||
}
|
||||
|
||||
bool ValidatorEngineConsole::envelope_send_query(td::BufferSlice query, td::Promise<td::BufferSlice> promise) {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue