Skip to content

Commit 7347ec0

Browse files
Add TON Storage to Proxy via storage gateway (ton-blockchain#577)
* Access ton storage from proxy, resolve "dns_storage_address" in tonlib * Set storage gateway address in proxy args Co-authored-by: SpyCheese <[email protected]>
1 parent ad736c6 commit 7347ec0

File tree

11 files changed

+169
-71
lines changed

11 files changed

+169
-71
lines changed

crypto/block/block.tlb

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -878,6 +878,8 @@ cap_method_pubkey#71f4 = SmcCapability;
878878
cap_is_wallet#2177 = SmcCapability;
879879
cap_name#ff name:Text = SmcCapability;
880880

881+
dns_storage_address#7473 bag_id:bits256 = DNSRecord;
882+
881883
//
882884
// PAYMENT CHANNELS
883885
//

crypto/smc-envelope/ManualDns.cpp

Lines changed: 24 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,8 @@ td::StringBuilder& operator<<(td::StringBuilder& sb, const ManualDns::EntryData&
4747
.move_as_ok();
4848
case ManualDns::EntryData::Type::SmcAddress:
4949
return sb << "SMC:" << data.data.get<ManualDns::EntryDataSmcAddress>().smc_address.rserialize();
50+
case ManualDns::EntryData::Type::StorageAddress:
51+
return sb << "STORAGE:" << data.data.get<ManualDns::EntryDataStorageAddress>().bag_id.to_hex();
5052
}
5153
return sb << "<unknown>";
5254
}
@@ -93,6 +95,11 @@ td::Result<td::Ref<vm::Cell>> DnsInterface::EntryData::as_cell() const {
9395
smc_address.smc_address.addr);
9496
dns.smc_addr = vm::load_cell_slice_ref(cb.finalize());
9597
tlb::pack_cell(res, dns);
98+
},
99+
[&](const EntryDataStorageAddress& storage_address) {
100+
block::gen::DNSRecord::Record_dns_storage_address dns;
101+
dns.bag_id = storage_address.bag_id;
102+
tlb::pack_cell(res, dns);
96103
}));
97104
if (error.is_error()) {
98105
return error;
@@ -142,6 +149,11 @@ td::Result<DnsInterface::EntryData> DnsInterface::EntryData::from_cellslice(vm::
142149
}
143150
return EntryData::smc_address(block::StdAddress(wc, addr));
144151
}
152+
case block::gen::DNSRecord::dns_storage_address: {
153+
block::gen::DNSRecord::Record_dns_storage_address dns;
154+
tlb::unpack(cs, dns);
155+
return EntryData::storage_address(dns.bag_id);
156+
}
145157
}
146158
return td::Status::Error("Unknown entry data");
147159
}
@@ -536,10 +548,12 @@ std::string DnsInterface::decode_name(td::Slice name) {
536548

537549
std::string ManualDns::serialize_data(const EntryData& data) {
538550
std::string res;
539-
data.data.visit(td::overloaded([&](const ton::ManualDns::EntryDataText& text) { res = "UNSUPPORTED"; },
540-
[&](const ton::ManualDns::EntryDataNextResolver& resolver) { res = "UNSUPPORTED"; },
541-
[&](const ton::ManualDns::EntryDataAdnlAddress& adnl_address) { res = "UNSUPPORTED"; },
542-
[&](const ton::ManualDns::EntryDataSmcAddress& text) { res = "UNSUPPORTED"; }));
551+
data.data.visit(
552+
td::overloaded([&](const ton::ManualDns::EntryDataText& text) { res = "UNSUPPORTED"; },
553+
[&](const ton::ManualDns::EntryDataNextResolver& resolver) { res = "UNSUPPORTED"; },
554+
[&](const ton::ManualDns::EntryDataAdnlAddress& adnl_address) { res = "UNSUPPORTED"; },
555+
[&](const ton::ManualDns::EntryDataSmcAddress& text) { res = "UNSUPPORTED"; },
556+
[&](const ton::ManualDns::EntryDataStorageAddress& storage_address) { res = "UNSUPPORTED"; }));
543557
return res;
544558
}
545559

@@ -559,6 +573,12 @@ td::Result<td::optional<ManualDns::EntryData>> ManualDns::parse_data(td::Slice c
559573
} else if (type == "NEXT") {
560574
TRY_RESULT(address, block::StdAddress::parse(parser.read_all()));
561575
return ManualDns::EntryData::next_resolver(address);
576+
} else if (type == "STORAGE") {
577+
td::Bits256 bag_id;
578+
if (bag_id.from_hex(parser.read_all(), false) != 256) {
579+
return td::Status::Error("failed to parse bag id");
580+
}
581+
return ManualDns::EntryData::storage_address(bag_id);
562582
} else if (parser.data() == "DELETED") {
563583
return {};
564584
}

crypto/smc-envelope/ManualDns.h

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -66,9 +66,19 @@ class DnsInterface {
6666
// TODO: capability
6767
};
6868

69+
struct EntryDataStorageAddress {
70+
ton::Bits256 bag_id;
71+
// TODO: proto
72+
bool operator==(const EntryDataStorageAddress& other) const {
73+
return bag_id == other.bag_id;
74+
}
75+
};
76+
6977
struct EntryData {
70-
enum Type { Empty, Text, NextResolver, AdnlAddress, SmcAddress } type{Empty};
71-
td::Variant<EntryDataText, EntryDataNextResolver, EntryDataAdnlAddress, EntryDataSmcAddress> data;
78+
enum Type { Empty, Text, NextResolver, AdnlAddress, SmcAddress, StorageAddress } type{Empty};
79+
td::Variant<EntryDataText, EntryDataNextResolver, EntryDataAdnlAddress, EntryDataSmcAddress,
80+
EntryDataStorageAddress>
81+
data;
7282

7383
static EntryData text(std::string text) {
7484
return {Text, EntryDataText{text}};
@@ -82,6 +92,9 @@ class DnsInterface {
8292
static EntryData smc_address(block::StdAddress smc_address) {
8393
return {SmcAddress, EntryDataSmcAddress{smc_address}};
8494
}
95+
static EntryData storage_address(ton::Bits256 bag_id) {
96+
return {StorageAddress, EntryDataStorageAddress{bag_id}};
97+
}
8598

8699
bool operator==(const EntryData& other) const {
87100
return data == other.data;

lite-client/lite-client.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1749,6 +1749,13 @@ bool TestNode::show_dns_record(std::ostream& os, td::Bits256 cat, Ref<vm::CellSl
17491749
}
17501750
break;
17511751
}
1752+
case block::gen::DNSRecord::dns_storage_address: {
1753+
block::gen::DNSRecord::Record_dns_storage_address rec;
1754+
if (tlb::unpack_exact(cs, rec)) {
1755+
os << "\tstorage address " << rec.bag_id.to_hex();
1756+
}
1757+
break;
1758+
}
17521759
case block::gen::DNSRecord::dns_next_resolver: {
17531760
block::gen::DNSRecord::Record_dns_next_resolver rec;
17541761
if (tlb::unpack_exact(cs, rec) && block::tlb::t_MsgAddressInt.extract_std_address(rec.resolver, wc, addr)) {

rldp-http-proxy/DNSResolver.cpp

Lines changed: 31 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -51,13 +51,13 @@ void DNSResolver::sync() {
5151
std::move(P));
5252
}
5353

54-
void DNSResolver::resolve(std::string host, td::Promise<ton::adnl::AdnlNodeIdShort> promise) {
54+
void DNSResolver::resolve(std::string host, td::Promise<std::string> promise) {
5555
auto it = cache_.find(host);
5656
if (it != cache_.end()) {
5757
const CacheEntry &entry = it->second;
5858
double now = td::Time::now();
5959
if (now < entry.created_at_ + CACHE_TIMEOUT_HARD) {
60-
promise.set_result(entry.id_);
60+
promise.set_result(entry.address_);
6161
promise.reset();
6262
if (now < entry.created_at_ + CACHE_TIMEOUT_SOFT) {
6363
return;
@@ -73,42 +73,42 @@ void DNSResolver::resolve(std::string host, td::Promise<ton::adnl::AdnlNodeIdSho
7373
if (promise) {
7474
promise.set_result(R.move_as_error());
7575
}
76-
} else {
77-
auto obj = R.move_as_ok();
78-
ton::adnl::AdnlNodeIdShort id;
79-
td::uint32 cnt = 0;
80-
for (auto &e : obj->entries_) {
81-
tonlib_api::downcast_call(*e->entry_.get(),
82-
td::overloaded(
83-
[&](tonlib_api::dns_entryDataAdnlAddress &x) {
84-
if (td::Random::fast(0, cnt) == 0) {
85-
auto R = ton::adnl::AdnlNodeIdShort::parse(x.adnl_address_->adnl_address_);
86-
if (R.is_ok()) {
87-
id = R.move_as_ok();
88-
cnt++;
89-
}
90-
}
91-
},
92-
[&](auto &x) {}));
93-
}
94-
if (cnt == 0) {
95-
if (promise) {
96-
promise.set_error(td::Status::Error("no DNS entries"));
97-
}
98-
} else {
99-
td::actor::send_closure(SelfId, &DNSResolver::save_to_cache, std::move(host), id);
100-
if (promise) {
101-
promise.set_result(id);
102-
}
76+
return;
77+
}
78+
auto obj = R.move_as_ok();
79+
std::string result;
80+
if (!obj->entries_.empty()) {
81+
tonlib_api::downcast_call(*obj->entries_[0]->entry_,
82+
td::overloaded(
83+
[&](tonlib_api::dns_entryDataAdnlAddress &x) {
84+
auto R = ton::adnl::AdnlNodeIdShort::parse(x.adnl_address_->adnl_address_);
85+
if (R.is_ok()) {
86+
ton::adnl::AdnlNodeIdShort id = R.move_as_ok();
87+
result = id.serialize() + ".adnl";
88+
}
89+
},
90+
[&](tonlib_api::dns_entryDataStorageAddress &x) {
91+
result = td::to_lower(x.bag_id_.to_hex()) + ".bag";
92+
},
93+
[&](auto &x) {}));
94+
}
95+
if (result.empty()) {
96+
if (promise) {
97+
promise.set_error(td::Status::Error("no DNS entries"));
10398
}
99+
return;
100+
}
101+
td::actor::send_closure(SelfId, &DNSResolver::save_to_cache, std::move(host), result);
102+
if (promise) {
103+
promise.set_result(std::move(result));
104104
}
105105
});
106106
td::actor::send_closure(tonlib_client_, &tonlib::TonlibClientWrapper::send_request<tonlib_api::dns_resolve>,
107107
std::move(obj), std::move(P));
108108
}
109109

110-
void DNSResolver::save_to_cache(std::string host, ton::adnl::AdnlNodeIdShort id) {
110+
void DNSResolver::save_to_cache(std::string host, std::string address) {
111111
CacheEntry &entry = cache_[host];
112-
entry.id_ = id;
112+
entry.address_ = address;
113113
entry.created_at_ = td::Time::now();
114114
}

rldp-http-proxy/DNSResolver.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -34,16 +34,16 @@ class DNSResolver : public td::actor::Actor {
3434
explicit DNSResolver(td::actor::ActorId<tonlib::TonlibClientWrapper> tonlib_client);
3535

3636
void start_up() override;
37-
void resolve(std::string host, td::Promise<ton::adnl::AdnlNodeIdShort> promise);
37+
void resolve(std::string host, td::Promise<std::string> promise);
3838

3939
private:
4040
void sync();
41-
void save_to_cache(std::string host, ton::adnl::AdnlNodeIdShort id);
41+
void save_to_cache(std::string host, std::string address);
4242

4343
td::actor::ActorId<tonlib::TonlibClientWrapper> tonlib_client_;
4444

4545
struct CacheEntry {
46-
ton::adnl::AdnlNodeIdShort id_;
46+
std::string address_;
4747
double created_at_;
4848
};
4949
std::map<std::string, CacheEntry> cache_;

0 commit comments

Comments
 (0)