From 6185e3b18fbe3f1284688aba5c37da8795037c50 Mon Sep 17 00:00:00 2001 From: ms <98183742+dungeon-master-666@users.noreply.github.com> Date: Mon, 15 Aug 2022 17:17:41 +0200 Subject: [PATCH] Add tonlib method smc.getLibraries (#428) Co-authored-by: ms --- tl/generate/scheme/tonlib_api.tl | 5 +++ tl/generate/scheme/tonlib_api.tlo | Bin 28572 -> 29024 bytes tonlib/tonlib/TonlibClient.cpp | 54 +++++++++++++++++++++++++++++- tonlib/tonlib/TonlibClient.h | 3 ++ 4 files changed, 61 insertions(+), 1 deletion(-) diff --git a/tl/generate/scheme/tonlib_api.tl b/tl/generate/scheme/tonlib_api.tl index c1c3966f..599cb21f 100644 --- a/tl/generate/scheme/tonlib_api.tl +++ b/tl/generate/scheme/tonlib_api.tl @@ -180,6 +180,9 @@ smc.methodIdName name:string = smc.MethodId; smc.runResult gas_used:int53 stack:vector exit_code:int32 = smc.RunResult; +smc.libraryEntry hash:int256 data:bytes = smc.LibraryEntry; +smc.libraryResult result:(vector smc.libraryEntry) = smc.LibraryResult; + updateSendLiteServerQuery id:int64 data:bytes = Update; updateSyncState sync_state:SyncState = Update; @@ -286,6 +289,8 @@ smc.getData id:int53 = tvm.Cell; smc.getState id:int53 = tvm.Cell; smc.runGetMethod id:int53 method:smc.MethodId stack:vector = smc.RunResult; +smc.getLibraries library_list:(vector int256) = smc.LibraryResult; + dns.resolve account_address:accountAddress name:string category:int256 ttl:int32 = dns.Resolved; pchan.signPromise input_key:InputKey promise:pchan.promise = pchan.Promise; diff --git a/tl/generate/scheme/tonlib_api.tlo b/tl/generate/scheme/tonlib_api.tlo index 0bf3f39e013e73ca71abc5f29e0d8b63c799f58c..6ba7fea3ff6c2d656771edff5bb7230a7c9ea906 100644 GIT binary patch delta 316 zcmbPppYg#XM&3uW^{p77AbKOOGp`8GrK^htigT0od@_@Y5{oKb^Gb>)7cj|4{M)V0 zBZwpslv-SxQ^LS7u|Q&T0B;E+W6S2FeCgJTa07A>22=vA0Eyo`Cgj63`K*cfWQ%Zt z$vjB{lQ+nU*n?zXj<_nv6$7^kY68qAkT}Q$MxbKpXZJPPioi~oyxvk)0%QhA90ZD- z*>pH;+YW-%Z&vW~U}JRMoEdOl##HoOrvcb+>8T|U?`5VI12v!<%mcMJJ}0xdWb#@| Q`N<6iA}nCzbaD%r038Ty!T from_tonlib_api(tonlib_api::tvm_StackEntry& entry) { } void deep_library_search(std::set& set, std::set& visited, - vm::Dictionary libs, td::Ref cell, int depth) { + vm::Dictionary& libs, td::Ref cell, int depth) { if (depth <= 0 || set.size() >= 16 || visited.size() >= 256) { return; } @@ -3469,6 +3469,58 @@ void deep_library_search(std::set& set, std::set& v } } +td::Status TonlibClient::do_request(const tonlib_api::smc_getLibraries& request, + td::Promise>&& promise) { + std::vector> result_entries; + result_entries.reserve(request.library_list_.size()); + std::vector not_cached_hashes; + for (auto& library_hash : request.library_list_) { + if (libraries.key_exists(library_hash)) { + auto library_content = vm::std_boc_serialize(libraries.lookup_ref(library_hash)).move_as_ok().as_slice().str(); + result_entries.push_back(tonlib_api::make_object(library_hash, library_content)); + } else { + not_cached_hashes.push_back(library_hash); + } + } + + if (not_cached_hashes.empty()) { + promise.set_value(tonlib_api::make_object(std::move(result_entries))); + return td::Status::OK(); + } + + client_.send_query(ton::lite_api::liteServer_getLibraries(std::move(not_cached_hashes)), + promise.wrap([self=this, result_entries = std::move(result_entries)] + (td::Result> r_libraries) mutable + { + if (r_libraries.is_error()) { + LOG(WARNING) << "cannot obtain found libraries: " << r_libraries.move_as_error().to_string(); + } else { + auto libraries = r_libraries.move_as_ok(); + bool updated = false; + for (auto& lr : libraries->result_) { + auto contents = vm::std_boc_deserialize(lr->data_); + if (contents.is_ok() && contents.ok().not_null()) { + if (contents.ok()->get_hash().bits().compare(lr->hash_.cbits(), 256)) { + LOG(WARNING) << "hash mismatch for library " << lr->hash_.to_hex(); + continue; + } + result_entries.push_back(tonlib_api::make_object(lr->hash_, lr->data_.as_slice().str())); + self->libraries.set_ref(lr->hash_, contents.move_as_ok()); + updated = true; + LOG(DEBUG) << "registered library " << lr->hash_.to_hex(); + } else { + LOG(WARNING) << "failed to deserialize library: " << lr->hash_.to_hex(); + } + if (updated) { + self->store_libs_to_disk(); + } + } + } + return tonlib_api::make_object(std::move(result_entries)); + })); + return td::Status::OK(); +} + td::Status TonlibClient::do_request(const tonlib_api::smc_runGetMethod& request, td::Promise>&& promise) { auto it = smcs_.find(request.id_); diff --git a/tonlib/tonlib/TonlibClient.h b/tonlib/tonlib/TonlibClient.h index 09c102cd..3ce68ee4 100644 --- a/tonlib/tonlib/TonlibClient.h +++ b/tonlib/tonlib/TonlibClient.h @@ -311,6 +311,9 @@ class TonlibClient : public td::actor::Actor { td::Status do_request(const tonlib_api::smc_runGetMethod& request, td::Promise>&& promise); + td::Status do_request(const tonlib_api::smc_getLibraries& request, + td::Promise>&& promise); + td::Status do_request(const tonlib_api::dns_resolve& request, td::Promise>&& promise);