Skip to content

Commit 3a30d6f

Browse files
authoredMar 30, 2023
Minor DHT improvements (ton-blockchain#657)
* Remove repeating DHT queries in adnl-peer * Fix checking dht node signature for non-default network id * Custom dht network id in generate-random-id
1 parent 5e0dadf commit 3a30d6f

File tree

3 files changed

+24
-20
lines changed

3 files changed

+24
-20
lines changed
 

‎adnl/adnl-peer.cpp

-1
Original file line numberDiff line numberDiff line change
@@ -944,7 +944,6 @@ void AdnlPeerPairImpl::got_data_from_dht(td::Result<AdnlNode> R) {
944944
CHECK(dht_query_active_);
945945
dht_query_active_ = false;
946946
next_dht_query_at_ = td::Timestamp::in(td::Random::fast(60.0, 120.0));
947-
alarm_timestamp().relax(next_dht_query_at_);
948947
if (R.is_error()) {
949948
VLOG(ADNL_INFO) << this << ": dht query failed: " << R.move_as_error();
950949
return;

‎dht/dht-remote-node.cpp

+1-7
Original file line numberDiff line numberDiff line change
@@ -140,13 +140,7 @@ adnl::AdnlNodeIdFull DhtRemoteNode::get_full_id() const {
140140

141141
td::Result<std::unique_ptr<DhtRemoteNode>> DhtRemoteNode::create(DhtNode node, td::uint32 max_missed_pings,
142142
td::int32 our_network_id) {
143-
TRY_RESULT(enc, node.adnl_id().pubkey().create_encryptor());
144-
auto tl = node.tl();
145-
auto sig = std::move(tl->signature_);
146-
147-
TRY_STATUS_PREFIX(enc->check_signature(serialize_tl_object(tl, true).as_slice(), sig.as_slice()),
148-
"bad node signature: ");
149-
143+
TRY_STATUS(node.check_signature());
150144
return std::make_unique<DhtRemoteNode>(std::move(node), max_missed_pings, our_network_id);
151145
}
152146

‎utils/generate-random-id.cpp

+23-12
Original file line numberDiff line numberDiff line change
@@ -28,22 +28,20 @@
2828
#include <iostream>
2929
#include <iomanip>
3030
#include <string>
31-
#include <cstring>
32-
#include <cassert>
33-
#include "crypto/ellcurve/Ed25519.h"
3431
#include "adnl/utils.hpp"
3532
#include "auto/tl/ton_api.h"
3633
#include "auto/tl/ton_api_json.h"
3734
#include "tl/tl_json.h"
3835
#include "td/utils/OptionParser.h"
3936
#include "td/utils/filesystem.h"
4037
#include "keys/encryptor.h"
41-
#include "keys/keys.hpp"
4238
#include "git.h"
39+
#include "dht/dht-node.hpp"
4340

4441
int main(int argc, char *argv[]) {
4542
ton::PrivateKey pk;
46-
ton::tl_object_ptr<ton::ton_api::adnl_addressList> addr_list;
43+
td::optional<ton::adnl::AdnlAddressList> addr_list;
44+
td::optional<td::int32> network_id_opt;
4745

4846
td::OptionParser p;
4947
p.set_description("generate random id");
@@ -78,11 +76,19 @@ int main(int argc, char *argv[]) {
7876
if (addr_list) {
7977
return td::Status::Error("duplicate '-a' option");
8078
}
81-
CHECK(!addr_list);
8279

8380
td::BufferSlice bs(key);
8481
TRY_RESULT_PREFIX(as_json_value, td::json_decode(bs.as_slice()), "bad addr list JSON: ");
85-
TRY_STATUS_PREFIX(td::from_json(addr_list, std::move(as_json_value)), "bad addr list TL: ");
82+
ton::tl_object_ptr<ton::ton_api::adnl_addressList> addr_list_tl;
83+
TRY_STATUS_PREFIX(td::from_json(addr_list_tl, std::move(as_json_value)), "bad addr list TL: ");
84+
TRY_RESULT_PREFIX_ASSIGN(addr_list, ton::adnl::AdnlAddressList::create(addr_list_tl), "bad addr list: ");
85+
return td::Status::OK();
86+
});
87+
p.add_checked_option('i', "network-id", "dht network id (default: -1)", [&](td::Slice key) {
88+
if (network_id_opt) {
89+
return td::Status::Error("duplicate '-i' option");
90+
}
91+
TRY_RESULT_PREFIX_ASSIGN(network_id_opt, td::to_integer_safe<td::int32>(key), "bad network id: ");
8692
return td::Status::OK();
8793
});
8894

@@ -118,7 +124,7 @@ int main(int argc, char *argv[]) {
118124
std::cerr << "'-a' option missing" << std::endl;
119125
return 2;
120126
}
121-
auto x = ton::create_tl_object<ton::ton_api::adnl_node>(pub_key.tl(), std::move(addr_list));
127+
auto x = ton::create_tl_object<ton::ton_api::adnl_node>(pub_key.tl(), addr_list.value().tl());
122128
auto e = pk.create_decryptor().move_as_ok();
123129
auto r = e->sign(ton::serialize_tl_object(x, true).as_slice()).move_as_ok();
124130

@@ -129,12 +135,17 @@ int main(int argc, char *argv[]) {
129135
std::cerr << "'-a' option missing" << std::endl;
130136
return 2;
131137
}
132-
auto x = ton::create_tl_object<ton::ton_api::dht_node>(pub_key.tl(), std::move(addr_list), -1, td::BufferSlice());
138+
td::int32 network_id = network_id_opt ? network_id_opt.value() : -1;
139+
td::BufferSlice to_sign = ton::serialize_tl_object(
140+
ton::dht::DhtNode{ton::adnl::AdnlNodeIdFull{pub_key}, addr_list.value(), -1, network_id, td::BufferSlice{}}
141+
.tl(),
142+
true);
133143
auto e = pk.create_decryptor().move_as_ok();
134-
auto r = e->sign(ton::serialize_tl_object(x, true).as_slice()).move_as_ok();
135-
x->signature_ = std::move(r);
144+
auto signature = e->sign(to_sign.as_slice()).move_as_ok();
145+
auto node =
146+
ton::dht::DhtNode{ton::adnl::AdnlNodeIdFull{pub_key}, addr_list.value(), -1, network_id, std::move(signature)};
136147

137-
auto v = td::json_encode<std::string>(td::ToJson(x));
148+
auto v = td::json_encode<std::string>(td::ToJson(node.tl()));
138149
std::cout << v << "\n";
139150
} else if (mode == "keys") {
140151
td::write_file(name, pk.export_as_slice()).ensure();

0 commit comments

Comments
 (0)
Please sign in to comment.