mirror of
https://github.com/ton-blockchain/ton
synced 2025-02-12 11:12:16 +00:00
Add methods to sign and import certificates
This commit is contained in:
parent
3384d204d2
commit
cb31a20206
20 changed files with 682 additions and 18 deletions
|
@ -21,13 +21,18 @@
|
|||
#include "overlay.h"
|
||||
|
||||
#include "adnl/utils.hpp"
|
||||
#include "td/actor/actor.h"
|
||||
#include "td/actor/common.h"
|
||||
#include "td/utils/Random.h"
|
||||
|
||||
#include "td/db/RocksDb.h"
|
||||
|
||||
#include "td/utils/Status.h"
|
||||
#include "td/utils/overloaded.h"
|
||||
|
||||
#include "keys/encryptor.h"
|
||||
#include "td/utils/port/Poll.h"
|
||||
#include <vector>
|
||||
|
||||
namespace ton {
|
||||
|
||||
|
@ -269,6 +274,52 @@ void OverlayManager::save_to_db(adnl::AdnlNodeIdShort local_id, OverlayIdShort o
|
|||
db_.set(key, create_serialize_tl_object<ton_api::overlay_db_nodes>(std::move(obj)));
|
||||
}
|
||||
|
||||
void OverlayManager::get_stats(td::Promise<tl_object_ptr<ton_api::engine_validator_overlaysStats>> promise) {
|
||||
class Cb : public td::actor::Actor {
|
||||
public:
|
||||
Cb(td::Promise<tl_object_ptr<ton_api::engine_validator_overlaysStats>> promise) : promise_(std::move(promise)) {
|
||||
}
|
||||
void incr_pending() {
|
||||
pending_++;
|
||||
}
|
||||
void decr_pending() {
|
||||
if (!--pending_) {
|
||||
promise_.set_result(create_tl_object<ton_api::engine_validator_overlaysStats>(std::move(res_)));
|
||||
stop();
|
||||
}
|
||||
}
|
||||
void receive_answer(tl_object_ptr<ton_api::engine_validator_overlayStats> res) {
|
||||
if (res) {
|
||||
res_.push_back(std::move(res));
|
||||
}
|
||||
decr_pending();
|
||||
}
|
||||
|
||||
private:
|
||||
std::vector<tl_object_ptr<ton_api::engine_validator_overlayStats>> res_;
|
||||
size_t pending_{1};
|
||||
td::Promise<tl_object_ptr<ton_api::engine_validator_overlaysStats>> promise_;
|
||||
};
|
||||
|
||||
auto act = td::actor::create_actor<Cb>("overlaysstatsmerger", std::move(promise)).release();
|
||||
|
||||
for (auto &a : overlays_) {
|
||||
for (auto &b : a.second) {
|
||||
td::actor::send_closure(act, &Cb::incr_pending);
|
||||
td::actor::send_closure(b.second, &Overlay::get_stats,
|
||||
[act](td::Result<tl_object_ptr<ton_api::engine_validator_overlayStats>> R) {
|
||||
if (R.is_ok()) {
|
||||
td::actor::send_closure(act, &Cb::receive_answer, R.move_as_ok());
|
||||
} else {
|
||||
td::actor::send_closure(act, &Cb::receive_answer, nullptr);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
td::actor::send_closure(act, &Cb::decr_pending);
|
||||
}
|
||||
|
||||
Certificate::Certificate(PublicKey issued_by, td::int32 expire_at, td::uint32 max_size, td::uint32 flags,
|
||||
td::BufferSlice signature)
|
||||
: issued_by_(issued_by)
|
||||
|
|
|
@ -91,6 +91,7 @@ class OverlayManager : public Overlays {
|
|||
|
||||
void register_overlay(adnl::AdnlNodeIdShort local_id, OverlayIdShort overlay_id,
|
||||
td::actor::ActorOwn<Overlay> overlay);
|
||||
void get_stats(td::Promise<tl_object_ptr<ton_api::engine_validator_overlaysStats>> promise) override;
|
||||
|
||||
struct PrintId {};
|
||||
|
||||
|
|
|
@ -16,6 +16,7 @@
|
|||
|
||||
Copyright 2017-2020 Telegram Systems LLP
|
||||
*/
|
||||
#include "auto/tl/ton_api.h"
|
||||
#include "td/utils/Random.h"
|
||||
|
||||
#include "adnl/utils.hpp"
|
||||
|
@ -25,6 +26,7 @@
|
|||
#include "auto/tl/ton_api.hpp"
|
||||
|
||||
#include "keys/encryptor.h"
|
||||
#include "td/utils/StringBuilder.h"
|
||||
|
||||
namespace ton {
|
||||
|
||||
|
@ -554,6 +556,19 @@ void OverlayImpl::broadcast_checked(Overlay::BroadcastHash hash, td::Result<td::
|
|||
}
|
||||
}
|
||||
|
||||
void OverlayImpl::get_stats(td::Promise<tl_object_ptr<ton_api::engine_validator_overlayStats>> promise) {
|
||||
auto res = create_tl_object<ton_api::engine_validator_overlayStats>();
|
||||
res->adnl_id_ = local_id_.bits256_value();
|
||||
res->overlay_id_ = overlay_id_.bits256_value();
|
||||
res->overlay_id_full_ = id_full_.pubkey().tl();
|
||||
peers_.iterate([&](const adnl::AdnlNodeIdShort &key, const OverlayPeer &peer) { res->nodes_.push_back(key.tl()); });
|
||||
|
||||
res->stats_.push_back(
|
||||
create_tl_object<ton_api::engine_validator_oneStat>("neighbours_cnt", PSTRING() << neighbours_.size()));
|
||||
|
||||
promise.set_value(std::move(res));
|
||||
}
|
||||
|
||||
} // namespace overlay
|
||||
|
||||
} // namespace ton
|
||||
|
|
|
@ -63,6 +63,7 @@ class Overlay : public td::actor::Actor {
|
|||
virtual void add_certificate(PublicKeyHash key, std::shared_ptr<Certificate>) = 0;
|
||||
virtual void set_privacy_rules(OverlayPrivacyRules rules) = 0;
|
||||
virtual void receive_nodes_from_db(tl_object_ptr<ton_api::overlay_nodes> nodes) = 0;
|
||||
virtual void get_stats(td::Promise<tl_object_ptr<ton_api::engine_validator_overlayStats>> promise) = 0;
|
||||
//virtual void receive_broadcast(td::BufferSlice data) = 0;
|
||||
//virtual void subscribe(std::unique_ptr<Overlays::Callback> callback) = 0;
|
||||
};
|
||||
|
@ -70,4 +71,3 @@ class Overlay : public td::actor::Actor {
|
|||
} // namespace overlay
|
||||
|
||||
} // namespace ton
|
||||
|
||||
|
|
|
@ -190,6 +190,8 @@ class OverlayImpl : public Overlay {
|
|||
std::shared_ptr<Certificate> get_certificate(PublicKeyHash local_id);
|
||||
td::Result<Encryptor *> get_encryptor(PublicKey source);
|
||||
|
||||
void get_stats(td::Promise<tl_object_ptr<ton_api::engine_validator_overlayStats>> promise) override;
|
||||
|
||||
private:
|
||||
template <class T>
|
||||
void process_query(adnl::AdnlNodeIdShort src, T &query, td::Promise<td::BufferSlice> promise) {
|
||||
|
|
|
@ -231,6 +231,7 @@ class Overlays : public td::actor::Actor {
|
|||
|
||||
virtual void get_overlay_random_peers(adnl::AdnlNodeIdShort local_id, OverlayIdShort overlay, td::uint32 max_peers,
|
||||
td::Promise<std::vector<adnl::AdnlNodeIdShort>> promise) = 0;
|
||||
virtual void get_stats(td::Promise<tl_object_ptr<ton_api::engine_validator_overlaysStats>> promise) = 0;
|
||||
};
|
||||
|
||||
} // namespace overlay
|
||||
|
|
|
@ -46,6 +46,17 @@ class DecTree {
|
|||
}
|
||||
}
|
||||
|
||||
template <typename FuncT>
|
||||
void iterate(const FuncT &cb) {
|
||||
if (left_) {
|
||||
left_->iterate(cb);
|
||||
}
|
||||
cb(key_, value_);
|
||||
if (right_) {
|
||||
right_->iterate(cb);
|
||||
}
|
||||
}
|
||||
|
||||
Node(KeyType key, ValueType value, uint32 y) : size_(1), key_(std::move(key)), value_(std::move(value)), y_(y) {
|
||||
}
|
||||
};
|
||||
|
@ -223,6 +234,15 @@ class DecTree {
|
|||
bool exists(const KeyType &key) const {
|
||||
return get_node(root_, key) != nullptr;
|
||||
}
|
||||
|
||||
template <typename FuncT>
|
||||
void iterate(const FuncT &cb) {
|
||||
if (size() == 0) {
|
||||
return;
|
||||
} else {
|
||||
root_->iterate(cb);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
} // namespace td
|
||||
|
|
|
@ -620,6 +620,11 @@ engine.validator.proposalVote perm_key:int256 to_send:bytes = engine.validator.P
|
|||
engine.validator.dhtServerStatus id:int256 status:int = engine.validator.DhtServerStatus;
|
||||
engine.validator.dhtServersStatus servers:(vector engine.validator.dhtServerStatus) = engine.validator.DhtServersStatus;
|
||||
|
||||
engine.validator.overlayStats overlay_id:int256 overlay_id_full:PublicKey adnl_id:int256 nodes:(vector adnl.id.short)
|
||||
stats:(vector engine.validator.oneStat) = engine.validator.OverlayStats;
|
||||
engine.validator.overlaysStats overlays:(vector engine.validator.overlayStats) = engine.validator.OverlaysStats;
|
||||
|
||||
|
||||
---functions---
|
||||
|
||||
engine.validator.getTime = engine.validator.Time;
|
||||
|
@ -661,8 +666,14 @@ engine.validator.createComplaintVote election_id:int vote:bytes = engine.validat
|
|||
|
||||
engine.validator.checkDhtServers id:int256 = engine.validator.DhtServersStatus;
|
||||
|
||||
engine.validator.getOverlaysStats = engine.validator.OverlaysStats;
|
||||
|
||||
engine.validator.controlQuery data:bytes = Object;
|
||||
|
||||
engine.validator.importCertificate overlay_id:int256 local_id:adnl.id.short signed_key:engine.validator.KeyHash cert:overlay.Certificate = engine.validator.Success;
|
||||
engine.validator.signShardOverlayCertificate workchain:int shard:long signed_key:engine.validator.KeyHash expire_at:int max_size:int = overlay.Certificate;
|
||||
engine.validator.importShardOverlayCertificate workchain:int shard:long signed_key:engine.validator.KeyHash cert:overlay.Certificate = engine.validator.Success;
|
||||
|
||||
---types---
|
||||
|
||||
storage.pong = storage.Pong;
|
||||
|
|
Binary file not shown.
|
@ -26,9 +26,12 @@
|
|||
Copyright 2017-2020 Telegram Systems LLP
|
||||
*/
|
||||
#include "validator-engine-console-query.h"
|
||||
#include "auto/tl/ton_api.h"
|
||||
#include "td/utils/StringBuilder.h"
|
||||
#include "validator-engine-console.h"
|
||||
#include "terminal/terminal.h"
|
||||
#include "td/utils/filesystem.h"
|
||||
#include "overlay/overlays.h"
|
||||
|
||||
#include <cctype>
|
||||
|
||||
|
@ -720,3 +723,193 @@ td::Status CheckDhtServersQuery::receive(td::BufferSlice data) {
|
|||
}
|
||||
return td::Status::OK();
|
||||
}
|
||||
|
||||
td::Status SignCertificateQuery::run() {
|
||||
TRY_RESULT_ASSIGN(overlay_, tokenizer_.get_token<td::Bits256>());
|
||||
TRY_RESULT_ASSIGN(id_, tokenizer_.get_token<td::Bits256>());
|
||||
TRY_RESULT_ASSIGN(expire_at_, tokenizer_.get_token<td::int32>());
|
||||
TRY_RESULT_ASSIGN(max_size_, tokenizer_.get_token<td::uint32>());
|
||||
TRY_RESULT_ASSIGN(signer_, tokenizer_.get_token<ton::PublicKeyHash>());
|
||||
TRY_RESULT_ASSIGN(out_file_, tokenizer_.get_token<std::string>());
|
||||
return td::Status::OK();
|
||||
}
|
||||
|
||||
td::Status SignCertificateQuery::send() {
|
||||
auto cid = ton::create_serialize_tl_object<ton::ton_api::overlay_certificateId>(overlay_, id_, expire_at_, max_size_);
|
||||
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::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());
|
||||
}
|
||||
}));
|
||||
return td::Status::OK();
|
||||
}
|
||||
|
||||
void SignCertificateQuery::receive_pubkey(td::BufferSlice R) {
|
||||
auto f = ton::fetch_tl_object<ton::ton_api::PublicKey>(R.as_slice(), true);
|
||||
if (f.is_error()) {
|
||||
handle_error(f.move_as_error_prefix("Failed to get pubkey: "));
|
||||
return;
|
||||
}
|
||||
pubkey_ = f.move_as_ok();
|
||||
has_pubkey_ = true;
|
||||
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()){
|
||||
handle_error(f.move_as_error_prefix("Failed to get signature: "));
|
||||
return;
|
||||
}
|
||||
signature_ = std::move(f.move_as_ok()->signature_);
|
||||
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 w = td::write_file(out_file_, c.as_slice());
|
||||
if(w.is_error()) {
|
||||
handle_error(w.move_as_error_prefix("Failed to write certificate to file: "));
|
||||
return;
|
||||
}
|
||||
td::TerminalIO::out() << "saved certificate\n";
|
||||
stop();
|
||||
}
|
||||
|
||||
td::Status ImportCertificateQuery::run() {
|
||||
TRY_RESULT_ASSIGN(overlay_, tokenizer_.get_token<td::Bits256>());
|
||||
TRY_RESULT_ASSIGN(id_, tokenizer_.get_token<td::Bits256>());
|
||||
TRY_RESULT_ASSIGN(kh_, tokenizer_.get_token<ton::PublicKeyHash>());
|
||||
TRY_RESULT_ASSIGN(in_file_, tokenizer_.get_token<std::string>());
|
||||
return td::Status::OK();
|
||||
}
|
||||
|
||||
td::Status ImportCertificateQuery::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_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)
|
||||
);
|
||||
td::actor::send_closure(console_, &ValidatorEngineConsole::envelope_send_query, std::move(b), create_promise());
|
||||
return td::Status::OK();
|
||||
}
|
||||
td::Status GetOverlaysStatsQuery::run() {
|
||||
return td::Status::OK();
|
||||
}
|
||||
|
||||
td::Status GetOverlaysStatsQuery::send() {
|
||||
auto b = ton::create_serialize_tl_object<ton::ton_api::engine_validator_getOverlaysStats>();
|
||||
td::actor::send_closure(console_, &ValidatorEngineConsole::envelope_send_query, std::move(b), create_promise());
|
||||
return td::Status::OK();
|
||||
}
|
||||
|
||||
td::Status GetOverlaysStatsQuery::receive(td::BufferSlice data) {
|
||||
TRY_RESULT_PREFIX(f, ton::fetch_tl_object<ton::ton_api::engine_validator_overlaysStats>(data.as_slice(), true),
|
||||
"received incorrect answer: ");
|
||||
for (auto &s : f->overlays_) {
|
||||
td::StringBuilder sb;
|
||||
sb << "overlay_id=" << s->overlay_id_ << " adnl_id=" << s->adnl_id_ << "\n";
|
||||
sb << " nodes:";
|
||||
for (auto &n : s->nodes_) {
|
||||
sb << " " << n->id_ << "\n";
|
||||
}
|
||||
sb << " stats:\n";
|
||||
for (auto &t : s->stats_) {
|
||||
sb << " " << t->key_ << "\t" << t->value_ << "\n";
|
||||
}
|
||||
td::TerminalIO::output(sb.as_cslice());
|
||||
}
|
||||
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: ");
|
||||
td::TerminalIO::out() << "successfully sent certificate to overlay manager\n";
|
||||
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(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>());
|
||||
TRY_RESULT_ASSIGN(out_file_, tokenizer_.get_token<std::string>());
|
||||
|
||||
return td::Status::OK();
|
||||
}
|
||||
|
||||
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_);
|
||||
td::actor::send_closure(console_, &ValidatorEngineConsole::envelope_send_query, std::move(b), create_promise());
|
||||
return td::Status::OK();
|
||||
}
|
||||
|
||||
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()) {
|
||||
return w.move_as_error_prefix("Failed to write certificate to file: ");
|
||||
}
|
||||
td::TerminalIO::out() << "saved certificate\n";
|
||||
|
||||
return td::Status::OK();
|
||||
}
|
||||
|
||||
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(key_, tokenizer_.get_token<ton::PublicKeyHash>());
|
||||
TRY_RESULT_ASSIGN(in_file_, tokenizer_.get_token<std::string>());
|
||||
|
||||
return td::Status::OK();
|
||||
}
|
||||
|
||||
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));
|
||||
td::actor::send_closure(console_, &ValidatorEngineConsole::envelope_send_query, std::move(b), create_promise());
|
||||
return td::Status::OK();
|
||||
}
|
||||
|
||||
td::Status ImportShardOverlayCertificateQuery::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() << "successfully sent certificate to overlay manager\n";
|
||||
return td::Status::OK();
|
||||
}
|
||||
|
|
|
@ -903,3 +903,139 @@ class CheckDhtServersQuery : public Query {
|
|||
private:
|
||||
ton::PublicKeyHash id_;
|
||||
};
|
||||
|
||||
class GetOverlaysStatsQuery : public Query {
|
||||
public:
|
||||
GetOverlaysStatsQuery(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 "getoverlaysstats";
|
||||
}
|
||||
static std::string get_help() {
|
||||
return "getoverlaysstats\tgets stats for all overlays";
|
||||
}
|
||||
std::string name() const override {
|
||||
return get_name();
|
||||
}
|
||||
};
|
||||
|
||||
class SignCertificateQuery : public Query {
|
||||
public:
|
||||
SignCertificateQuery(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 "signcert";
|
||||
}
|
||||
static std::string get_help() {
|
||||
return "signcert <overlayid> <adnlid> <expireat> <maxsize> <signwith> <outfile>\tsign overlay certificate by <signwith> key";
|
||||
}
|
||||
std::string name() const override {
|
||||
return get_name();
|
||||
}
|
||||
void receive_pubkey(td::BufferSlice R);
|
||||
void receive_signature(td::BufferSlice R);
|
||||
|
||||
|
||||
private:
|
||||
void save_certificate();
|
||||
|
||||
td::Bits256 overlay_;
|
||||
td::Bits256 id_;
|
||||
td::int32 expire_at_;
|
||||
td::uint32 max_size_;
|
||||
std::string out_file_;
|
||||
ton::PublicKeyHash signer_;
|
||||
td::BufferSlice signature_;
|
||||
std::unique_ptr<ton::ton_api::PublicKey> pubkey_;
|
||||
bool has_signature_{0};
|
||||
bool has_pubkey_{0};
|
||||
};
|
||||
|
||||
class ImportCertificateQuery : public Query {
|
||||
public:
|
||||
ImportCertificateQuery(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 "importcert";
|
||||
}
|
||||
static std::string get_help() {
|
||||
return "importcert <overlayid> <adnlid> <key> <certfile>\timport overlay certificate for specific key";
|
||||
}
|
||||
std::string name() const override {
|
||||
return get_name();
|
||||
}
|
||||
|
||||
private:
|
||||
td::Bits256 overlay_;
|
||||
td::Bits256 id_;
|
||||
ton::PublicKeyHash kh_;
|
||||
std::string in_file_;
|
||||
};
|
||||
|
||||
class SignShardOverlayCertificateQuery : public Query {
|
||||
public:
|
||||
SignShardOverlayCertificateQuery(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 "signshardoverlaycert";
|
||||
}
|
||||
static std::string get_help() {
|
||||
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_;
|
||||
ton::PublicKeyHash key_;
|
||||
td::uint32 max_size_;
|
||||
std::string out_file_;
|
||||
};
|
||||
|
||||
|
||||
class ImportShardOverlayCertificateQuery : public Query {
|
||||
public:
|
||||
ImportShardOverlayCertificateQuery(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 "importshardoverlaycert";
|
||||
}
|
||||
static std::string get_help() {
|
||||
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_;
|
||||
std::string in_file_;
|
||||
};
|
||||
|
||||
|
|
|
@ -134,6 +134,11 @@ void ValidatorEngineConsole::run() {
|
|||
add_query_runner(std::make_unique<QueryRunnerImpl<CreateProposalVoteQuery>>());
|
||||
add_query_runner(std::make_unique<QueryRunnerImpl<CreateComplaintVoteQuery>>());
|
||||
add_query_runner(std::make_unique<QueryRunnerImpl<CheckDhtServersQuery>>());
|
||||
add_query_runner(std::make_unique<QueryRunnerImpl<SignCertificateQuery>>());
|
||||
add_query_runner(std::make_unique<QueryRunnerImpl<ImportCertificateQuery>>());
|
||||
add_query_runner(std::make_unique<QueryRunnerImpl<GetOverlaysStatsQuery>>());
|
||||
add_query_runner(std::make_unique<QueryRunnerImpl<ImportShardOverlayCertificateQuery>>());
|
||||
add_query_runner(std::make_unique<QueryRunnerImpl<SignShardOverlayCertificateQuery>>());
|
||||
}
|
||||
|
||||
bool ValidatorEngineConsole::envelope_send_query(td::BufferSlice query, td::Promise<td::BufferSlice> promise) {
|
||||
|
@ -258,7 +263,8 @@ int main(int argc, char* argv[]) {
|
|||
std::exit(2);
|
||||
});
|
||||
p.add_option('V', "version", "shows validator-engine-console build information", [&]() {
|
||||
std::cout << "validator-engine-console build information: [ Commit: " << GitMetadata::CommitSHA1() << ", Date: " << GitMetadata::CommitDate() << "]\n";
|
||||
std::cout << "validator-engine-console build information: [ Commit: " << GitMetadata::CommitSHA1()
|
||||
<< ", Date: " << GitMetadata::CommitDate() << "]\n";
|
||||
std::exit(0);
|
||||
});
|
||||
p.add_checked_option('a', "address", "server address", [&](td::Slice arg) {
|
||||
|
|
|
@ -27,6 +27,11 @@
|
|||
*/
|
||||
#include "validator-engine.hpp"
|
||||
|
||||
#include "auto/tl/ton_api.h"
|
||||
#include "overlay-manager.h"
|
||||
#include "td/actor/actor.h"
|
||||
#include "tl-utils/tl-utils.hpp"
|
||||
#include "tl/TlObject.h"
|
||||
#include "ton/ton-types.h"
|
||||
#include "ton/ton-tl.hpp"
|
||||
#include "ton/ton-io.hpp"
|
||||
|
@ -3143,6 +3148,135 @@ void ValidatorEngine::run_control_query(ton::ton_api::engine_validator_createCom
|
|||
.release();
|
||||
}
|
||||
|
||||
void ValidatorEngine::run_control_query(ton::ton_api::engine_validator_importCertificate &query, td::BufferSlice data,
|
||||
ton::PublicKeyHash src, td::uint32 perm, td::Promise<td::BufferSlice> promise) {
|
||||
if (!(perm & ValidatorEnginePermissions::vep_modify)) {
|
||||
promise.set_value(create_control_query_error(td::Status::Error(ton::ErrorCode::error, "not authorized")));
|
||||
return;
|
||||
}
|
||||
if (keyring_.empty()) {
|
||||
promise.set_value(create_control_query_error(td::Status::Error(ton::ErrorCode::notready, "keyring not started")));
|
||||
return;
|
||||
}
|
||||
|
||||
if (!started_) {
|
||||
promise.set_value(create_control_query_error(td::Status::Error(ton::ErrorCode::notready, "not started")));
|
||||
return;
|
||||
}
|
||||
auto r = ton::overlay::Certificate::create(std::move(query.cert_));
|
||||
if(r.is_error()) {
|
||||
promise.set_value(create_control_query_error(r.move_as_error_prefix("Invalid certificate: ")));
|
||||
}
|
||||
//TODO force Overlays::update_certificate to return result
|
||||
/*auto P = td::PromiseCreator::lambda(
|
||||
[promise = std::move(promise)](td::Result<td::Unit> R) mutable {
|
||||
if (R.is_error()) {
|
||||
promise.set_value(create_control_query_error(R.move_as_error()));
|
||||
} else {
|
||||
promise.set_value(
|
||||
ton::serialize_tl_object(ton::create_tl_object<ton::ton_api::engine_validator_success>(), true));
|
||||
}
|
||||
});
|
||||
*/
|
||||
td::actor::send_closure(overlay_manager_, &ton::overlay::Overlays::update_certificate,
|
||||
ton::adnl::AdnlNodeIdShort{query.local_id_->id_},
|
||||
ton::overlay::OverlayIdShort{query.overlay_id_},
|
||||
ton::PublicKeyHash{query.signed_key_->key_hash_},
|
||||
r.move_as_ok());
|
||||
promise.set_value(
|
||||
ton::serialize_tl_object(ton::create_tl_object<ton::ton_api::engine_validator_success>(), true)
|
||||
);
|
||||
}
|
||||
|
||||
void ValidatorEngine::run_control_query(ton::ton_api::engine_validator_importShardOverlayCertificate &query, td::BufferSlice data,
|
||||
ton::PublicKeyHash src, td::uint32 perm, td::Promise<td::BufferSlice> promise) {
|
||||
if (!(perm & ValidatorEnginePermissions::vep_modify)) {
|
||||
promise.set_value(create_control_query_error(td::Status::Error(ton::ErrorCode::error, "not authorized")));
|
||||
return;
|
||||
}
|
||||
if (keyring_.empty()) {
|
||||
promise.set_value(create_control_query_error(td::Status::Error(ton::ErrorCode::notready, "keyring not started")));
|
||||
return;
|
||||
}
|
||||
|
||||
if (!started_) {
|
||||
promise.set_value(create_control_query_error(td::Status::Error(ton::ErrorCode::notready, "not started")));
|
||||
return;
|
||||
}
|
||||
auto r = ton::overlay::Certificate::create(std::move(query.cert_));
|
||||
if(r.is_error()) {
|
||||
promise.set_value(create_control_query_error(r.move_as_error_prefix("Invalid certificate: ")));
|
||||
}
|
||||
auto P = td::PromiseCreator::lambda([promise = std::move(promise)](td::Result<td::Unit> R) mutable {
|
||||
if (R.is_error()) {
|
||||
promise.set_value(create_control_query_error(R.move_as_error_prefix("failed to import cert: ")));
|
||||
} else {
|
||||
promise.set_value(
|
||||
ton::serialize_tl_object(ton::create_tl_object<ton::ton_api::engine_validator_success>(), true));
|
||||
}
|
||||
});
|
||||
ton::ShardIdFull shard_id{ton::WorkchainId{query.workchain_}, static_cast<ton::ShardId>(query.shard_)};
|
||||
td::actor::send_closure(full_node_, &ton::validator::fullnode::FullNode::import_shard_overlay_certificate,
|
||||
shard_id, ton::PublicKeyHash{query.signed_key_->key_hash_}, r.move_as_ok(), std::move(P));
|
||||
}
|
||||
|
||||
void ValidatorEngine::run_control_query(ton::ton_api::engine_validator_signShardOverlayCertificate &query, td::BufferSlice data,
|
||||
ton::PublicKeyHash src, td::uint32 perm, td::Promise<td::BufferSlice> promise) {
|
||||
if (!(perm & ValidatorEnginePermissions::vep_modify)) {
|
||||
promise.set_value(create_control_query_error(td::Status::Error(ton::ErrorCode::error, "not authorized")));
|
||||
return;
|
||||
}
|
||||
if (keyring_.empty()) {
|
||||
promise.set_value(create_control_query_error(td::Status::Error(ton::ErrorCode::notready, "keyring not started")));
|
||||
return;
|
||||
}
|
||||
|
||||
if (!started_) {
|
||||
promise.set_value(create_control_query_error(td::Status::Error(ton::ErrorCode::notready, "not started")));
|
||||
return;
|
||||
}
|
||||
ton::ShardIdFull shard_id{ton::WorkchainId{query.workchain_}, static_cast<ton::ShardId>(query.shard_)};
|
||||
auto P = td::PromiseCreator::lambda([promise = std::move(promise)](td::Result<td::BufferSlice> R) mutable {
|
||||
if (R.is_error()) {
|
||||
promise.set_value(create_control_query_error(R.move_as_error_prefix("failed to import cert: ")));
|
||||
} else {
|
||||
promise.set_value(R.move_as_ok());
|
||||
}
|
||||
});
|
||||
td::actor::send_closure(full_node_, &ton::validator::fullnode::FullNode::sign_shard_overlay_certificate,
|
||||
shard_id, ton::PublicKeyHash{query.signed_key_->key_hash_}, query.expire_at_, query.max_size_, std::move(P));
|
||||
}
|
||||
|
||||
|
||||
void ValidatorEngine::run_control_query(ton::ton_api::engine_validator_getOverlaysStats &query, td::BufferSlice data,
|
||||
ton::PublicKeyHash src, td::uint32 perm, td::Promise<td::BufferSlice> promise) {
|
||||
if (!(perm & ValidatorEnginePermissions::vep_default)) {
|
||||
promise.set_value(create_control_query_error(td::Status::Error(ton::ErrorCode::error, "not authorized")));
|
||||
return;
|
||||
}
|
||||
|
||||
if (keyring_.empty()) {
|
||||
promise.set_value(create_control_query_error(td::Status::Error(ton::ErrorCode::notready, "keyring not started")));
|
||||
return;
|
||||
}
|
||||
|
||||
if (!started_) {
|
||||
promise.set_value(create_control_query_error(td::Status::Error(ton::ErrorCode::notready, "not started")));
|
||||
return;
|
||||
}
|
||||
|
||||
td::actor::send_closure(overlay_manager_, &ton::overlay::Overlays::get_stats,
|
||||
[promise = std::move(promise)](
|
||||
td::Result<ton::tl_object_ptr<ton::ton_api::engine_validator_overlaysStats>> R) mutable {
|
||||
if (R.is_ok()) {
|
||||
promise.set_value(ton::serialize_tl_object(R.move_as_ok(), true));
|
||||
} else {
|
||||
promise.set_value(create_control_query_error(
|
||||
td::Status::Error(ton::ErrorCode::notready, "overlay manager not ready")));
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
void ValidatorEngine::process_control_query(td::uint16 port, ton::adnl::AdnlNodeIdShort src,
|
||||
ton::adnl::AdnlNodeIdShort dst, td::BufferSlice data,
|
||||
td::Promise<td::BufferSlice> promise) {
|
||||
|
@ -3294,7 +3428,8 @@ int main(int argc, char *argv[]) {
|
|||
SET_VERBOSITY_LEVEL(v);
|
||||
});
|
||||
p.add_option('V', "version", "shows validator-engine build information", [&]() {
|
||||
std::cout << "validator-engine build information: [ Commit: " << GitMetadata::CommitSHA1() << ", Date: " << GitMetadata::CommitDate() << "]\n";
|
||||
std::cout << "validator-engine build information: [ Commit: " << GitMetadata::CommitSHA1()
|
||||
<< ", Date: " << GitMetadata::CommitDate() << "]\n";
|
||||
std::exit(0);
|
||||
});
|
||||
p.add_option('h', "help", "prints_help", [&]() {
|
||||
|
@ -3374,18 +3509,20 @@ int main(int argc, char *argv[]) {
|
|||
acts.push_back([&x, seq]() { td::actor::send_closure(x, &ValidatorEngine::add_unsafe_catchain, seq); });
|
||||
return td::Status::OK();
|
||||
});
|
||||
p.add_checked_option(
|
||||
'F', "unsafe-catchain-rotate", "use forceful and DANGEROUS catchain rotation", [&](td::Slice params) {
|
||||
auto pos1 = params.find(':');
|
||||
TRY_RESULT(b_seq, td::to_integer_safe<ton::BlockSeqno>(params.substr(0, pos1)));
|
||||
params = params.substr(++pos1, params.size());
|
||||
auto pos2 = params.find(':');
|
||||
TRY_RESULT(cc_seq, td::to_integer_safe<ton::CatchainSeqno>(params.substr(0, pos2)));
|
||||
params = params.substr(++pos2, params.size());
|
||||
auto h = std::stoi(params.substr(0, params.size()).str());
|
||||
acts.push_back([&x, b_seq, cc_seq, h]() { td::actor::send_closure(x, &ValidatorEngine::add_unsafe_catchain_rotation, b_seq, cc_seq, h); });
|
||||
return td::Status::OK();
|
||||
});
|
||||
p.add_checked_option('F', "unsafe-catchain-rotate", "use forceful and DANGEROUS catchain rotation",
|
||||
[&](td::Slice params) {
|
||||
auto pos1 = params.find(':');
|
||||
TRY_RESULT(b_seq, td::to_integer_safe<ton::BlockSeqno>(params.substr(0, pos1)));
|
||||
params = params.substr(++pos1, params.size());
|
||||
auto pos2 = params.find(':');
|
||||
TRY_RESULT(cc_seq, td::to_integer_safe<ton::CatchainSeqno>(params.substr(0, pos2)));
|
||||
params = params.substr(++pos2, params.size());
|
||||
auto h = std::stoi(params.substr(0, params.size()).str());
|
||||
acts.push_back([&x, b_seq, cc_seq, h]() {
|
||||
td::actor::send_closure(x, &ValidatorEngine::add_unsafe_catchain_rotation, b_seq, cc_seq, h);
|
||||
});
|
||||
return td::Status::OK();
|
||||
});
|
||||
td::uint32 threads = 7;
|
||||
p.add_checked_option(
|
||||
't', "threads", PSTRING() << "number of threads (default=" << threads << ")", [&](td::Slice fname) {
|
||||
|
|
|
@ -28,6 +28,7 @@
|
|||
#pragma once
|
||||
|
||||
#include "adnl/adnl.h"
|
||||
#include "auto/tl/ton_api.h"
|
||||
#include "rldp/rldp.h"
|
||||
#include "dht/dht.h"
|
||||
#include "validator/manager.h"
|
||||
|
@ -395,6 +396,14 @@ class ValidatorEngine : public td::actor::Actor {
|
|||
ton::PublicKeyHash src, td::uint32 perm, td::Promise<td::BufferSlice> promise);
|
||||
void run_control_query(ton::ton_api::engine_validator_createComplaintVote &query, td::BufferSlice data,
|
||||
ton::PublicKeyHash src, td::uint32 perm, td::Promise<td::BufferSlice> promise);
|
||||
void run_control_query(ton::ton_api::engine_validator_importCertificate &query, td::BufferSlice data,
|
||||
ton::PublicKeyHash src, td::uint32 perm, td::Promise<td::BufferSlice> promise);
|
||||
void run_control_query(ton::ton_api::engine_validator_signShardOverlayCertificate &query, td::BufferSlice data,
|
||||
ton::PublicKeyHash src, td::uint32 perm, td::Promise<td::BufferSlice> promise);
|
||||
void run_control_query(ton::ton_api::engine_validator_importShardOverlayCertificate &query, td::BufferSlice data,
|
||||
ton::PublicKeyHash src, td::uint32 perm, td::Promise<td::BufferSlice> promise);
|
||||
void run_control_query(ton::ton_api::engine_validator_getOverlaysStats &query, td::BufferSlice data,
|
||||
ton::PublicKeyHash src, td::uint32 perm, td::Promise<td::BufferSlice> promise);
|
||||
template <class T>
|
||||
void run_control_query(T &query, td::BufferSlice data, ton::PublicKeyHash src, td::uint32 perm,
|
||||
td::Promise<td::BufferSlice> promise) {
|
||||
|
|
|
@ -115,6 +115,7 @@ void FullNodeShardImpl::check_broadcast(PublicKeyHash src, td::BufferSlice broad
|
|||
void FullNodeShardImpl::update_adnl_id(adnl::AdnlNodeIdShort adnl_id, td::Promise<td::Unit> promise) {
|
||||
td::actor::send_closure(overlays_, &ton::overlay::Overlays::delete_overlay, adnl_id_, overlay_id_);
|
||||
adnl_id_ = adnl_id;
|
||||
local_id_ = adnl_id_.pubkey_hash();
|
||||
create_overlay();
|
||||
}
|
||||
|
||||
|
@ -848,6 +849,38 @@ void FullNodeShardImpl::signed_new_certificate(ton::overlay::Certificate cert) {
|
|||
td::actor::send_closure(overlays_, &overlay::Overlays::update_certificate, adnl_id_, overlay_id_, local_id_, cert_);
|
||||
}
|
||||
|
||||
void FullNodeShardImpl::sign_overlay_certificate(PublicKeyHash signed_key, td::uint32 expire_at, td::uint32 max_size, td::Promise<td::BufferSlice> promise) {
|
||||
auto sign_by = sign_cert_by_;
|
||||
if (sign_by.is_zero()) {
|
||||
promise.set_error(td::Status::Error("Node has no key with signing authority"));
|
||||
return;
|
||||
}
|
||||
|
||||
ton::overlay::Certificate cert{
|
||||
sign_by, static_cast<td::int32>(expire_at), max_size,
|
||||
overlay::CertificateFlags::Trusted | overlay::CertificateFlags::AllowFec, td::BufferSlice{}};
|
||||
auto to_sign = cert.to_sign(overlay_id_, signed_key);
|
||||
|
||||
auto P = td::PromiseCreator::lambda(
|
||||
[SelfId = actor_id(this), expire_at = expire_at, max_size = max_size, promise = std::move(promise)](td::Result<std::pair<td::BufferSlice, PublicKey>> R) mutable {
|
||||
if (R.is_error()) {
|
||||
promise.set_error(R.move_as_error_prefix("failed to create certificate: failed to sign: "));
|
||||
} else {
|
||||
auto p = R.move_as_ok();
|
||||
auto c = ton::create_serialize_tl_object<ton::ton_api::overlay_certificate>(p.second.tl(), static_cast<td::int32>(expire_at), max_size, std::move(p.first));
|
||||
promise.set_value(std::move(c));
|
||||
}
|
||||
});
|
||||
td::actor::send_closure(keyring_, &ton::keyring::Keyring::sign_add_get_public_key, sign_by, std::move(to_sign),
|
||||
std::move(P));
|
||||
}
|
||||
|
||||
void FullNodeShardImpl::import_overlay_certificate(PublicKeyHash signed_key, std::shared_ptr<ton::overlay::Certificate> cert, td::Promise<td::Unit> promise) {
|
||||
td::actor::send_closure(overlays_, &ton::overlay::Overlays::update_certificate,
|
||||
adnl_id_, overlay_id_, signed_key, cert);
|
||||
promise.set_value( td::Unit() );
|
||||
}
|
||||
|
||||
void FullNodeShardImpl::update_validators(std::vector<PublicKeyHash> public_key_hashes, PublicKeyHash local_hash) {
|
||||
if (!client_.empty()) {
|
||||
return;
|
||||
|
|
|
@ -42,6 +42,10 @@ class FullNodeShard : public td::actor::Actor {
|
|||
virtual void send_shard_block_info(BlockIdExt block_id, CatchainSeqno cc_seqno, td::BufferSlice data) = 0;
|
||||
virtual void send_broadcast(BlockBroadcast broadcast) = 0;
|
||||
|
||||
virtual void sign_overlay_certificate(PublicKeyHash signed_key, td::uint32 expiry_at, td::uint32 max_size, td::Promise<td::BufferSlice> promise) = 0;
|
||||
virtual void import_overlay_certificate(PublicKeyHash signed_key, std::shared_ptr<ton::overlay::Certificate> cert, td::Promise<td::Unit> promise) = 0;
|
||||
|
||||
|
||||
virtual void download_block(BlockIdExt id, td::uint32 priority, td::Timestamp timeout,
|
||||
td::Promise<ReceivedBlock> promise) = 0;
|
||||
virtual void download_zero_state(BlockIdExt id, td::uint32 priority, td::Timestamp timeout,
|
||||
|
|
|
@ -170,6 +170,10 @@ class FullNodeShardImpl : public FullNodeShard {
|
|||
void alarm() override;
|
||||
|
||||
void update_validators(std::vector<PublicKeyHash> public_key_hashes, PublicKeyHash local_hash) override;
|
||||
|
||||
void sign_overlay_certificate(PublicKeyHash signed_key, td::uint32 expiry_at, td::uint32 max_size, td::Promise<td::BufferSlice> promise) override;
|
||||
void import_overlay_certificate(PublicKeyHash signed_key, std::shared_ptr<ton::overlay::Certificate> cert, td::Promise<td::Unit> promise) override;
|
||||
|
||||
void sign_new_certificate(PublicKeyHash sign_by);
|
||||
void signed_new_certificate(ton::overlay::Certificate cert);
|
||||
|
||||
|
|
|
@ -76,6 +76,27 @@ void FullNodeImpl::del_permanent_key(PublicKeyHash key, td::Promise<td::Unit> pr
|
|||
promise.set_value(td::Unit());
|
||||
}
|
||||
|
||||
void FullNodeImpl::sign_shard_overlay_certificate(ShardIdFull shard_id, PublicKeyHash signed_key,
|
||||
td::uint32 expiry_at, td::uint32 max_size,
|
||||
td::Promise<td::BufferSlice> promise) {
|
||||
auto it = shards_.find(shard_id);
|
||||
if(it == shards_.end()) {
|
||||
promise.set_error(td::Status::Error(ErrorCode::error, "shard not found"));
|
||||
return;
|
||||
}
|
||||
td::actor::send_closure(it->second, &FullNodeShard::sign_overlay_certificate, signed_key, expiry_at, max_size, std::move(promise));
|
||||
}
|
||||
|
||||
void FullNodeImpl::import_shard_overlay_certificate(ShardIdFull shard_id, PublicKeyHash signed_key,
|
||||
std::shared_ptr<ton::overlay::Certificate> cert,
|
||||
td::Promise<td::Unit> promise) {
|
||||
auto it = shards_.find(shard_id);
|
||||
if(it == shards_.end()) {
|
||||
promise.set_error(td::Status::Error(ErrorCode::error, "shard not found"));
|
||||
}
|
||||
td::actor::send_closure(it->second, &FullNodeShard::import_overlay_certificate, signed_key, cert, std::move(promise));
|
||||
}
|
||||
|
||||
void FullNodeImpl::update_adnl_id(adnl::AdnlNodeIdShort adnl_id, td::Promise<td::Unit> promise) {
|
||||
adnl_id_ = adnl_id;
|
||||
|
||||
|
@ -86,6 +107,7 @@ void FullNodeImpl::update_adnl_id(adnl::AdnlNodeIdShort adnl_id, td::Promise<td:
|
|||
for (auto &s : shards_) {
|
||||
td::actor::send_closure(s.second, &FullNodeShard::update_adnl_id, adnl_id, ig.get_promise());
|
||||
}
|
||||
local_id_ = adnl_id_.pubkey_hash();
|
||||
}
|
||||
|
||||
void FullNodeImpl::initial_read_complete(BlockHandle top_handle) {
|
||||
|
@ -345,10 +367,14 @@ void FullNodeImpl::new_key_block(BlockHandle handle) {
|
|||
|
||||
void FullNodeImpl::start_up() {
|
||||
if (local_id_.is_zero()) {
|
||||
auto pk = ton::PrivateKey{ton::privkeys::Ed25519::random()};
|
||||
local_id_ = pk.compute_short_id();
|
||||
if(adnl_id_.is_zero()) {
|
||||
auto pk = ton::PrivateKey{ton::privkeys::Ed25519::random()};
|
||||
local_id_ = pk.compute_short_id();
|
||||
|
||||
td::actor::send_closure(keyring_, &ton::keyring::Keyring::add_key, std::move(pk), true, [](td::Unit) {});
|
||||
td::actor::send_closure(keyring_, &ton::keyring::Keyring::add_key, std::move(pk), true, [](td::Unit) {});
|
||||
} else {
|
||||
local_id_ = adnl_id_.pubkey_hash();
|
||||
}
|
||||
}
|
||||
class Callback : public ValidatorManagerInterface::Callback {
|
||||
public:
|
||||
|
|
|
@ -53,6 +53,13 @@ class FullNode : public td::actor::Actor {
|
|||
virtual void add_permanent_key(PublicKeyHash key, td::Promise<td::Unit> promise) = 0;
|
||||
virtual void del_permanent_key(PublicKeyHash key, td::Promise<td::Unit> promise) = 0;
|
||||
|
||||
virtual void sign_shard_overlay_certificate(ShardIdFull shard_id, PublicKeyHash signed_key,
|
||||
td::uint32 expiry_at, td::uint32 max_size,
|
||||
td::Promise<td::BufferSlice> promise) = 0;
|
||||
virtual void import_shard_overlay_certificate(ShardIdFull shard_id, PublicKeyHash signed_key,
|
||||
std::shared_ptr<ton::overlay::Certificate> cert,
|
||||
td::Promise<td::Unit> promise) = 0;
|
||||
|
||||
virtual void update_adnl_id(adnl::AdnlNodeIdShort adnl_id, td::Promise<td::Unit> promise) = 0;
|
||||
|
||||
static constexpr td::uint32 max_block_size() {
|
||||
|
|
|
@ -42,6 +42,14 @@ class FullNodeImpl : public FullNode {
|
|||
void add_permanent_key(PublicKeyHash key, td::Promise<td::Unit> promise) override;
|
||||
void del_permanent_key(PublicKeyHash key, td::Promise<td::Unit> promise) override;
|
||||
|
||||
void sign_shard_overlay_certificate(ShardIdFull shard_id, PublicKeyHash signed_key,
|
||||
td::uint32 expiry_at, td::uint32 max_size,
|
||||
td::Promise<td::BufferSlice> promise) override;
|
||||
void import_shard_overlay_certificate(ShardIdFull shard_id, PublicKeyHash signed_key,
|
||||
std::shared_ptr<ton::overlay::Certificate> cert,
|
||||
td::Promise<td::Unit> promise) override;
|
||||
|
||||
|
||||
void update_adnl_id(adnl::AdnlNodeIdShort adnl_id, td::Promise<td::Unit> promise) override;
|
||||
|
||||
void add_shard(ShardIdFull shard);
|
||||
|
|
Loading…
Reference in a new issue