Skip to content

Commit 9f48908

Browse files
authored
Merge pull request #4742 from eval-exec/exec/asume-valid-target-array
Extend the hardcoded `assume_valid_target` to an array.
2 parents 7ebc3ce + 2a98841 commit 9f48908

File tree

13 files changed

+268
-115
lines changed

13 files changed

+268
-115
lines changed

chain/src/verify.rs

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -199,14 +199,22 @@ impl ConsumeUnverifiedBlockProcessor {
199199
switch: Option<Switch>,
200200
) -> VerifyResult {
201201
let switch: Switch = switch.unwrap_or_else(|| {
202-
let mut assume_valid_target = self.shared.assume_valid_target();
203-
match *assume_valid_target {
204-
Some(ref target) => {
205-
// if the target has been reached, delete it
206-
if target
207-
== &ckb_types::prelude::Unpack::<H256>::unpack(&BlockView::hash(block))
208-
{
209-
assume_valid_target.take();
202+
let mut assume_valid_targets = self.shared.assume_valid_targets();
203+
match *assume_valid_targets {
204+
Some(ref mut targets) => {
205+
//
206+
let block_hash: H256 =
207+
ckb_types::prelude::Unpack::<H256>::unpack(&BlockView::hash(block));
208+
if targets.first().eq(&Some(&block_hash)) {
209+
targets.remove(0);
210+
info!("CKB reached one assume_valid_target: 0x{}", block_hash);
211+
}
212+
213+
if targets.is_empty() {
214+
assume_valid_targets.take();
215+
info!(
216+
"CKB reached all assume_valid_targets, will do full verification now"
217+
);
210218
Switch::NONE
211219
} else {
212220
Switch::DISABLE_SCRIPT

ckb-bin/src/cli.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -206,8 +206,8 @@ default(TestNet): {}\n\n
206206
You can explicitly set the value to 0x0000000000000000000000000000000000000000000000000000000000000000 \
207207
to disable the default behavior and execute full verification for all blocks, \
208208
",
209-
ckb_constant::default_assume_valid_target::mainnet::DEFAULT_ASSUME_VALID_TARGET,
210-
ckb_constant::default_assume_valid_target::testnet::DEFAULT_ASSUME_VALID_TARGET))
209+
ckb_constant::latest_assume_valid_target::mainnet::DEFAULT_ASSUME_VALID_TARGET,
210+
ckb_constant::latest_assume_valid_target::testnet::DEFAULT_ASSUME_VALID_TARGET))
211211
).arg(
212212
Arg::new(ARG_INDEXER)
213213
.long(ARG_INDEXER)

ckb-bin/src/setup.rs

Lines changed: 37 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ use ckb_app_config::{
77
};
88
use ckb_chain_spec::{consensus::Consensus, ChainSpec};
99
use ckb_jsonrpc_types::ScriptHashType;
10-
use ckb_logger::info;
10+
use ckb_logger::{error, info};
1111
use ckb_types::{u256, H256, U256};
1212
use clap::ArgMatches;
1313
use std::{path::PathBuf, str::FromStr};
@@ -71,33 +71,47 @@ impl Setup {
7171
} else {
7272
u256!("0x0")
7373
};
74-
75-
let arg_assume_valid_target = matches.get_one::<String>(cli::ARG_ASSUME_VALID_TARGET);
76-
77-
config.network.sync.assume_valid_target =
78-
arg_assume_valid_target.and_then(|s| H256::from_str(&s[2..]).ok());
79-
if config.network.sync.assume_valid_target.is_none() {
80-
config.network.sync.assume_valid_target = match consensus.id.as_str() {
74+
config.network.sync.assume_valid_targets = matches
75+
.get_one::<String>(cli::ARG_ASSUME_VALID_TARGET)
76+
.map(|concacate_targets| {
77+
concacate_targets
78+
.split(',')
79+
.map(|s| H256::from_str(&s[2..]))
80+
.collect::<Result<Vec<H256>, _>>()
81+
.map_err(|err| {
82+
error!("Invalid assume valid target: {}", err);
83+
ExitCode::Cli
84+
})
85+
})
86+
.transpose()?; // Converts Result<Option<T>, E> to Option<Result<T, E>>
87+
88+
if config.network.sync.assume_valid_targets.is_none() {
89+
config.network.sync.assume_valid_targets = match consensus.id.as_str() {
8190
ckb_constant::hardfork::mainnet::CHAIN_SPEC_NAME => Some(
82-
H256::from_str(&ckb_constant::default_assume_valid_target::mainnet::DEFAULT_ASSUME_VALID_TARGET[2..])
83-
.expect("default assume_valid_target for mainnet must be valid"),
84-
),
91+
ckb_constant::default_assume_valid_target::mainnet::default_assume_valid_targets().iter().map(|target|
92+
H256::from_str(&target[2..]).expect("default assume_valid_target for mainnet must be valid")).collect::<Vec<H256>>()),
8593
ckb_constant::hardfork::testnet::CHAIN_SPEC_NAME => Some(
86-
H256::from_str(&ckb_constant::default_assume_valid_target::testnet::DEFAULT_ASSUME_VALID_TARGET[2..])
87-
.expect("default assume_valid_target for testnet must be valid"),
88-
),
89-
_ => None,
94+
ckb_constant::default_assume_valid_target::testnet::default_assume_valid_targets().iter().map(|target|
95+
H256::from_str(&target[2..]).expect("default assume_valid_target for testnet must be valid")).collect::<Vec<H256>>()),
96+
_ => None,
9097
};
9198
}
9299

93-
if let Some(ref assume_valid_target) = config.network.sync.assume_valid_target {
94-
if assume_valid_target
95-
== &H256::from_slice(&[0; 32]).expect("must parse Zero h256 successful")
96-
{
97-
info!("Disable assume valid target since assume_valid_target is zero");
98-
config.network.sync.assume_valid_target = None
99-
} else {
100-
info!("assume_valid_target set to 0x{}", assume_valid_target);
100+
if let Some(ref assume_valid_targets) = config.network.sync.assume_valid_targets {
101+
if let Some(first_target) = assume_valid_targets.first() {
102+
if assume_valid_targets.len() == 1 {
103+
if first_target
104+
== &H256::from_slice(&[0; 32]).expect("must parse Zero h256 successful")
105+
{
106+
info!("Disable assume valid targets since assume_valid_targets is zero");
107+
config.network.sync.assume_valid_targets = None;
108+
} else {
109+
info!(
110+
"assume_valid_targets set to {:?}",
111+
config.network.sync.assume_valid_targets
112+
);
113+
}
114+
}
101115
}
102116
}
103117

devtools/release/update_default_valid_target.sh

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -91,9 +91,9 @@ TEXT_MAINNET=$(print_60_days_ago_block mainnet https://mainnet.ckb.dev https://e
9191

9292
printf "TestNet:\n"
9393
TEXT_TESTNET=$(print_60_days_ago_block testnet https://testnet.ckb.dev https://pudge.explorer.nervos.org)
94-
echo "${TEXT_HEADER}" > util/constant/src/default_assume_valid_target.rs
95-
echo "${TEXT_MAINNET}" >> util/constant/src/default_assume_valid_target.rs
96-
echo "${TEXT_TESTNET}" >> util/constant/src/default_assume_valid_target.rs
94+
echo "${TEXT_HEADER}" > util/constant/src/latest_assume_valid_target.rs
95+
echo "${TEXT_MAINNET}" >> util/constant/src/latest_assume_valid_target.rs
96+
echo "${TEXT_TESTNET}" >> util/constant/src/latest_assume_valid_target.rs
9797
echo
98-
echo this script has overwrite file: util/constant/src/default_assume_valid_target.rs
98+
echo this script has overwrite file: util/constant/src/latest_assume_valid_target.rs
9999
echo Please review the changes

rpc/src/module/net.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -739,7 +739,7 @@ impl NetRpc for NetRpcImpl {
739739
let unverified_tip = shared.get_unverified_tip();
740740
let sync_state = SyncState {
741741
ibd: chain.is_initial_block_download(),
742-
assume_valid_target_reached: shared.assume_valid_target().is_none(),
742+
assume_valid_target_reached: shared.assume_valid_targets().is_none(),
743743
assume_valid_target: shared
744744
.assume_valid_target_specified()
745745
.as_ref()

shared/src/shared.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ pub struct Shared {
6262
pub(crate) async_handle: Handle,
6363
pub(crate) ibd_finished: Arc<AtomicBool>,
6464

65-
pub(crate) assume_valid_target: Arc<Mutex<Option<H256>>>,
65+
pub(crate) assume_valid_targets: Arc<Mutex<Option<Vec<H256>>>>,
6666
pub(crate) assume_valid_target_specified: Arc<Option<H256>>,
6767

6868
pub header_map: Arc<HeaderMap>,
@@ -83,7 +83,7 @@ impl Shared {
8383
async_handle: Handle,
8484
ibd_finished: Arc<AtomicBool>,
8585

86-
assume_valid_target: Arc<Mutex<Option<H256>>>,
86+
assume_valid_targets: Arc<Mutex<Option<Vec<H256>>>>,
8787
assume_valid_target_specified: Arc<Option<H256>>,
8888
header_map: Arc<HeaderMap>,
8989
block_status_map: Arc<DashMap<Byte32, BlockStatus>>,
@@ -106,7 +106,7 @@ impl Shared {
106106
snapshot_mgr,
107107
async_handle,
108108
ibd_finished,
109-
assume_valid_target,
109+
assume_valid_targets,
110110
assume_valid_target_specified,
111111
header_map,
112112
block_status_map,
@@ -467,8 +467,8 @@ impl Shared {
467467
);
468468
}
469469

470-
pub fn assume_valid_target(&self) -> MutexGuard<Option<H256>> {
471-
self.assume_valid_target.lock()
470+
pub fn assume_valid_targets(&self) -> MutexGuard<Option<Vec<H256>>> {
471+
self.assume_valid_targets.lock()
472472
}
473473

474474
pub fn assume_valid_target_specified(&self) -> Arc<Option<H256>> {

shared/src/shared_builder.rs

Lines changed: 30 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ use ckb_tx_pool::{
2525
};
2626
use ckb_types::core::hardfork::HardForks;
2727
use ckb_types::prelude::Pack;
28+
use ckb_types::H256;
2829
use ckb_types::{
2930
core::service::PoolTransactionEntry, core::tx_pool::Reject, core::EpochExt, core::HeaderView,
3031
};
@@ -347,20 +348,6 @@ impl SharedBuilder {
347348
Ok((snapshot, proposal_table))
348349
}
349350

350-
/// Check whether the data already exists in the database before starting
351-
fn check_assume_valid_target_already_exists(
352-
sync_config: &SyncConfig,
353-
snapshot: &Snapshot,
354-
) -> bool {
355-
if let Some(ref target) = sync_config.assume_valid_target {
356-
if snapshot.block_exists(&target.pack()) {
357-
info!("assume valid target is already in db, CKB will do full verification from now on");
358-
return true;
359-
}
360-
}
361-
false
362-
}
363-
364351
/// TODO(doc): @quake
365352
pub fn build(self) -> Result<(Shared, SharedPackage), ExitCode> {
366353
let SharedBuilder {
@@ -442,14 +429,38 @@ impl SharedBuilder {
442429

443430
let block_status_map = Arc::new(DashMap::new());
444431

445-
let assume_valid_target = Arc::new(Mutex::new({
446-
if Self::check_assume_valid_target_already_exists(&sync_config, &snapshot) {
432+
let assume_valid_targets = Arc::new(Mutex::new({
433+
let not_exists_targets: Option<Vec<H256>> =
434+
sync_config.assume_valid_targets.clone().map(|targets| {
435+
targets
436+
.iter()
437+
.filter(|&target_hash| {
438+
let exists = snapshot.block_exists(&target_hash.pack());
439+
if exists {
440+
info!("assume valid target 0x{} already exists in db", target_hash);
441+
}
442+
!exists
443+
})
444+
.cloned()
445+
.collect::<Vec<H256>>()
446+
});
447+
448+
if not_exists_targets
449+
.as_ref()
450+
.is_some_and(|targets| targets.is_empty())
451+
{
452+
info!("all assume valid targets is already in db, CKB will do full verification from now on");
447453
None
448454
} else {
449-
sync_config.assume_valid_target.clone()
455+
not_exists_targets
450456
}
451457
}));
452-
let assume_valid_target_specified = Arc::new(sync_config.assume_valid_target);
458+
459+
let assume_valid_target_specified: Arc<Option<H256>> = Arc::new(
460+
sync_config
461+
.assume_valid_targets
462+
.and_then(|targets| targets.last().cloned()),
463+
);
453464

454465
let shared = Shared::new(
455466
store,
@@ -460,7 +471,7 @@ impl SharedBuilder {
460471
snapshot_mgr,
461472
async_handle,
462473
ibd_finished,
463-
assume_valid_target,
474+
assume_valid_targets,
464475
assume_valid_target_specified,
465476
header_map,
466477
block_status_map,

sync/src/synchronizer/block_fetcher.rs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ use ckb_network::PeerIndex;
99
use ckb_shared::block_status::BlockStatus;
1010
use ckb_shared::types::{HeaderIndex, HeaderIndexView};
1111
use ckb_systemtime::unix_time_as_millis;
12+
use ckb_types::core::BlockNumber;
1213
use ckb_types::packed;
1314
use ckb_types::BlockNumberAndHash;
1415
use std::cmp::min;
@@ -91,7 +92,7 @@ impl BlockFetcher {
9192
Some(last_common)
9293
}
9394

94-
pub fn fetch(self) -> Option<Vec<Vec<packed::Byte32>>> {
95+
pub fn fetch(self, fetch_end: BlockNumber) -> Option<Vec<Vec<packed::Byte32>>> {
9596
let _trace_timecost: Option<HistogramTimer> = {
9697
ckb_metrics::handle().map(|handle| handle.ckb_sync_block_fetch_duration.start_timer())
9798
};
@@ -186,7 +187,10 @@ impl BlockFetcher {
186187
IBDState::Out => last_common.number() + 1,
187188
}
188189
};
189-
let mut end = min(best_known.number(), start + BLOCK_DOWNLOAD_WINDOW);
190+
let mut end = min(
191+
fetch_end,
192+
min(best_known.number(), start + BLOCK_DOWNLOAD_WINDOW),
193+
);
190194
let n_fetch = min(
191195
end.saturating_sub(start) as usize + 1,
192196
state.read_inflight_blocks().peer_can_fetch_count(self.peer),

0 commit comments

Comments
 (0)