Skip to content

Commit 37fdbb5

Browse files
authored
Merge branch 'develop' into args_reader
2 parents 0d6496b + b44d2d2 commit 37fdbb5

File tree

18 files changed

+291
-141
lines changed

18 files changed

+291
-141
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")

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)