Skip to content

Commit c1b3463

Browse files
committed
Merge branch 'develop' into rc/v0.121.x
2 parents cf55a97 + b44d2d2 commit c1b3463

File tree

41 files changed

+593
-350
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

41 files changed

+593
-350
lines changed

benches/benches/benchmarks/overall.rs

+2-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ use ckb_chain::{start_chain_services, ChainController};
55
use ckb_chain_spec::consensus::{ConsensusBuilder, ProposalWindow};
66
use ckb_dao_utils::genesis_dao_data;
77
use ckb_jsonrpc_types::JsonBytes;
8-
use ckb_network::{Flags, NetworkController, NetworkService, NetworkState};
8+
use ckb_network::{network::TransportType, Flags, NetworkController, NetworkService, NetworkState};
99
use ckb_shared::{Shared, SharedBuilder};
1010
use ckb_store::ChainStore;
1111
use ckb_types::{
@@ -77,6 +77,7 @@ fn dummy_network(shared: &Shared) -> NetworkController {
7777
"test".to_string(),
7878
Flags::COMPATIBILITY,
7979
),
80+
TransportType::Tcp,
8081
)
8182
.start(shared.async_handle())
8283
.expect("Start network service failed")

chain/src/tests/util.rs

+2-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ use ckb_app_config::{BlockAssemblerConfig, NetworkConfig};
44
use ckb_chain_spec::consensus::{Consensus, ConsensusBuilder};
55
use ckb_dao_utils::genesis_dao_data;
66
use ckb_jsonrpc_types::ScriptHashType;
7-
use ckb_network::{Flags, NetworkController, NetworkService, NetworkState};
7+
use ckb_network::{network::TransportType, Flags, NetworkController, NetworkService, NetworkState};
88
use ckb_shared::{Shared, SharedBuilder};
99
use ckb_store::ChainStore;
1010
use ckb_test_chain_utils::{always_success_cell, create_always_success_tx};
@@ -123,6 +123,7 @@ pub(crate) fn dummy_network(shared: &Shared) -> NetworkController {
123123
"test".to_string(),
124124
Flags::COMPATIBILITY,
125125
),
126+
TransportType::Tcp,
126127
)
127128
.start(shared.async_handle())
128129
.expect("Start network service failed")

chain/src/verify.rs

+16-8
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

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

network/src/network.rs

