Skip to content

Commit d268ac0

Browse files
authored
Set block id in ConfigInfo::extract_config (#1780)
This fixes calculating prev_blocks_info in tonlib and similar places
1 parent da37096 commit d268ac0

File tree

11 files changed

+35
-42
lines changed

11 files changed

+35
-42
lines changed

crypto/block/check-proof.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -492,7 +492,7 @@ td::Status BlockProofLink::validate(td::uint32* save_utime) const {
492492
return td::Status::Error("BlockProofLink contains a state proof for "s + from.to_str() +
493493
" with incorrect root hash");
494494
}
495-
TRY_RESULT(config, block::ConfigInfo::extract_config(vstate_root, block::ConfigInfo::needPrevBlocks));
495+
TRY_RESULT(config, block::ConfigInfo::extract_config(vstate_root, from, block::ConfigInfo::needPrevBlocks));
496496
if (!config->check_old_mc_block_id(to, true)) {
497497
return td::Status::Error("cannot check that "s + to.to_str() + " is indeed a previous masterchain block of " +
498498
from.to_str() + " using the presented Merkle proof of masterchain state");

crypto/block/mc-config.cpp

Lines changed: 5 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -92,22 +92,16 @@ td::Result<std::unique_ptr<Config>> Config::extract_from_state(Ref<vm::Cell> mc_
9292
return unpack_config(std::move(extra.config), mode);
9393
}
9494

95-
td::Result<std::unique_ptr<ConfigInfo>> ConfigInfo::extract_config(std::shared_ptr<vm::StaticBagOfCellsDb> static_boc,
96-
int mode) {
97-
TRY_RESULT(rc, static_boc->get_root_count());
98-
if (rc != 1) {
99-
return td::Status::Error(-668, "Masterchain state BoC is invalid");
100-
}
101-
TRY_RESULT(root, static_boc->get_root_cell(0));
102-
return extract_config(std::move(root), mode);
103-
}
104-
105-
td::Result<std::unique_ptr<ConfigInfo>> ConfigInfo::extract_config(Ref<vm::Cell> mc_state_root, int mode) {
95+
td::Result<std::unique_ptr<ConfigInfo>> ConfigInfo::extract_config(Ref<vm::Cell> mc_state_root,
96+
ton::BlockIdExt mc_block_id, int mode) {
10697
if (mc_state_root.is_null()) {
10798
return td::Status::Error("configuration state root cell is null");
10899
}
109100
auto config = std::unique_ptr<ConfigInfo>{new ConfigInfo(std::move(mc_state_root), mode)};
110101
TRY_STATUS(config->unpack_wrapped());
102+
if (!config->set_block_id_ext(mc_block_id)) {
103+
return td::Status::Error("failed to set mc block id");
104+
}
111105
return std::move(config);
112106
}
113107

crypto/block/mc-config.h

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -775,9 +775,8 @@ class ConfigInfo : public Config, public ShardConfig {
775775
std::vector<ton::ValidatorDescr> compute_validator_set_cc(ton::ShardIdFull shard, ton::UnixTime time,
776776
ton::CatchainSeqno* cc_seqno_delta = nullptr) const;
777777
td::Result<Ref<vm::Tuple>> get_prev_blocks_info() const;
778-
static td::Result<std::unique_ptr<ConfigInfo>> extract_config(std::shared_ptr<vm::StaticBagOfCellsDb> static_boc,
779-
int mode = 0);
780-
static td::Result<std::unique_ptr<ConfigInfo>> extract_config(Ref<vm::Cell> mc_state_root, int mode = 0);
778+
static td::Result<std::unique_ptr<ConfigInfo>> extract_config(Ref<vm::Cell> mc_state_root,
779+
ton::BlockIdExt mc_block_id, int mode = 0);
781780

782781
private:
783782
ConfigInfo(Ref<vm::Cell> mc_state_root, int _mode = 0);

tonlib/tonlib/LastConfig.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -93,8 +93,9 @@ td::Status LastConfig::process_config_proof(ton::ton_api::object_ptr<ton::lite_a
9393
}
9494
TRY_RESULT(state, block::check_extract_state_proof(blkid, raw_config->state_proof_.as_slice(),
9595
raw_config->config_proof_.as_slice()));
96-
TRY_RESULT(config, block::ConfigInfo::extract_config(
97-
std::move(state), block::ConfigInfo::needPrevBlocks | block::ConfigInfo::needCapabilities));
96+
TRY_RESULT(config,
97+
block::ConfigInfo::extract_config(
98+
std::move(state), blkid, block::ConfigInfo::needPrevBlocks | block::ConfigInfo::needCapabilities));
9899

99100
for (auto i : params_) {
100101
VLOG(last_config) << "ConfigParam(" << i << ") = ";

tonlib/tonlib/TonlibClient.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2168,7 +2168,7 @@ class RunEmulator : public TonlibQueryActor {
21682168
}
21692169

21702170
try {
2171-
auto r_config = block::ConfigInfo::extract_config(mc_state_root_, 0b11'11111111);
2171+
auto r_config = block::ConfigInfo::extract_config(mc_state_root_, block_id_.mc, 0b11'11111111);
21722172
if (r_config.is_error()) {
21732173
check(r_config.move_as_error());
21742174
return;

validator/collator-node/collator-node.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -465,7 +465,8 @@ td::Status CollatorNode::check_mc_config() {
465465
}
466466
TRY_RESULT_PREFIX(
467467
config,
468-
block::ConfigInfo::extract_config(last_masterchain_state_->root_cell(), block::ConfigInfo::needCapabilities),
468+
block::ConfigInfo::extract_config(last_masterchain_state_->root_cell(), last_masterchain_state_->get_block_id(),
469+
block::ConfigInfo::needCapabilities),
469470
"cannot unpack masterchain config");
470471
if (config->get_global_version() > Collator::supported_version()) {
471472
return td::Status::Error(PSTRING() << "unsupported global version " << config->get_global_version()

validator/impl/collator.cpp

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -856,7 +856,7 @@ void Collator::after_get_shard_state_optimistic(td::Result<Ref<ShardState>> res,
856856
*/
857857
bool Collator::unpack_last_mc_state() {
858858
auto res = block::ConfigInfo::extract_config(
859-
mc_state_root,
859+
mc_state_root, mc_block_id_,
860860
block::ConfigInfo::needShardHashes | block::ConfigInfo::needLibraries | block::ConfigInfo::needValidatorSet |
861861
block::ConfigInfo::needWorkchainInfo | block::ConfigInfo::needCapabilities |
862862
block::ConfigInfo::needPrevBlocks |
@@ -868,7 +868,6 @@ bool Collator::unpack_last_mc_state() {
868868
}
869869
config_ = res.move_as_ok();
870870
CHECK(config_);
871-
config_->set_block_id_ext(mc_block_id_);
872871
global_id_ = config_->get_global_blockchain_id();
873872
ihr_enabled_ = config_->ihr_enabled();
874873
create_stats_enabled_ = config_->create_stats_enabled();

validator/impl/liteserver.cpp

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -917,7 +917,8 @@ void LiteQuery::continue_getLibraries(Ref<ton::validator::MasterchainState> mc_s
917917
mc_state_ = Ref<MasterchainStateQ>(std::move(mc_state));
918918
CHECK(mc_state_.not_null());
919919

920-
auto rconfig = block::ConfigInfo::extract_config(mc_state_->root_cell(), block::ConfigInfo::needLibraries);
920+
auto rconfig = block::ConfigInfo::extract_config(mc_state_->root_cell(), mc_state_->get_block_id(),
921+
block::ConfigInfo::needLibraries);
921922
if (rconfig.is_error()) {
922923
fatal_error("cannot extract library list block configuration from masterchain state");
923924
return;
@@ -1251,9 +1252,10 @@ bool LiteQuery::make_shard_info_proof(Ref<vm::Cell>& proof, BlockIdExt& blkid, A
12511252
return true;
12521253
}
12531254

1254-
bool LiteQuery::make_ancestor_block_proof(Ref<vm::Cell>& proof, Ref<vm::Cell> state_root, const BlockIdExt& old_blkid) {
1255-
vm::MerkleProofBuilder mpb{std::move(state_root)};
1256-
auto rconfig = block::ConfigInfo::extract_config(mpb.root(), block::ConfigInfo::needPrevBlocks);
1255+
bool LiteQuery::make_ancestor_block_proof(Ref<vm::Cell>& proof, Ref<MasterchainState> mc_state, const BlockIdExt& old_blkid) {
1256+
vm::MerkleProofBuilder mpb{mc_state->root_cell()};
1257+
auto rconfig =
1258+
block::ConfigInfo::extract_config(mpb.root(), mc_state->get_block_id(), block::ConfigInfo::needPrevBlocks);
12571259
if (rconfig.is_error()) {
12581260
return fatal_error(
12591261
"cannot extract previous block configuration from masterchain state while constructing Merkle proof for "s +
@@ -1319,13 +1321,12 @@ void LiteQuery::finish_getAccountState(td::BufferSlice shard_proof) {
13191321
vm::AugmentedDictionary accounts_dict{vm::load_cell_slice_ref(sstate.accounts), 256, block::tlb::aug_ShardAccounts};
13201322
auto acc_csr = accounts_dict.lookup(acc_addr_);
13211323
if (mode_ & 0x80000000) {
1322-
auto config = block::ConfigInfo::extract_config(mc_state_->root_cell(), 0xFFFF);
1324+
auto config = block::ConfigInfo::extract_config(mc_state_->root_cell(), mc_state_->get_block_id(), 0xFFFF);
13231325
if (config.is_error()) {
13241326
fatal_error(config.move_as_error());
13251327
return;
13261328
}
13271329
auto rconfig = config.move_as_ok();
1328-
rconfig->set_block_id_ext(mc_state_->get_block_id());
13291330
acc_state_promise_.set_value(std::make_tuple(
13301331
std::move(acc_csr), sstate.gen_utime, sstate.gen_lt, std::move(rconfig)
13311332
));
@@ -1502,7 +1503,7 @@ void LiteQuery::finish_runSmcMethod(td::BufferSlice shard_proof, td::BufferSlice
15021503
LOG(DEBUG) << "creating VM with gas limit " << gas_limit;
15031504
// **** INIT VM ****
15041505
auto r_config = block::ConfigInfo::extract_config(
1505-
mc_state_->root_cell(),
1506+
mc_state_->root_cell(), mc_state_->get_block_id(),
15061507
block::ConfigInfo::needLibraries | block::ConfigInfo::needCapabilities | block::ConfigInfo::needPrevBlocks);
15071508
if (r_config.is_error()) {
15081509
fatal_error(r_config.move_as_error());
@@ -1905,7 +1906,7 @@ void LiteQuery::continue_getConfigParams(int mode, std::vector<int> param_list)
19051906
if (mode & block::ConfigInfo::needPrevBlocks) {
19061907
mode |= block::ConfigInfo::needCapabilities;
19071908
}
1908-
auto res = block::ConfigInfo::extract_config(mpb.root(), mode);
1909+
auto res = block::ConfigInfo::extract_config(mpb.root(), keyblk ? base_blk_id_ : mc_state_->get_block_id(), mode);
19091910
if (res.is_error()) {
19101911
fatal_error(res.move_as_error());
19111912
return;
@@ -3045,7 +3046,7 @@ bool LiteQuery::construct_proof_link_back_cont(ton::BlockIdExt cur, ton::BlockId
30453046
return fatal_error("cannot construct proof for state of masterchain block "s + cur.to_str());
30463047
}
30473048
// construct proof that `next` is listed in OldMcBlocksInfo of `mc_state_`
3048-
if (!make_ancestor_block_proof(state_proof, mc_state_->root_cell(), next)) {
3049+
if (!make_ancestor_block_proof(state_proof, mc_state_, next)) {
30493050
return fatal_error("cannot prove that "s + next.to_str() +
30503051
" is in the previous block set of the masterchain state of " + cur.to_str());
30513052
}

validator/impl/liteserver.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -221,7 +221,7 @@ class LiteQuery : public td::actor::Actor {
221221
bool make_shard_info_proof(Ref<vm::Cell>& proof, Ref<block::McShardHash>& info, ShardIdFull shard, bool exact = true);
222222
bool make_shard_info_proof(Ref<vm::Cell>& proof, Ref<block::McShardHash>& info, AccountIdPrefixFull prefix);
223223
bool make_shard_info_proof(Ref<vm::Cell>& proof, BlockIdExt& blkid, AccountIdPrefixFull prefix);
224-
bool make_ancestor_block_proof(Ref<vm::Cell>& proof, Ref<vm::Cell> state_root, const BlockIdExt& old_blkid);
224+
bool make_ancestor_block_proof(Ref<vm::Cell>& proof, Ref<MasterchainState> mc_state, const BlockIdExt& old_blkid);
225225
};
226226

227227
} // namespace validator

validator/impl/shard.cpp

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -376,17 +376,16 @@ td::Status MasterchainStateQ::mc_init() {
376376

377377
td::Status MasterchainStateQ::mc_reinit() {
378378
auto res = block::ConfigInfo::extract_config(
379-
root_cell(), block::ConfigInfo::needStateRoot | block::ConfigInfo::needValidatorSet |
380-
block::ConfigInfo::needShardHashes | block::ConfigInfo::needPrevBlocks |
381-
block::ConfigInfo::needWorkchainInfo);
379+
root_cell(), blkid,
380+
block::ConfigInfo::needStateRoot | block::ConfigInfo::needValidatorSet | block::ConfigInfo::needShardHashes |
381+
block::ConfigInfo::needPrevBlocks | block::ConfigInfo::needWorkchainInfo);
382382
cur_validators_.reset();
383383
next_validators_.reset();
384384
if (res.is_error()) {
385385
return res.move_as_error();
386386
}
387387
config_ = res.move_as_ok();
388388
CHECK(config_);
389-
CHECK(config_->set_block_id_ext(get_block_id()));
390389

391390
cur_validators_ = config_->get_cur_validator_set();
392391

0 commit comments

Comments
 (0)