mirror of
https://github.com/ton-blockchain/ton
synced 2025-03-09 15:40:10 +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
|
@ -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…
Add table
Add a link
Reference in a new issue