+33-28
Original file line numberDiff line numberDiff line change
@@ -105,15 +105,14 @@ impl NetworkState {
105105
.iter()
106106
.chain(config.public_addresses.iter())
107107
.cloned()
108-
.filter_map(|mut addr| {
109-
multiaddr_to_socketaddr(&addr)
110-
.filter(|addr| is_reachable(addr.ip()))
111-
.and({
112-
if extract_peer_id(&addr).is_none() {
113-
addr.push(Protocol::P2P(Cow::Borrowed(local_peer_id.as_bytes())));
114-
}
115-
Some(addr)
116-
})
108+
.filter_map(|mut addr| match multiaddr_to_socketaddr(&addr) {
109+
Some(socket_addr) if !is_reachable(socket_addr.ip()) => None,
110+
_ => {
111+
if extract_peer_id(&addr).is_none() {
112+
addr.push(Protocol::P2P(Cow::Borrowed(local_peer_id.as_bytes())));
113+
}
114+
Some(addr)
115+
}
117116
})
118117
.collect();
119118
info!("Loading the peer store. This process may take a few seconds to complete.");
@@ -158,15 +157,14 @@ impl NetworkState {
158157
.iter()
159158
.chain(config.public_addresses.iter())
160159
.cloned()
161-
.filter_map(|mut addr| {
162-
multiaddr_to_socketaddr(&addr)
163-
.filter(|addr| is_reachable(addr.ip()))
164-
.and({
165-
if extract_peer_id(&addr).is_none() {
166-
addr.push(Protocol::P2P(Cow::Borrowed(local_peer_id.as_bytes())));
167-
}
168-
Some(addr)
169-
})
160+
.filter_map(|mut addr| match multiaddr_to_socketaddr(&addr) {
161+
Some(socket_addr) if !is_reachable(socket_addr.ip()) => None,
162+
_ => {
163+
if extract_peer_id(&addr).is_none() {
164+
addr.push(Protocol::P2P(Cow::Borrowed(local_peer_id.as_bytes())));
165+
}
166+
Some(addr)
167+
}
170168
})
171169
.collect();
172170
info!("Loading the peer store. This process may take a few seconds to complete.");
@@ -831,6 +829,7 @@ impl NetworkService {
831829
required_protocol_ids: Vec<ProtocolId>,
832830
// name, version, flags
833831
identify_announce: (String, String, Flags),
832+
transport_type: TransportType,
834833
) -> Self {
835834
let config = &network_state.config;
836835

@@ -1017,7 +1016,7 @@ impl NetworkService {
10171016
service_builder = service_builder.tcp_config(bind_fn);
10181017
}
10191018
}
1020-
TransportType::Ws => {
1019+
TransportType::Ws | TransportType::Wss => {
10211020
// only bind once
10221021
if matches!(init, BindType::Ws) {
10231022
continue;
@@ -1074,6 +1073,7 @@ impl NetworkService {
10741073
Arc::clone(&network_state),
10751074
p2p_service.control().to_owned().into(),
10761075
Duration::from_secs(config.connect_outbound_interval_secs),
1076+
transport_type,
10771077
);
10781078
bg_services.push(Box::pin(outbound_peer_service) as Pin<Box<_>>);
10791079
};
@@ -1520,19 +1520,24 @@ pub(crate) async fn async_disconnect_with_message(
15201520
control.disconnect(peer_index).await
15211521
}
15221522

1523+
/// Transport type on ckb
15231524
#[derive(Clone, Copy, Debug, Eq, PartialEq, PartialOrd, Ord)]
1524-
pub(crate) enum TransportType {
1525+
pub enum TransportType {
1526+
/// Tcp
15251527
Tcp,
1528+
/// Ws
15261529
Ws,
1530+
/// Wss only on wasm
1531+
Wss,
15271532
}
15281533

15291534
pub(crate) fn find_type(addr: &Multiaddr) -> TransportType {
1530-
if addr
1531-
.iter()
1532-
.any(|proto| matches!(proto, Protocol::Ws | Protocol::Wss))
1533-
{
1534-
TransportType::Ws
1535-
} else {
1536-
TransportType::Tcp
1537-
}
1535+
let mut iter = addr.iter();
1536+
1537+
iter.find_map(|proto| match proto {
1538+
Protocol::Ws => Some(TransportType::Ws),
1539+
Protocol::Wss => Some(TransportType::Wss),
1540+
_ => None,
1541+
})
1542+
.unwrap_or(TransportType::Tcp)
15381543
}

network/src/peer_registry.rs

+21-4
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
//! Peer registry
22
use crate::network_group::Group;
33
use crate::peer_store::PeerStore;
4+
use crate::Flags;
45
use crate::{
56
errors::{Error, PeerError},
67
extract_peer_id, Peer, PeerId, SessionType,
@@ -24,7 +25,7 @@ pub struct PeerRegistry {
2425
// Only whitelist peers or allow all peers.
2526
whitelist_only: bool,
2627
whitelist_peers: HashSet<PeerId>,
27-
feeler_peers: HashSet<PeerId>,
28+
feeler_peers: HashMap<PeerId, Flags>,
2829
}
2930

3031
/// Global network connection status
@@ -63,7 +64,7 @@ impl PeerRegistry {
6364
PeerRegistry {
6465
peers: HashMap::with_capacity_and_hasher(20, Default::default()),
6566
whitelist_peers: whitelist_peers.iter().filter_map(extract_peer_id).collect(),
66-
feeler_peers: HashSet::default(),
67+
feeler_peers: HashMap::default(),
6768
max_inbound,
6869
max_outbound,
6970
whitelist_only,
@@ -191,10 +192,26 @@ impl PeerRegistry {
191192
/// Add feeler dail task
192193
pub fn add_feeler(&mut self, addr: &Multiaddr) {
193194
if let Some(peer_id) = extract_peer_id(addr) {
194-
self.feeler_peers.insert(peer_id);
195+
self.feeler_peers.insert(peer_id, Flags::COMPATIBILITY);
195196
}
196197
}
197198

199+
/// Identify change feeler flags
200+
pub fn change_feeler_flags(&mut self, addr: &Multiaddr, flags: Flags) -> bool {
201+
if let Some(peer_id) = extract_peer_id(addr) {
202+
if let Some(i) = self.feeler_peers.get_mut(&peer_id) {
203+
*i = flags;
204+
return true;
205+
}
206+
}
207+
false
208+
}
209+
210+
/// Get feeler session flags
211+
pub fn feeler_flags(&self, addr: &Multiaddr) -> Option<Flags> {
212+
extract_peer_id(addr).and_then(|peer_id| self.feeler_peers.get(&peer_id).cloned())
213+
}
214+
198215
/// Remove feeler dail task on session disconnects or fails
199216
pub fn remove_feeler(&mut self, addr: &Multiaddr) {
200217
if let Some(peer_id) = extract_peer_id(addr) {
@@ -205,7 +222,7 @@ impl PeerRegistry {
205222
/// Whether this session is feeler session
206223
pub fn is_feeler(&self, addr: &Multiaddr) -> bool {
207224
extract_peer_id(addr)
208-
.map(|peer_id| self.feeler_peers.contains(&peer_id))
225+
.map(|peer_id| self.feeler_peers.contains_key(&peer_id))
209226
.unwrap_or_default()
210227
}
211228

0 commit comments

Comments
 (0)