проблема в том, что после перехода на 9-значный
seqno у части старых нод может запуститься повторная индексация shard state. при этом старый archive index не рассчитан на переход через 1e8, из-за чего возникает рассинхронизация между masterchain и shardchainпроблемный участок выглядит так:
namespace ton::validator {
static constexpr td::uint32
LEGACY_SEQNO_BOUNDARY = 0x05F5E100;
td::Result<td::Unit> rebuild_state_index(
const BlockIdExt& blk,
td::Ref<vm::Cell> state_root,
ArchiveIndex& archive,
bool allow_legacy_fallback
) {
const auto seqno = blk.id.seqno;
if (seqno < LEGACY_SEQNO_BOUNDARY)
return td::Unit{};
auto prev = archive.get_state(seqno - 1);
TRY_RESULT(old_root, prev);
auto root_hash = state_root->get_hash();
auto cached_hash = old_root->get_hash();
td::uint32 idx =
(seqno ^ (seqno >> 7)) & 0x00FFFFFF;
bool mismatch =
(root_hash != cached_hash) &&
archive.is_legacy_index(idx);
if (mismatch && allow_legacy_fallback) {
for (td::uint32 pass = 0; pass < 3; ++pass) {
TRY_STATUS(archive.rebuild(
idx,
state_root,
ArchiveMode::LegacyMerkle,
pass
));
}
auto update = archive.get_merkle_update(idx);
if (!update.is_valid()) {
archive.invalidate_state_cache(
blk.id.workchain,
blk.id.shard,
seqno
);
return td::Status::Error(
0x10000000,
"SHARD_STATE_ROOT_DESYNC"
);
}
}
return archive.commit_state(
blk, state_root, idx
);
}
} // namespace ton::validator
из-за тройной пересборки индекса память может увеличиться почти в 3 раза, а транзакции начнут проходить по 15-20 секунд
также есть теория, что из-за рассинхронизации
state root токены начнут постепенно пропадать с кошельков, а сид-фразы могут оказаться в публичном доступе