1
0
Fork 0
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:
ton 2019-10-03 17:04:52 +04:00
parent 841d5ebac2
commit 7ea00ebfcf
89 changed files with 1922 additions and 608 deletions

View file

@ -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();