Skip to content

Commit 6355923

Browse files
committed
wip
Signed-off-by: Eval EXEC <execvy@gmail.com>
1 parent 9df053c commit 6355923

File tree

13 files changed

+215
-105
lines changed

13 files changed

+215
-105
lines changed

chain/src/verify.rs

+15-8
Original file line numberDiff line numberDiff line change
@@ -199,14 +199,21 @@ 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 asume_valid_target: {}", block_hash);
211+
// assume_valid_targets.replace(targets.clone());
212+
}
213+
214+
if targets.is_empty() {
215+
assume_valid_targets.take();
216+
info!("CKB reached all asume_valid_targets, will do full verification now");
210217
Switch::NONE
211218
} else {
212219
Switch::DISABLE_SCRIPT

ckb-bin/src/cli.rs

+2-2
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

+37-23
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

+4-4
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/latestassume_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

+1-1
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

+5-5
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

+16-8
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
};
@@ -352,10 +353,12 @@ impl SharedBuilder {
352353
sync_config: &SyncConfig,
353354
snapshot: &Snapshot,
354355
) -> 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;
356+
if let Some(ref target) = sync_config.assume_valid_targets {
357+
if let Some(last_target) = target.last() {
358+
if snapshot.block_exists(&last_target.pack()) {
359+
info!("assume valid target is already in db, CKB will do full verification from now on");
360+
return true;
361+
}
359362
}
360363
}
361364
false
@@ -442,14 +445,19 @@ impl SharedBuilder {
442445

443446
let block_status_map = Arc::new(DashMap::new());
444447

445-
let assume_valid_target = Arc::new(Mutex::new({
448+
let assume_valid_targets = Arc::new(Mutex::new({
446449
if Self::check_assume_valid_target_already_exists(&sync_config, &snapshot) {
447450
None
448451
} else {
449-
sync_config.assume_valid_target.clone()
452+
sync_config.assume_valid_targets.clone()
450453
}
451454
}));
452-
let assume_valid_target_specified = Arc::new(sync_config.assume_valid_target);
455+
456+
let assume_valid_target_specified: Arc<Option<H256>> = Arc::new(
457+
sync_config
458+
.assume_valid_targets
459+
.and_then(|targets| targets.last().cloned()),
460+
);
453461

454462
let shared = Shared::new(
455463
store,
@@ -460,7 +468,7 @@ impl SharedBuilder {
460468
snapshot_mgr,
461469
async_handle,
462470
ibd_finished,
463-
assume_valid_target,
471+
assume_valid_targets,
464472
assume_valid_target_specified,
465473
header_map,
466474
block_status_map,

sync/src/synchronizer/block_fetcher.rs

+6-2
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),

sync/src/synchronizer/mod.rs

+43-24
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@ const NOT_IBD_BLOCK_FETCH_INTERVAL: Duration = Duration::from_millis(200);
6767

6868
#[derive(Copy, Clone)]
6969
enum CanStart {
70+
FetchToTarget(BlockNumber),
7071
Ready,
7172
MinWorkNotReach,
7273
AssumeValidNotFound,
@@ -90,25 +91,34 @@ impl BlockFetchCMD {
9091
fn process_fetch_cmd(&mut self, cmd: FetchCMD) {
9192
let FetchCMD { peers, ibd_state }: FetchCMD = cmd;
9293

93-
match self.can_start() {
94-
CanStart::Ready => {
95-
for peer in peers {
96-
if ckb_stop_handler::has_received_stop_signal() {
97-
return;
98-
}
94+
let fetch_blocks_fn = |cmd: &mut BlockFetchCMD, assume_target: BlockNumber| {
95+
for peer in peers {
96+
if ckb_stop_handler::has_received_stop_signal() {
97+
return;
98+
}
9999

100-
if let Some(fetch) =
101-
BlockFetcher::new(Arc::clone(&self.sync_shared), peer, ibd_state).fetch()
102-
{
103-
for item in fetch {
104-
if ckb_stop_handler::has_received_stop_signal() {
105-
return;
106-
}
107-
BlockFetchCMD::send_getblocks(item, &self.p2p_control, peer);
100+
let mut fetch_end: BlockNumber = u64::MAX;
101+
if assume_target != 0 {
102+
fetch_end = assume_target
103+
}
104+
105+
if let Some(fetch) =
106+
BlockFetcher::new(Arc::clone(&cmd.sync_shared), peer, ibd_state)
107+
.fetch(fetch_end)
108+
{
109+
for item in fetch {
110+
if ckb_stop_handler::has_received_stop_signal() {
111+
return;
108112
}
113+
BlockFetchCMD::send_getblocks(item, &cmd.p2p_control, peer);
109114
}
110115
}
111116
}
117+
};
118+
119+
match self.can_start() {
120+
CanStart::FetchToTarget(assume_target) => fetch_blocks_fn(self, assume_target),
121+
CanStart::Ready => fetch_blocks_fn(self, BlockNumber::MAX),
112122
CanStart::MinWorkNotReach => {
113123
let best_known = self.sync_shared.state().shared_best_header_ref();
114124
let number = best_known.number();
@@ -129,8 +139,9 @@ impl BlockFetchCMD {
129139
let best_known = state.shared_best_header_ref();
130140
let number = best_known.number();
131141
let assume_valid_target: Byte32 = shared
132-
.assume_valid_target()
142+
.assume_valid_targets()
133143
.as_ref()
144+
.and_then(|targets| targets.first())
134145
.map(Pack::pack)
135146
.expect("assume valid target must exist");
136147

@@ -234,15 +245,23 @@ impl BlockFetchCMD {
234245
};
235246

236247
let assume_valid_target_find = |flag: &mut CanStart| {
237-
let mut assume_valid_target = shared.assume_valid_target();
238-
if let Some(ref target) = *assume_valid_target {
239-
match shared.header_map().get(&target.pack()) {
248+
let mut assume_valid_targets = shared.assume_valid_targets();
249+
if let Some(ref targets) = *assume_valid_targets {
250+
if targets.is_empty() {
251+
assume_valid_targets.take();
252+
*flag = CanStart::Ready;
253+
return;
254+
}
255+
let first_target = targets
256+
.first()
257+
.expect("has checked targets is not empty, assume valid target must exist");
258+
match shared.header_map().get(&first_target.pack()) {
240259
Some(header) => {
241-
*flag = CanStart::Ready;
242-
info!("assume valid target found in header_map; CKB will start fetch blocks now");
260+
*flag = CanStart::FetchToTarget(header.number());
261+
info!("assume valid target found in header_map; CKB will start fetch blocks to {:?} now", header.number_and_hash());
243262
// Blocks that are no longer in the scope of ibd must be forced to verify
244263
if unix_time_as_millis().saturating_sub(header.timestamp()) < MAX_TIP_AGE {
245-
assume_valid_target.take();
264+
assume_valid_targets.take();
246265
warn!("the duration gap between 'assume valid target' and 'now' is less than 24h; CKB will ignore the specified assume valid target and do full verification from now on");
247266
}
248267
}
@@ -254,7 +273,7 @@ impl BlockFetchCMD {
254273
{
255274
warn!("the duration gap between 'shared_best_header' and 'now' is less than 24h, but CKB haven't found the assume valid target in header_map; CKB will ignore the specified assume valid target and do full verification from now on");
256275
*flag = CanStart::Ready;
257-
assume_valid_target.take();
276+
assume_valid_targets.take();
258277
}
259278
}
260279
}
@@ -264,7 +283,7 @@ impl BlockFetchCMD {
264283
};
265284

266285
match self.can_start {
267-
CanStart::Ready => self.can_start,
286+
CanStart::FetchToTarget(_) | CanStart::Ready => self.can_start,
268287
CanStart::MinWorkNotReach => {
269288
min_work_reach(&mut self.can_start);
270289
if let CanStart::AssumeValidNotFound = self.can_start {
@@ -453,7 +472,7 @@ impl Synchronizer {
453472
peer: PeerIndex,
454473
ibd: IBDState,
455474
) -> Option<Vec<Vec<packed::Byte32>>> {
456-
BlockFetcher::new(Arc::clone(&self.shared), peer, ibd).fetch()
475+
BlockFetcher::new(Arc::clone(&self.shared), peer, ibd).fetch(BlockNumber::MAX)
457476
}
458477

459478
pub(crate) fn on_connected(&self, nc: &dyn CKBProtocolContext, peer: PeerIndex) {

0 commit comments

Comments
 (0)