mirror of
https://github.com/ton-blockchain/ton
synced 2025-03-09 15:40:10 +00:00
Merge branch 'testnet' into block-generation
This commit is contained in:
commit
f4fd3ff3be
246 changed files with 7895 additions and 5430 deletions
|
@ -1,4 +1,4 @@
|
|||
cmake_minimum_required(VERSION 3.0.2 FATAL_ERROR)
|
||||
cmake_minimum_required(VERSION 3.5 FATAL_ERROR)
|
||||
|
||||
if (NOT OPENSSL_FOUND)
|
||||
find_package(OpenSSL REQUIRED)
|
||||
|
|
|
@ -60,7 +60,6 @@ class Collator final : public td::actor::Actor {
|
|||
bool preinit_complete{false};
|
||||
bool is_key_block_{false};
|
||||
bool block_full_{false};
|
||||
bool outq_cleanup_partial_{false};
|
||||
bool inbound_queues_empty_{false};
|
||||
bool libraries_changed_{false};
|
||||
bool prev_key_block_exists_{false};
|
||||
|
@ -192,6 +191,7 @@ class Collator final : public td::actor::Actor {
|
|||
std::pair<ton::LogicalTime, ton::Bits256> last_proc_int_msg_, first_unproc_int_msg_;
|
||||
std::unique_ptr<vm::AugmentedDictionary> in_msg_dict, out_msg_dict, old_out_msg_queue_, out_msg_queue_,
|
||||
sibling_out_msg_queue_;
|
||||
td::uint32 out_msg_queue_size_ = 0;
|
||||
std::unique_ptr<vm::Dictionary> ihr_pending;
|
||||
std::shared_ptr<block::MsgProcessedUptoCollection> processed_upto_, sibling_processed_upto_;
|
||||
std::unique_ptr<vm::Dictionary> block_create_stats_;
|
||||
|
@ -210,7 +210,7 @@ class Collator final : public td::actor::Actor {
|
|||
//
|
||||
block::Account* lookup_account(td::ConstBitPtr addr) const;
|
||||
std::unique_ptr<block::Account> make_account_from(td::ConstBitPtr addr, Ref<vm::CellSlice> account,
|
||||
Ref<vm::CellSlice> extra, bool force_create = false);
|
||||
bool force_create);
|
||||
td::Result<block::Account*> make_account(td::ConstBitPtr addr, bool force_create = false);
|
||||
td::actor::ActorId<Collator> get_self() {
|
||||
return actor_id(this);
|
||||
|
@ -235,6 +235,7 @@ class Collator final : public td::actor::Actor {
|
|||
bool fix_processed_upto(block::MsgProcessedUptoCollection& upto);
|
||||
void got_neighbor_msg_queues(td::Result<std::map<BlockIdExt, Ref<OutMsgQueueProof>>> R);
|
||||
void got_neighbor_msg_queue(unsigned i, Ref<OutMsgQueueProof> res);
|
||||
void got_out_queue_size(size_t i, td::Result<td::uint32> res);
|
||||
bool adjust_shard_config();
|
||||
bool store_shard_fees(ShardIdFull shard, const block::CurrencyCollection& fees,
|
||||
const block::CurrencyCollection& created);
|
||||
|
@ -253,7 +254,7 @@ class Collator final : public td::actor::Actor {
|
|||
Ref<vm::Cell>& in_msg);
|
||||
bool create_ticktock_transactions(int mask);
|
||||
bool create_ticktock_transaction(const ton::StdSmcAddress& smc_addr, ton::LogicalTime req_start_lt, int mask);
|
||||
Ref<vm::Cell> create_ordinary_transaction(Ref<vm::Cell> msg_root);
|
||||
Ref<vm::Cell> create_ordinary_transaction(Ref<vm::Cell> msg_root, bool is_special_tx = false);
|
||||
bool check_cur_validator_set();
|
||||
bool unpack_last_mc_state();
|
||||
bool unpack_last_state();
|
||||
|
@ -269,6 +270,7 @@ class Collator final : public td::actor::Actor {
|
|||
bool check_prev_block_exact(const BlockIdExt& listed, const BlockIdExt& prev);
|
||||
bool check_this_shard_mc_info();
|
||||
bool request_neighbor_msg_queues();
|
||||
bool request_out_msg_queue_size();
|
||||
void update_max_lt(ton::LogicalTime lt);
|
||||
bool is_masterchain() const {
|
||||
return shard_.is_masterchain();
|
||||
|
@ -279,10 +281,6 @@ class Collator final : public td::actor::Actor {
|
|||
void after_get_external_messages(td::Result<std::vector<Ref<ExtMessage>>> res);
|
||||
td::Result<bool> register_external_message_cell(Ref<vm::Cell> ext_msg, const ExtMessage::Hash& ext_hash);
|
||||
// td::Result<bool> register_external_message(td::Slice ext_msg_boc);
|
||||
td::Result<bool> register_ihr_message_cell(Ref<vm::Cell> ihr_msg);
|
||||
td::Result<bool> register_ihr_message(td::Slice ihr_msg_boc);
|
||||
td::Result<bool> register_shard_signatures_cell(Ref<vm::Cell> shard_blk_signatures);
|
||||
td::Result<bool> register_shard_signatures(td::Slice shard_blk_signatures_boc);
|
||||
void register_new_msg(block::NewOutMsg msg);
|
||||
void register_new_msgs(block::transaction::Transaction& trans);
|
||||
bool process_new_messages(bool enqueue_only = false);
|
||||
|
@ -296,7 +294,7 @@ class Collator final : public td::actor::Actor {
|
|||
bool enqueue_message(block::NewOutMsg msg, td::RefInt256 fwd_fees_remaining, ton::LogicalTime enqueued_lt);
|
||||
bool enqueue_transit_message(Ref<vm::Cell> msg, Ref<vm::Cell> old_msg_env, ton::AccountIdPrefixFull prev_prefix,
|
||||
ton::AccountIdPrefixFull cur_prefix, ton::AccountIdPrefixFull dest_prefix,
|
||||
td::RefInt256 fwd_fee_remaining, ton::LogicalTime enqueued_lt);
|
||||
td::RefInt256 fwd_fee_remaining);
|
||||
bool delete_out_msg_queue_msg(td::ConstBitPtr key);
|
||||
bool insert_in_msg(Ref<vm::Cell> in_msg);
|
||||
bool insert_out_msg(Ref<vm::Cell> out_msg);
|
||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -102,7 +102,7 @@ void ExtMessageQ::run_message(td::BufferSlice data, block::SizeLimitsConfig::Ext
|
|||
|
||||
run_fetch_account_state(
|
||||
wc, addr, manager,
|
||||
[promise = std::move(promise), msg_root = root, wc,
|
||||
[promise = std::move(promise), msg_root = root, wc, addr,
|
||||
M](td::Result<std::tuple<td::Ref<vm::CellSlice>, UnixTime, LogicalTime, std::unique_ptr<block::ConfigInfo>>>
|
||||
res) mutable {
|
||||
if (res.is_error()) {
|
||||
|
@ -114,7 +114,8 @@ void ExtMessageQ::run_message(td::BufferSlice data, block::SizeLimitsConfig::Ext
|
|||
auto utime = std::get<1>(tuple);
|
||||
auto lt = std::get<2>(tuple);
|
||||
auto config = std::move(std::get<3>(tuple));
|
||||
if (!acc.unpack(shard_acc, {}, utime, false)) {
|
||||
bool special = wc == masterchainId && config->is_special_smartcontract(addr);
|
||||
if (!acc.unpack(shard_acc, utime, special)) {
|
||||
promise.set_error(td::Status::Error(PSLICE() << "Failed to unpack account state"));
|
||||
} else {
|
||||
auto status = run_message_on_account(wc, &acc, utime, lt + 1, msg_root, std::move(config));
|
||||
|
@ -155,6 +156,7 @@ td::Status ExtMessageQ::run_message_on_account(ton::WorkchainId wc,
|
|||
}
|
||||
compute_phase_cfg_.libraries = std::make_unique<vm::Dictionary>(config->get_libraries_root(), 256);
|
||||
compute_phase_cfg_.with_vm_log = true;
|
||||
compute_phase_cfg_.stop_on_accept_message = true;
|
||||
|
||||
auto res = Collator::impl_create_ordinary_transaction(msg_root, acc, utime, lt,
|
||||
&storage_phase_cfg_, &compute_phase_cfg_,
|
||||
|
|
|
@ -39,8 +39,9 @@ namespace ton {
|
|||
|
||||
namespace validator {
|
||||
|
||||
td::actor::ActorOwn<Db> create_db_actor(td::actor::ActorId<ValidatorManager> manager, std::string db_root_) {
|
||||
return td::actor::create_actor<RootDb>("db", manager, db_root_);
|
||||
td::actor::ActorOwn<Db> create_db_actor(td::actor::ActorId<ValidatorManager> manager, std::string db_root_,
|
||||
td::Ref<ValidatorManagerOptions> opts) {
|
||||
return td::actor::create_actor<RootDb>("db", manager, db_root_, opts);
|
||||
}
|
||||
|
||||
td::actor::ActorOwn<LiteServerCache> create_liteserver_cache_actor(td::actor::ActorId<ValidatorManager> manager,
|
||||
|
@ -202,10 +203,12 @@ void run_validate_query(ShardIdFull shard, BlockIdExt min_masterchain_block_id,
|
|||
}
|
||||
}
|
||||
bool is_fake = mode & ValidateMode::fake;
|
||||
td::actor::create_actor<ValidateQuery>(
|
||||
PSTRING() << (is_fake ? "fakevalidate" : "validateblock") << shard.to_str() << ":" << (seqno + 1), shard,
|
||||
min_masterchain_block_id, std::move(prev), std::move(candidate), std::move(validator_set), std::move(manager),
|
||||
timeout, std::move(promise), mode)
|
||||
static std::atomic<size_t> idx;
|
||||
td::actor::create_actor<ValidateQuery>(PSTRING() << (is_fake ? "fakevalidate" : "validateblock") << shard.to_str()
|
||||
<< ":" << (seqno + 1) << "#" << idx.fetch_add(1),
|
||||
shard, min_masterchain_block_id, std::move(prev), std::move(candidate),
|
||||
std::move(validator_set), std::move(manager), timeout, std::move(promise),
|
||||
mode)
|
||||
.release();
|
||||
}
|
||||
|
||||
|
|
|
@ -505,20 +505,7 @@ void LiteQuery::perform_sendMessage(td::BufferSlice data) {
|
|||
}
|
||||
|
||||
void LiteQuery::get_block_handle_checked(BlockIdExt blkid, td::Promise<ConstBlockHandle> promise) {
|
||||
auto P = td::PromiseCreator::lambda(
|
||||
[promise = std::move(promise)](td::Result<BlockHandle> R) mutable {
|
||||
if (R.is_error()) {
|
||||
promise.set_error(R.move_as_error());
|
||||
} else {
|
||||
auto handle = R.move_as_ok();
|
||||
if (handle->is_applied()) {
|
||||
promise.set_result(std::move(handle));
|
||||
} else {
|
||||
promise.set_error(td::Status::Error(ErrorCode::notready, "block is not applied"));
|
||||
}
|
||||
}
|
||||
});
|
||||
td::actor::send_closure(manager_, &ValidatorManager::get_block_handle, blkid, false, std::move(P));
|
||||
td::actor::send_closure(manager_, &ValidatorManager::get_block_handle_for_litequery, blkid, std::move(promise));
|
||||
}
|
||||
|
||||
bool LiteQuery::request_mc_block_data(BlockIdExt blkid) {
|
||||
|
@ -1047,7 +1034,8 @@ bool LiteQuery::make_state_root_proof(Ref<vm::Cell>& proof, Ref<vm::Cell> state_
|
|||
vm::MerkleProofBuilder pb{std::move(block_root)};
|
||||
block::gen::Block::Record blk;
|
||||
block::gen::BlockInfo::Record info;
|
||||
if (!(tlb::unpack_cell(pb.root(), blk) && tlb::unpack_cell(blk.info, info))) {
|
||||
if (!(tlb::unpack_cell(pb.root(), blk) && tlb::unpack_cell(blk.info, info) &&
|
||||
block::gen::BlkPrevInfo(info.after_merge).validate_ref(info.prev_ref))) {
|
||||
return fatal_error("cannot unpack block header");
|
||||
}
|
||||
vm::CellSlice upd_cs{vm::NoVmSpec(), blk.state_update};
|
||||
|
@ -1497,17 +1485,12 @@ void LiteQuery::continue_getTransactions(unsigned remaining, bool exact) {
|
|||
LOG(DEBUG) << "sending get_block_by_lt_from_db() query to manager for " << acc_workchain_ << ":" << acc_addr_.to_hex()
|
||||
<< " " << trans_lt_;
|
||||
td::actor::send_closure_later(
|
||||
manager_, &ValidatorManager::get_block_by_lt_from_db, ton::extract_addr_prefix(acc_workchain_, acc_addr_),
|
||||
manager_, &ValidatorManager::get_block_by_lt_from_db_for_litequery, ton::extract_addr_prefix(acc_workchain_, acc_addr_),
|
||||
trans_lt_, [Self = actor_id(this), remaining, manager = manager_](td::Result<ConstBlockHandle> res) {
|
||||
if (res.is_error()) {
|
||||
td::actor::send_closure(Self, &LiteQuery::abort_getTransactions, res.move_as_error(), ton::BlockIdExt{});
|
||||
} else {
|
||||
auto handle = res.move_as_ok();
|
||||
if (!handle->is_applied()) {
|
||||
td::actor::send_closure(Self, &LiteQuery::abort_getTransactions, td::Status::Error(ErrorCode::notready, "block is not applied"),
|
||||
ton::BlockIdExt{});
|
||||
return;
|
||||
}
|
||||
LOG(DEBUG) << "requesting data for block " << handle->id().to_str();
|
||||
td::actor::send_closure_later(manager, &ValidatorManager::get_block_data_from_db, handle,
|
||||
[Self, blkid = handle->id(), remaining](td::Result<Ref<BlockData>> res) {
|
||||
|
@ -1846,10 +1829,6 @@ void LiteQuery::perform_lookupBlock(BlockId blkid, int mode, LogicalTime lt, Uni
|
|||
td::actor::send_closure(Self, &LiteQuery::abort_query, res.move_as_error());
|
||||
} else {
|
||||
auto handle = res.move_as_ok();
|
||||
if (!handle->is_applied()) {
|
||||
td::actor::send_closure(Self, &LiteQuery::abort_query, td::Status::Error(ErrorCode::notready, "block is not applied"));
|
||||
return;
|
||||
}
|
||||
LOG(DEBUG) << "requesting data for block " << handle->id().to_str();
|
||||
td::actor::send_closure_later(manager, &ValidatorManager::get_block_data_from_db, handle,
|
||||
[Self, blkid = handle->id(), mode](td::Result<Ref<BlockData>> res) {
|
||||
|
@ -1865,13 +1844,14 @@ void LiteQuery::perform_lookupBlock(BlockId blkid, int mode, LogicalTime lt, Uni
|
|||
|
||||
ton::AccountIdPrefixFull pfx{blkid.workchain, blkid.shard};
|
||||
if (mode & 2) {
|
||||
td::actor::send_closure_later(manager_, &ValidatorManager::get_block_by_lt_from_db, pfx, lt, std::move(P));
|
||||
td::actor::send_closure_later(manager_, &ValidatorManager::get_block_by_lt_from_db_for_litequery, pfx, lt,
|
||||
std::move(P));
|
||||
} else if (mode & 4) {
|
||||
td::actor::send_closure_later(manager_, &ValidatorManager::get_block_by_unix_time_from_db, pfx, utime,
|
||||
td::actor::send_closure_later(manager_, &ValidatorManager::get_block_by_unix_time_from_db_for_litequery, pfx, utime,
|
||||
std::move(P));
|
||||
} else {
|
||||
td::actor::send_closure_later(manager_, &ValidatorManager::get_block_by_seqno_from_db, pfx, blkid.seqno,
|
||||
std::move(P));
|
||||
td::actor::send_closure_later(manager_, &ValidatorManager::get_block_by_seqno_from_db_for_litequery, pfx,
|
||||
blkid.seqno, std::move(P));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -2629,7 +2609,7 @@ void LiteQuery::perform_getShardBlockProof(BlockIdExt blkid) {
|
|||
}
|
||||
AccountIdPrefixFull pfx{masterchainId, shardIdAll};
|
||||
td::actor::send_closure_later(
|
||||
manager, &ValidatorManager::get_block_by_seqno_from_db, pfx, handle->masterchain_ref_block(),
|
||||
manager, &ValidatorManager::get_block_by_seqno_from_db_for_litequery, pfx, handle->masterchain_ref_block(),
|
||||
[Self, manager](td::Result<ConstBlockHandle> R) {
|
||||
if (R.is_error()) {
|
||||
td::actor::send_closure(Self, &LiteQuery::abort_query, R.move_as_error());
|
||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -195,6 +195,7 @@ class ValidateQuery : public td::actor::Actor {
|
|||
ton::LogicalTime prev_key_block_lt_;
|
||||
std::unique_ptr<block::BlockLimits> block_limits_;
|
||||
std::unique_ptr<block::BlockLimitStatus> block_limit_status_;
|
||||
td::uint64 total_gas_used_{0}, total_special_gas_used_{0};
|
||||
|
||||
LogicalTime start_lt_, end_lt_;
|
||||
UnixTime prev_now_{~0u}, now_{~0u};
|
||||
|
@ -344,8 +345,7 @@ class ValidateQuery : public td::actor::Actor {
|
|||
td::Bits256& msg_hash);
|
||||
bool check_in_queue();
|
||||
bool check_delivered_dequeued();
|
||||
std::unique_ptr<block::Account> make_account_from(td::ConstBitPtr addr, Ref<vm::CellSlice> account,
|
||||
Ref<vm::CellSlice> extra);
|
||||
std::unique_ptr<block::Account> make_account_from(td::ConstBitPtr addr, Ref<vm::CellSlice> account);
|
||||
std::unique_ptr<block::Account> unpack_account(td::ConstBitPtr addr);
|
||||
bool check_one_transaction(block::Account& account, LogicalTime lt, Ref<vm::Cell> trans_root, bool is_first,
|
||||
bool is_last);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue