mirror of
https://github.com/ton-blockchain/ton
synced 2025-03-09 15:40:10 +00:00
updated tonlib, fixed bugs
updated tonlib fixed bugs in func validator: partial support for hardforks liteserver: support for waitMasterchainBlock prefix transactions: support for gas flat rate
This commit is contained in:
parent
841d5ebac2
commit
7ea00ebfcf
89 changed files with 1922 additions and 608 deletions
|
@ -25,6 +25,7 @@
|
|||
#include "adnl/utils.hpp"
|
||||
#include "validator/downloaders/download-state.hpp"
|
||||
#include "common/delay.h"
|
||||
#include "td/actor/MultiPromise.h"
|
||||
|
||||
namespace ton {
|
||||
|
||||
|
@ -33,7 +34,16 @@ namespace validator {
|
|||
void ValidatorManagerMasterchainReiniter::start_up() {
|
||||
CHECK(block_id_.is_masterchain());
|
||||
CHECK(block_id_.id.shard == shardIdAll);
|
||||
CHECK(block_id_.seqno() >= opts_->get_last_fork_masterchain_seqno());
|
||||
|
||||
auto P = td::PromiseCreator::lambda([SelfId = actor_id(this)](td::Result<td::Unit> R) {
|
||||
R.ensure();
|
||||
td::actor::send_closure(SelfId, &ValidatorManagerMasterchainReiniter::written_hardforks);
|
||||
});
|
||||
td::actor::send_closure(db_, &Db::update_hardforks, opts_->get_hardforks(), std::move(P));
|
||||
}
|
||||
|
||||
void ValidatorManagerMasterchainReiniter::written_hardforks() {
|
||||
auto P = td::PromiseCreator::lambda([SelfId = actor_id(this)](td::Result<BlockHandle> R) {
|
||||
R.ensure();
|
||||
td::actor::send_closure(SelfId, &ValidatorManagerMasterchainReiniter::got_masterchain_handle, R.move_as_ok());
|
||||
|
@ -268,7 +278,7 @@ void ValidatorManagerMasterchainStarter::start_up() {
|
|||
}
|
||||
|
||||
void ValidatorManagerMasterchainStarter::failed_to_get_init_block_id() {
|
||||
td::actor::create_actor<ValidatorManagerMasterchainReiniter>("reiniter", opts_, manager_, std::move(promise_))
|
||||
td::actor::create_actor<ValidatorManagerMasterchainReiniter>("reiniter", opts_, manager_, db_, std::move(promise_))
|
||||
.release();
|
||||
stop();
|
||||
}
|
||||
|
@ -351,7 +361,7 @@ void ValidatorManagerMasterchainStarter::got_gc_block_state(td::Ref<MasterchainS
|
|||
td::actor::send_closure(SelfId, &ValidatorManagerMasterchainStarter::got_shard_block_id, R.move_as_ok());
|
||||
});
|
||||
|
||||
td::actor::send_closure(manager_, &ValidatorManager::get_shard_client_state, std::move(P));
|
||||
td::actor::send_closure(manager_, &ValidatorManager::get_shard_client_state, true, std::move(P));
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -375,15 +385,169 @@ void ValidatorManagerMasterchainStarter::got_key_block_handle(BlockHandle handle
|
|||
td::actor::send_closure(SelfId, &ValidatorManagerMasterchainStarter::got_shard_block_id, R.move_as_ok());
|
||||
});
|
||||
|
||||
td::actor::send_closure(manager_, &ValidatorManager::get_shard_client_state, std::move(P));
|
||||
td::actor::send_closure(manager_, &ValidatorManager::get_shard_client_state, true, std::move(P));
|
||||
}
|
||||
|
||||
void ValidatorManagerMasterchainStarter::got_shard_block_id(BlockIdExt block_id) {
|
||||
client_ = td::actor::create_actor<ShardClient>("shardclient", opts_, manager_);
|
||||
client_block_id_ = block_id;
|
||||
finish();
|
||||
|
||||
auto P = td::PromiseCreator::lambda([SelfId = actor_id(this)](td::Result<std::vector<BlockIdExt>> R) {
|
||||
R.ensure();
|
||||
td::actor::send_closure(SelfId, &ValidatorManagerMasterchainStarter::got_hardforks, R.move_as_ok());
|
||||
});
|
||||
td::actor::send_closure(db_, &Db::get_hardforks, std::move(P));
|
||||
}
|
||||
|
||||
void ValidatorManagerMasterchainStarter::got_hardforks(std::vector<BlockIdExt> vec) {
|
||||
auto h = opts_->get_hardforks();
|
||||
if (h.size() < vec.size()) {
|
||||
LOG(FATAL) << "cannot start: number of hardforks decreased";
|
||||
return;
|
||||
}
|
||||
if (h.size() == vec.size()) {
|
||||
if (h.size() > 0) {
|
||||
if (*h.rbegin() != *vec.rbegin()) {
|
||||
LOG(FATAL) << "cannot start: hardforks list changed";
|
||||
return;
|
||||
}
|
||||
}
|
||||
finish();
|
||||
return;
|
||||
}
|
||||
if (h.size() > vec.size() + 1) {
|
||||
LOG(FATAL) << "cannot start: number of hardforks increase is too big";
|
||||
return;
|
||||
}
|
||||
|
||||
auto b = *h.rbegin();
|
||||
if (b.seqno() > handle_->id().seqno()) {
|
||||
truncated();
|
||||
return;
|
||||
}
|
||||
if (b.seqno() <= gc_handle_->id().seqno()) {
|
||||
LOG(FATAL) << "cannot start: new hardfork is on too old block (already gc'd)";
|
||||
return;
|
||||
}
|
||||
|
||||
BlockIdExt id;
|
||||
if (state_->get_old_mc_block_id(b.seqno() - 1, id)) {
|
||||
got_truncate_block_id(id);
|
||||
return;
|
||||
}
|
||||
|
||||
auto P = td::PromiseCreator::lambda([SelfId = actor_id(this)](td::Result<BlockIdExt> R) {
|
||||
R.ensure();
|
||||
td::actor::send_closure(SelfId, &ValidatorManagerMasterchainStarter::got_truncate_block_id, R.move_as_ok());
|
||||
});
|
||||
td::actor::send_closure(db_, &Db::get_block_by_seqno, AccountIdPrefixFull{masterchainId, 0}, b.seqno() - 1,
|
||||
std::move(P));
|
||||
}
|
||||
|
||||
void ValidatorManagerMasterchainStarter::got_truncate_block_id(BlockIdExt block_id) {
|
||||
block_id_ = block_id;
|
||||
|
||||
auto P = td::PromiseCreator::lambda([SelfId = actor_id(this)](td::Result<BlockHandle> R) {
|
||||
R.ensure();
|
||||
td::actor::send_closure(SelfId, &ValidatorManagerMasterchainStarter::got_truncate_block_handle, R.move_as_ok());
|
||||
});
|
||||
td::actor::send_closure(manager_, &ValidatorManager::get_block_handle, block_id_, false, std::move(P));
|
||||
}
|
||||
|
||||
void ValidatorManagerMasterchainStarter::got_truncate_block_handle(BlockHandle handle) {
|
||||
handle_ = std::move(handle);
|
||||
auto P = td::PromiseCreator::lambda([SelfId = actor_id(this)](td::Result<td::Ref<ShardState>> R) {
|
||||
R.ensure();
|
||||
td::actor::send_closure(SelfId, &ValidatorManagerMasterchainStarter::got_truncate_state,
|
||||
td::Ref<MasterchainState>{R.move_as_ok()});
|
||||
});
|
||||
td::actor::send_closure(db_, &Db::get_block_state, handle_, std::move(P));
|
||||
}
|
||||
|
||||
void ValidatorManagerMasterchainStarter::got_truncate_state(td::Ref<MasterchainState> state) {
|
||||
state_ = std::move(state);
|
||||
auto P = td::PromiseCreator::lambda([SelfId = actor_id(this)](td::Result<td::Unit> R) {
|
||||
R.ensure();
|
||||
td::actor::send_closure(SelfId, &ValidatorManagerMasterchainStarter::truncated_db);
|
||||
});
|
||||
td::actor::send_closure(manager_, &ValidatorManager::truncate, state_, std::move(P));
|
||||
}
|
||||
|
||||
void ValidatorManagerMasterchainStarter::truncated_db() {
|
||||
auto P = td::PromiseCreator::lambda([SelfId = actor_id(this)](td::Result<td::Unit> R) {
|
||||
R.ensure();
|
||||
td::actor::send_closure(SelfId, &ValidatorManagerMasterchainStarter::truncated);
|
||||
});
|
||||
|
||||
auto key = state_->last_key_block_id();
|
||||
|
||||
td::MultiPromise mp;
|
||||
auto ig = mp.init_guard();
|
||||
ig.add_promise(std::move(P));
|
||||
|
||||
td::actor::send_closure(db_, &Db::update_init_masterchain_block, block_id_, ig.get_promise());
|
||||
|
||||
if (client_block_id_.seqno() > block_id_.seqno()) {
|
||||
client_block_id_ = block_id_;
|
||||
td::actor::send_closure(db_, &Db::update_shard_client_state, client_block_id_, ig.get_promise());
|
||||
}
|
||||
|
||||
if (last_key_block_handle_->id().seqno() > key.seqno()) {
|
||||
auto P = td::PromiseCreator::lambda([SelfId = actor_id(this),
|
||||
promise = ig.get_promise()](td::Result<BlockHandle> R) mutable {
|
||||
R.ensure();
|
||||
td::actor::send_closure(SelfId, &ValidatorManagerMasterchainStarter::got_prev_key_block_handle, R.move_as_ok());
|
||||
promise.set_value(td::Unit());
|
||||
});
|
||||
td::actor::send_closure(manager_, &ValidatorManager::get_block_handle, key, false, std::move(P));
|
||||
}
|
||||
|
||||
{
|
||||
auto P = td::PromiseCreator::lambda(
|
||||
[b = block_id_, key, db = db_, promise = ig.get_promise()](td::Result<AsyncSerializerState> R) mutable {
|
||||
if (R.is_error()) {
|
||||
promise.set_value(td::Unit());
|
||||
return;
|
||||
}
|
||||
auto s = R.move_as_ok();
|
||||
if (s.last_block_id.seqno() <= b.seqno()) {
|
||||
promise.set_value(td::Unit());
|
||||
return;
|
||||
}
|
||||
s.last_block_id = b;
|
||||
if (s.last_written_block_id.seqno() > b.seqno()) {
|
||||
s.last_written_block_id = key;
|
||||
s.last_written_block_ts = 0; // may lead to extra state snapshot on disk. Does not seem like a problem
|
||||
}
|
||||
td::actor::send_closure(db, &Db::update_async_serializer_state, s, std::move(promise));
|
||||
});
|
||||
td::actor::send_closure(db_, &Db::get_async_serializer_state, std::move(P));
|
||||
}
|
||||
}
|
||||
|
||||
void ValidatorManagerMasterchainStarter::got_prev_key_block_handle(BlockHandle handle) {
|
||||
last_key_block_handle_ = std::move(handle);
|
||||
}
|
||||
|
||||
void ValidatorManagerMasterchainStarter::truncated() {
|
||||
handle_->set_next(*opts_->get_hardforks().rbegin());
|
||||
auto P = td::PromiseCreator::lambda([SelfId = actor_id(this)](td::Result<td::Unit> R) {
|
||||
R.ensure();
|
||||
td::actor::send_closure(SelfId, &ValidatorManagerMasterchainStarter::written_next);
|
||||
});
|
||||
handle_->flush(manager_, handle_, std::move(P));
|
||||
}
|
||||
|
||||
void ValidatorManagerMasterchainStarter::written_next() {
|
||||
auto P = td::PromiseCreator::lambda([SelfId = actor_id(this)](td::Result<td::Unit> R) {
|
||||
R.ensure();
|
||||
td::actor::send_closure(SelfId, &ValidatorManagerMasterchainStarter::finish);
|
||||
});
|
||||
td::actor::send_closure(db_, &Db::update_hardforks, opts_->get_hardforks(), std::move(P));
|
||||
}
|
||||
|
||||
void ValidatorManagerMasterchainStarter::finish() {
|
||||
client_ = td::actor::create_actor<ShardClient>("shardclient", opts_, manager_);
|
||||
promise_.set_value(
|
||||
ValidatorManagerInitResult{handle_, state_, std::move(client_), gc_handle_, gc_state_, last_key_block_handle_});
|
||||
stop();
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue