mirror of
https://github.com/ton-blockchain/ton
synced 2025-02-12 19:22:37 +00:00
too big catchain workaround
This commit is contained in:
parent
d17186896b
commit
b73b057e08
4 changed files with 40 additions and 0 deletions
|
@ -1193,6 +1193,10 @@ td::Status ValidatorEngine::load_global_config() {
|
||||||
validator_options_.write().add_unsafe_resync_catchain(seq);
|
validator_options_.write().add_unsafe_resync_catchain(seq);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (zero_state.file_hash.to_hex() == "5E994FCF4D425C0A6CE6A792594B7173205F740A39CD56F537DEFD28B48A0F6E") {
|
||||||
|
validator_options_.write().add_unsafe_catchain_rotate(3081761, 48452, 1);
|
||||||
|
}
|
||||||
|
|
||||||
std::vector<ton::BlockIdExt> h;
|
std::vector<ton::BlockIdExt> h;
|
||||||
for (auto &x : conf.validator_->hardforks_) {
|
for (auto &x : conf.validator_->hardforks_) {
|
||||||
auto b = ton::create_block_id(x);
|
auto b = ton::create_block_id(x);
|
||||||
|
|
|
@ -1705,9 +1705,19 @@ void ValidatorManagerImpl::update_shards() {
|
||||||
std::map<ValidatorSessionId, td::actor::ActorOwn<ValidatorGroup>> new_validator_groups_;
|
std::map<ValidatorSessionId, td::actor::ActorOwn<ValidatorGroup>> new_validator_groups_;
|
||||||
std::map<ValidatorSessionId, td::actor::ActorOwn<ValidatorGroup>> new_next_validator_groups_;
|
std::map<ValidatorSessionId, td::actor::ActorOwn<ValidatorGroup>> new_next_validator_groups_;
|
||||||
|
|
||||||
|
bool force_recover = false;
|
||||||
|
{
|
||||||
|
auto val_set = last_masterchain_state_->get_validator_set(ShardIdFull{masterchainId});
|
||||||
|
auto r = opts_->check_unsafe_catchain_rotate(last_masterchain_seqno_, val_set->get_catchain_seqno());
|
||||||
|
force_recover = r > 0;
|
||||||
|
}
|
||||||
|
|
||||||
if (allow_validate_) {
|
if (allow_validate_) {
|
||||||
for (auto &desc : new_shards) {
|
for (auto &desc : new_shards) {
|
||||||
auto shard = desc.first;
|
auto shard = desc.first;
|
||||||
|
if (force_recover && !desc.first.is_masterchain()) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
auto prev = desc.second;
|
auto prev = desc.second;
|
||||||
for (auto &p : prev) {
|
for (auto &p : prev) {
|
||||||
CHECK(p.is_valid());
|
CHECK(p.is_valid());
|
||||||
|
@ -1720,6 +1730,18 @@ void ValidatorManagerImpl::update_shards() {
|
||||||
if (!validator_id.is_zero()) {
|
if (!validator_id.is_zero()) {
|
||||||
auto val_group_id = get_validator_set_id(shard, val_set, opts_hash);
|
auto val_group_id = get_validator_set_id(shard, val_set, opts_hash);
|
||||||
|
|
||||||
|
if (force_recover) {
|
||||||
|
auto r = opts_->check_unsafe_catchain_rotate(last_masterchain_seqno_, val_set->get_catchain_seqno());
|
||||||
|
if (r) {
|
||||||
|
td::uint8 b[36];
|
||||||
|
td::MutableSlice x{b, 36};
|
||||||
|
x.copy_from(val_group_id.as_slice());
|
||||||
|
x.remove_prefix(32);
|
||||||
|
CHECK(x.size() == 4);
|
||||||
|
x.copy_from(td::Slice(reinterpret_cast<const td::uint8 *>(&r), 4));
|
||||||
|
val_group_id = sha256_bits256(td::Slice(b, 36));
|
||||||
|
}
|
||||||
|
}
|
||||||
// DIRTY. But we don't want to create hardfork now
|
// DIRTY. But we don't want to create hardfork now
|
||||||
// TODO! DELETE IT LATER
|
// TODO! DELETE IT LATER
|
||||||
//if (last_masterchain_seqno_ >= 2904932 && val_set->get_catchain_seqno() == 44896) {
|
//if (last_masterchain_seqno_ >= 2904932 && val_set->get_catchain_seqno() == 44896) {
|
||||||
|
|
|
@ -94,6 +94,14 @@ struct ValidatorManagerOptionsImpl : public ValidatorManagerOptions {
|
||||||
bool check_unsafe_resync_allowed(CatchainSeqno seqno) const override {
|
bool check_unsafe_resync_allowed(CatchainSeqno seqno) const override {
|
||||||
return unsafe_catchains_.count(seqno) > 0;
|
return unsafe_catchains_.count(seqno) > 0;
|
||||||
}
|
}
|
||||||
|
td::uint32 check_unsafe_catchain_rotate(BlockSeqno seqno, CatchainSeqno cc_seqno) const override {
|
||||||
|
auto it = unsafe_catchain_rotates_.find(cc_seqno);
|
||||||
|
if (it == unsafe_catchain_rotates_.end()) {
|
||||||
|
return 0;
|
||||||
|
} else {
|
||||||
|
return it->second.first <= seqno ? it->second.second : 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void set_zero_block_id(BlockIdExt block_id) override {
|
void set_zero_block_id(BlockIdExt block_id) override {
|
||||||
zero_block_id_ = block_id;
|
zero_block_id_ = block_id;
|
||||||
|
@ -135,6 +143,9 @@ struct ValidatorManagerOptionsImpl : public ValidatorManagerOptions {
|
||||||
void add_unsafe_resync_catchain(CatchainSeqno seqno) override {
|
void add_unsafe_resync_catchain(CatchainSeqno seqno) override {
|
||||||
unsafe_catchains_.insert(seqno);
|
unsafe_catchains_.insert(seqno);
|
||||||
}
|
}
|
||||||
|
void add_unsafe_catchain_rotate(BlockSeqno seqno, CatchainSeqno cc_seqno, td::uint32 value) override {
|
||||||
|
unsafe_catchain_rotates_[cc_seqno] = std::make_pair(seqno, value);
|
||||||
|
}
|
||||||
|
|
||||||
ValidatorManagerOptionsImpl *make_copy() const override {
|
ValidatorManagerOptionsImpl *make_copy() const override {
|
||||||
return new ValidatorManagerOptionsImpl(*this);
|
return new ValidatorManagerOptionsImpl(*this);
|
||||||
|
@ -171,6 +182,7 @@ struct ValidatorManagerOptionsImpl : public ValidatorManagerOptions {
|
||||||
std::vector<BlockIdExt> hardforks_;
|
std::vector<BlockIdExt> hardforks_;
|
||||||
td::uint32 db_depth_ = 2;
|
td::uint32 db_depth_ = 2;
|
||||||
std::set<CatchainSeqno> unsafe_catchains_;
|
std::set<CatchainSeqno> unsafe_catchains_;
|
||||||
|
std::map<CatchainSeqno, std::pair<BlockSeqno, td::uint32>> unsafe_catchain_rotates_;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace validator
|
} // namespace validator
|
||||||
|
|
|
@ -69,6 +69,7 @@ struct ValidatorManagerOptions : public td::CntObject {
|
||||||
return 86400;
|
return 86400;
|
||||||
}
|
}
|
||||||
virtual bool check_unsafe_resync_allowed(CatchainSeqno seqno) const = 0;
|
virtual bool check_unsafe_resync_allowed(CatchainSeqno seqno) const = 0;
|
||||||
|
virtual td::uint32 check_unsafe_catchain_rotate(BlockSeqno seqno, CatchainSeqno cc_seqno) const = 0;
|
||||||
|
|
||||||
virtual void set_zero_block_id(BlockIdExt block_id) = 0;
|
virtual void set_zero_block_id(BlockIdExt block_id) = 0;
|
||||||
virtual void set_init_block_id(BlockIdExt block_id) = 0;
|
virtual void set_init_block_id(BlockIdExt block_id) = 0;
|
||||||
|
@ -83,6 +84,7 @@ struct ValidatorManagerOptions : public td::CntObject {
|
||||||
virtual void set_hardforks(std::vector<BlockIdExt> hardforks) = 0;
|
virtual void set_hardforks(std::vector<BlockIdExt> hardforks) = 0;
|
||||||
virtual void set_filedb_depth(td::uint32 value) = 0;
|
virtual void set_filedb_depth(td::uint32 value) = 0;
|
||||||
virtual void add_unsafe_resync_catchain(CatchainSeqno seqno) = 0;
|
virtual void add_unsafe_resync_catchain(CatchainSeqno seqno) = 0;
|
||||||
|
virtual void add_unsafe_catchain_rotate(BlockSeqno seqno, CatchainSeqno cc_seqno, td::uint32 value) = 0;
|
||||||
|
|
||||||
static td::Ref<ValidatorManagerOptions> create(
|
static td::Ref<ValidatorManagerOptions> create(
|
||||||
BlockIdExt zero_block_id, BlockIdExt init_block_id,
|
BlockIdExt zero_block_id, BlockIdExt init_block_id,
|
||||||
|
|
Loading…
Reference in a new issue