mirror of
https://github.com/ton-blockchain/ton
synced 2025-03-09 15:40:10 +00:00
liteclient signature check support
1. update liteclient/liteserver. Now liteserver sends signatures of blocks and liteclient checks them. I.e. liteclient completely checks received data. 2. validator-engine: more GC options 3. blockchain-explorer: show all block transactions (instead of 256) 4. some bugfixes
This commit is contained in:
parent
d8244eff53
commit
9d6853ef24
58 changed files with 1480 additions and 325 deletions
|
@ -64,6 +64,9 @@ if (TONLIB_ENABLE_JNI AND NOT ANDROID) # jni is available by default on Android
|
|||
target_link_libraries(tonlib PUBLIC ${JAVA_JVM_LIBRARY})
|
||||
endif()
|
||||
|
||||
add_executable(tonlib-cli tonlib/tonlib-cli.cpp)
|
||||
target_link_libraries(tonlib-cli tonlib tdactor tdutils terminal)
|
||||
|
||||
if (NOT CMAKE_CROSSCOMPILING)
|
||||
if (TD_ENABLE_JNI)
|
||||
#FIXME
|
||||
|
|
|
@ -54,6 +54,7 @@ class ExtClient {
|
|||
template <class QueryT>
|
||||
void send_query(QueryT query, td::Promise<typename QueryT::ReturnType> promise) {
|
||||
auto raw_query = ton::serialize_tl_object(&query, true);
|
||||
LOG(ERROR) << "send query to liteserver: " << to_string(query);
|
||||
td::BufferSlice liteserver_query =
|
||||
ton::serialize_tl_object(ton::create_tl_object<ton::lite_api::liteServer_query>(std::move(raw_query)), true);
|
||||
|
||||
|
@ -65,7 +66,8 @@ class ExtClient {
|
|||
auto f = r_error.move_as_ok();
|
||||
return td::Status::Error(f->code_, f->message_);
|
||||
}
|
||||
return ton::fetch_result<QueryT>(std::move(data));
|
||||
auto res = ton::fetch_result<QueryT>(std::move(data));
|
||||
return std::move(res);
|
||||
}());
|
||||
});
|
||||
}
|
||||
|
|
|
@ -43,6 +43,8 @@ void LastBlock::on_masterchain_info(
|
|||
auto info = r_info.move_as_ok();
|
||||
update_zero_state(create_zero_state_id(info->init_));
|
||||
update_mc_last_block(create_block_id(info->last_));
|
||||
} else {
|
||||
LOG(WARNING) << "Failed liteServer_getMasterchainInfo " << r_info.error();
|
||||
}
|
||||
for (auto& promise : promises_) {
|
||||
auto copy = mc_last_block_id_;
|
||||
|
|
|
@ -21,6 +21,7 @@
|
|||
#include "auto/tl/tonlib_api.h"
|
||||
|
||||
namespace tonlib_api = ton::tonlib_api;
|
||||
namespace tonlib {
|
||||
|
||||
class TonlibCallback {
|
||||
public:
|
||||
|
@ -28,3 +29,4 @@ class TonlibCallback {
|
|||
virtual void on_error(std::uint64_t id, tonlib_api::object_ptr<tonlib_api::error> error) = 0;
|
||||
virtual ~TonlibCallback() = default;
|
||||
};
|
||||
} // namespace tonlib
|
||||
|
|
|
@ -54,6 +54,10 @@ auto try_f(F&& f) noexcept -> decltype(f()) {
|
|||
|
||||
#define TRY_VM(f) try_f([&] { return f; })
|
||||
|
||||
tonlib_api::object_ptr<tonlib_api::error> status_to_tonlib_api(const td::Status& status) {
|
||||
return tonlib_api::make_object<tonlib_api::error>(status.code(), status.message().str());
|
||||
}
|
||||
|
||||
static block::AccountState create_account_state(ton::tl_object_ptr<ton::lite_api::liteServer_accountState> from) {
|
||||
block::AccountState res;
|
||||
res.blk = ton::create_block_id(from->id_);
|
||||
|
@ -177,7 +181,6 @@ class GetRawAccountState : public td::actor::Actor {
|
|||
auto account_state = create_account_state(std::move(raw_account_state));
|
||||
TRY_RESULT(info, account_state.validate(last_block_, address_));
|
||||
auto serialized_state = account_state.state.clone();
|
||||
LOG(ERROR) << serialized_state.size();
|
||||
RawAccountState res;
|
||||
res.info = std::move(info);
|
||||
auto cell = res.info.root;
|
||||
|
@ -288,6 +291,7 @@ void TonlibClient::on_result(td::uint64 id, tonlib_api::object_ptr<tonlib_api::O
|
|||
callback_->on_result(id, std::move(response));
|
||||
}
|
||||
void TonlibClient::request(td::uint64 id, tonlib_api::object_ptr<tonlib_api::Function> function) {
|
||||
LOG(ERROR) << to_string(function);
|
||||
if (function == nullptr) {
|
||||
LOG(ERROR) << "Receive empty static request";
|
||||
return on_result(id, tonlib_api::make_object<tonlib_api::error>(400, "Request is empty"));
|
||||
|
@ -311,7 +315,7 @@ void TonlibClient::request(td::uint64 id, tonlib_api::object_ptr<tonlib_api::Fun
|
|||
td::Promise<ReturnType> promise = [actor_id = actor_id(self), id](td::Result<ReturnType> r_result) {
|
||||
tonlib_api::object_ptr<tonlib_api::Object> result;
|
||||
if (r_result.is_error()) {
|
||||
result = tonlib_api::make_object<tonlib_api::error>(r_result.error().code(), r_result.error().message().str());
|
||||
result = status_to_tonlib_api(r_result.error());
|
||||
} else {
|
||||
result = r_result.move_as_ok();
|
||||
}
|
||||
|
@ -343,6 +347,9 @@ tonlib_api::object_ptr<tonlib_api::Object> TonlibClient::static_request(
|
|||
bool TonlibClient::is_static_request(td::int32 id) {
|
||||
switch (id) {
|
||||
case tonlib_api::runTests::ID:
|
||||
case tonlib_api::raw_getAccountAddress::ID:
|
||||
case tonlib_api::testWallet_getAccountAddress::ID:
|
||||
case tonlib_api::testGiver_getAccountAddress::ID:
|
||||
return true;
|
||||
default:
|
||||
return false;
|
||||
|
@ -366,6 +373,37 @@ tonlib_api::object_ptr<tonlib_api::Object> TonlibClient::do_static_request(const
|
|||
runner.run_all();
|
||||
return tonlib_api::make_object<tonlib_api::ok>();
|
||||
}
|
||||
td::Result<block::StdAddress> get_account_address(const tonlib_api::raw_initialAccountState& raw_state) {
|
||||
TRY_RESULT(code, vm::std_boc_deserialize(raw_state.code_));
|
||||
TRY_RESULT(data, vm::std_boc_deserialize(raw_state.data_));
|
||||
return GenericAccount::get_address(0 /*zerochain*/, GenericAccount::get_init_state(std::move(code), std::move(data)));
|
||||
}
|
||||
|
||||
td::Result<block::StdAddress> get_account_address(const tonlib_api::testWallet_initialAccountState& test_wallet_state) {
|
||||
auto key = td::Ed25519::PublicKey(td::SecureString(test_wallet_state.public_key_));
|
||||
return GenericAccount::get_address(0 /*zerochain*/, TestWallet::get_init_state(key));
|
||||
}
|
||||
|
||||
tonlib_api::object_ptr<tonlib_api::Object> TonlibClient::do_static_request(
|
||||
const tonlib_api::raw_getAccountAddress& request) {
|
||||
auto r_account_address = get_account_address(*request.initital_account_state_);
|
||||
if (r_account_address.is_error()) {
|
||||
return status_to_tonlib_api(r_account_address.error());
|
||||
}
|
||||
return tonlib_api::make_object<tonlib_api::accountAddress>(r_account_address.ok().rserialize());
|
||||
}
|
||||
tonlib_api::object_ptr<tonlib_api::Object> TonlibClient::do_static_request(
|
||||
const tonlib_api::testWallet_getAccountAddress& request) {
|
||||
auto r_account_address = get_account_address(*request.initital_account_state_);
|
||||
if (r_account_address.is_error()) {
|
||||
return status_to_tonlib_api(r_account_address.error());
|
||||
}
|
||||
return tonlib_api::make_object<tonlib_api::accountAddress>(r_account_address.ok().rserialize());
|
||||
}
|
||||
tonlib_api::object_ptr<tonlib_api::Object> TonlibClient::do_static_request(
|
||||
const tonlib_api::testGiver_getAccountAddress& request) {
|
||||
return tonlib_api::make_object<tonlib_api::accountAddress>(TestGiver::address().rserialize());
|
||||
}
|
||||
|
||||
td::Status TonlibClient::do_request(const tonlib_api::init& request,
|
||||
td::Promise<object_ptr<tonlib_api::ok>>&& promise) {
|
||||
|
@ -411,17 +449,6 @@ td::Status TonlibClient::do_request(const tonlib_api::options_setConfig& request
|
|||
return td::Status::OK();
|
||||
}
|
||||
|
||||
td::Result<block::StdAddress> get_account_address(const tonlib_api::raw_initialAccountState& raw_state) {
|
||||
TRY_RESULT(code, vm::std_boc_deserialize(raw_state.code_));
|
||||
TRY_RESULT(data, vm::std_boc_deserialize(raw_state.data_));
|
||||
return GenericAccount::get_address(0 /*zerochain*/, GenericAccount::get_init_state(std::move(code), std::move(data)));
|
||||
}
|
||||
|
||||
td::Result<block::StdAddress> get_account_address(const tonlib_api::testWallet_initialAccountState& test_wallet_state) {
|
||||
auto key = td::Ed25519::PublicKey(td::SecureString(test_wallet_state.public_key_));
|
||||
return GenericAccount::get_address(0 /*zerochain*/, TestWallet::get_init_state(key));
|
||||
}
|
||||
|
||||
tonlib_api::object_ptr<tonlib_api::internal_transactionId> to_transaction_id(const block::AccountState::Info& info) {
|
||||
return tonlib_api::make_object<tonlib_api::internal_transactionId>(info.last_trans_lt,
|
||||
info.last_trans_hash.as_slice().str());
|
||||
|
@ -624,13 +651,6 @@ td::Result<tonlib_api::object_ptr<tonlib_api::generic_AccountState>> to_generic_
|
|||
|
||||
// Raw
|
||||
|
||||
td::Status TonlibClient::do_request(const tonlib_api::raw_getAccountAddress& request,
|
||||
td::Promise<object_ptr<tonlib_api::accountAddress>>&& promise) {
|
||||
TRY_RESULT(account_address, get_account_address(*request.initital_account_state_));
|
||||
promise.set_value(tonlib_api::make_object<tonlib_api::accountAddress>(account_address.rserialize()));
|
||||
return td::Status::OK();
|
||||
}
|
||||
|
||||
td::Status TonlibClient::do_request(const tonlib_api::raw_sendMessage& request,
|
||||
td::Promise<object_ptr<tonlib_api::ok>>&& promise) {
|
||||
td::Ref<vm::Cell> init_state;
|
||||
|
@ -701,12 +721,6 @@ td::Status TonlibClient::do_request(tonlib_api::raw_getTransactions& request,
|
|||
return td::Status::OK();
|
||||
}
|
||||
|
||||
td::Status TonlibClient::do_request(tonlib_api::testGiver_getAccountAddress& request,
|
||||
td::Promise<object_ptr<tonlib_api::accountAddress>>&& promise) {
|
||||
promise.set_value(tonlib_api::make_object<tonlib_api::accountAddress>(TestGiver::address().rserialize()));
|
||||
return td::Status::OK();
|
||||
}
|
||||
|
||||
td::Result<KeyStorage::InputKey> from_tonlib(tonlib_api::inputKey& input_key) {
|
||||
if (!input_key.key_) {
|
||||
return td::Status::Error(400, "Field key must not be empty");
|
||||
|
@ -734,13 +748,6 @@ td::Status TonlibClient::do_request(const tonlib_api::testWallet_init& request,
|
|||
std::move(promise));
|
||||
}
|
||||
|
||||
td::Status TonlibClient::do_request(const tonlib_api::testWallet_getAccountAddress& request,
|
||||
td::Promise<object_ptr<tonlib_api::accountAddress>>&& promise) {
|
||||
TRY_RESULT(account_address, get_account_address(*request.initital_account_state_));
|
||||
promise.set_value(tonlib_api::make_object<tonlib_api::accountAddress>(account_address.rserialize()));
|
||||
return td::Status::OK();
|
||||
}
|
||||
|
||||
td::Status TonlibClient::do_request(const tonlib_api::testWallet_sendGrams& request,
|
||||
td::Promise<object_ptr<tonlib_api::ok>>&& promise) {
|
||||
if (!request.destination_) {
|
||||
|
@ -837,6 +844,7 @@ td::Status TonlibClient::do_request(const tonlib_api::generic_getAccountState& r
|
|||
td::Status TonlibClient::do_request(tonlib_api::generic_sendGrams& request,
|
||||
td::Promise<object_ptr<tonlib_api::ok>>&& promise) {
|
||||
TRY_RESULT(account_address, block::StdAddress::parse(request.source_->account_address_));
|
||||
LOG(INFO) << "Send " << request.amount_ << " nanograms from " << account_address.rserialize();
|
||||
td::actor::create_actor<GetRawAccountState>(
|
||||
"GetAccountState", client_.get_client(), std::move(account_address),
|
||||
[promise = std::move(promise), self = this, actor_id = td::actor::actor_id(),
|
||||
|
@ -858,6 +866,7 @@ td::Status TonlibClient::do_request(tonlib_api::generic_sendGrams& request,
|
|||
query = tonlib_api::testGiver_sendGrams(
|
||||
std::move(destination), test_giver_state.account_state_->seqno_,
|
||||
amount)]() mutable {
|
||||
LOG(INFO) << "Send " << to_string(query);
|
||||
auto status = self->do_request(query, std::move(promise));
|
||||
if (status.is_error()) {
|
||||
CHECK(promise);
|
||||
|
|
|
@ -76,6 +76,9 @@ class TonlibClient : public td::actor::Actor {
|
|||
return tonlib_api::make_object<tonlib_api::error>(400, "Function can't be executed synchronously");
|
||||
}
|
||||
static object_ptr<tonlib_api::Object> do_static_request(const tonlib_api::runTests& request);
|
||||
static object_ptr<tonlib_api::Object> do_static_request(const tonlib_api::raw_getAccountAddress& request);
|
||||
static object_ptr<tonlib_api::Object> do_static_request(const tonlib_api::testWallet_getAccountAddress& request);
|
||||
static object_ptr<tonlib_api::Object> do_static_request(const tonlib_api::testGiver_getAccountAddress& request);
|
||||
template <class T, class P>
|
||||
td::Status do_request(const T& request, P&& promise) {
|
||||
return td::Status::Error(400, "Function is unsupported");
|
||||
|
@ -88,8 +91,6 @@ class TonlibClient : public td::actor::Actor {
|
|||
td::Status do_request(const tonlib_api::options_setConfig& request,
|
||||
td::Promise<object_ptr<tonlib_api::ok>>&& promise);
|
||||
|
||||
td::Status do_request(const tonlib_api::raw_getAccountAddress& request,
|
||||
td::Promise<object_ptr<tonlib_api::accountAddress>>&& promise);
|
||||
td::Status do_request(const tonlib_api::raw_sendMessage& request, td::Promise<object_ptr<tonlib_api::ok>>&& promise);
|
||||
td::Status do_request(tonlib_api::raw_getAccountState& request,
|
||||
td::Promise<object_ptr<tonlib_api::raw_accountState>>&& promise);
|
||||
|
@ -97,8 +98,6 @@ class TonlibClient : public td::actor::Actor {
|
|||
td::Promise<object_ptr<tonlib_api::raw_transactions>>&& promise);
|
||||
|
||||
td::Status do_request(const tonlib_api::testWallet_init& request, td::Promise<object_ptr<tonlib_api::ok>>&& promise);
|
||||
td::Status do_request(const tonlib_api::testWallet_getAccountAddress& request,
|
||||
td::Promise<object_ptr<tonlib_api::accountAddress>>&& promise);
|
||||
td::Status do_request(const tonlib_api::testWallet_sendGrams& request,
|
||||
td::Promise<object_ptr<tonlib_api::ok>>&& promise);
|
||||
td::Status do_request(tonlib_api::testWallet_getAccountState& request,
|
||||
|
@ -106,8 +105,6 @@ class TonlibClient : public td::actor::Actor {
|
|||
|
||||
td::Status do_request(const tonlib_api::testGiver_getAccountState& request,
|
||||
td::Promise<object_ptr<tonlib_api::testGiver_accountState>>&& promise);
|
||||
td::Status do_request(tonlib_api::testGiver_getAccountAddress& request,
|
||||
td::Promise<object_ptr<tonlib_api::accountAddress>>&& promise);
|
||||
td::Status do_request(const tonlib_api::testGiver_sendGrams& request,
|
||||
td::Promise<object_ptr<tonlib_api::ok>>&& promise);
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue