Skip to content

Commit bbdc5c4

Browse files
committed
feat: p2p whitelist enrs
1 parent 33fd007 commit bbdc5c4

File tree

7 files changed

+45
-7
lines changed

7 files changed

+45
-7
lines changed

Makefile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ run-silius-p2p-bootnode:
2323
cargo run --release -- node --eth-client-address http://127.0.0.1:8545 --mnemonic-file ./bundler-spec-tests/keys/0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266 --beneficiary 0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266 --entry-points 0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789 --http --http.port 4000 --eth-client-proxy-address http://127.0.0.1:8545 --p2p.baddr 127.0.0.1 --enable-p2p
2424

2525
run-silius-p2p-peer:
26-
cargo run --release -- node --eth-client-address http://127.0.0.1:8545 --mnemonic-file ./bundler-spec-tests/keys/0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266 --beneficiary 0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266 --entry-points 0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789 --http --http.port 4000 --eth-client-proxy-address http://127.0.0.1:8545 --p2p.baddr 127.0.0.1 --bootnodes "enr:-J24QMMKCYqEBAs659G2f4MtvjI8wp3dbAvrvRbTxIEaapZfb9Pi0La0QOs6HoGfVeGk8fsFvZF7WiM_arx43rxSHwQBiGNoYWluX2lkiDkFAAAAAAAAgmlkgnY0gmlwhH8AAAGJc2VjcDI1NmsxoQLigwYFOcf1lit2x918h4_6upE1lZ1kK3tD029ZZioW0IN0Y3CCIyiDdWRwgiMo" --enable-p2p --discovery.port 4338 --p2p.port 4338 --datadir ./.local/node1
26+
cargo run --release -- node --eth-client-address http://127.0.0.1:8545 --mnemonic-file ./bundler-spec-tests/keys/0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266 --beneficiary 0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266 --entry-points 0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789 --http --http.port 4000 --eth-client-proxy-address http://127.0.0.1:8545 --p2p.baddr 127.0.0.1 --bootnodes "enr:-J24QDPWQny36hS9qIFZcbIVSj2APHVP6cGT8hMc-365q2tjWU9Wq_NTyo0QMiXWaGkFfyeE32Pj2HetGHBfEL2QgpQBiGNoYWluX2lkiDkFAAAAAAAAgmlkgnY0gmlwhH8AAAGJc2VjcDI1NmsxoQL_3hI8PSmgjpFl83Nps5MTBjBf3pMm8Bo2TysjqnMGBoN0Y3CCIyiDdWRwgiMo" --enable-p2p --discovery.port 4338 --p2p.port 4338 --datadir ./.local/node1
2727

2828
run-silius-debug:
2929
cargo run --release -- node --eth-client-address ws://127.0.0.1:8546 --mnemonic-file ${HOME}/.silius/0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266 --beneficiary 0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266 --entry-points 0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789 --http --ws --http.api eth,debug,web3 --ws.api eth,debug,web3

bin/silius/src/cli/args.rs

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -306,6 +306,11 @@ pub struct P2PArgs {
306306
/// The path to the file where the p2p enr is stored.
307307
#[clap(long = "nodeenr")]
308308
pub node_enr: Option<PathBuf>,
309+
310+
/// List of whitelisted ENRs (for permissioned mempools).
311+
/// If empty, all ENRs are allowed.
312+
#[clap(long = "p2p.whitelist", value_delimiter = ',', value_parser=parse_enr)]
313+
pub peers_whitelist: Vec<Enr>,
309314
}
310315

311316
impl P2PArgs {
@@ -334,6 +339,7 @@ impl P2PArgs {
334339
.enr_udp4_port(Some(self.udp4_port))
335340
.chain_spec(ChainSpec::from_chain_id(chain.id()))
336341
.bootnodes(self.bootnodes.clone())
342+
.peers_whitelist(self.peers_whitelist.clone())
337343
.gs_config(gossipsub_config())
338344
.discv5_config(discv5::ConfigBuilder::new(listen_addr.to_listen_config()).build());
339345

@@ -778,6 +784,8 @@ mod tests {
778784
"~/.silius/p2p/node-key",
779785
"--nodeenr",
780786
"~/.silius/p2p/node-enr",
787+
"--p2p.whitelist",
788+
&binding,
781789
];
782790
assert_eq!(
783791
P2PArgs {
@@ -786,9 +794,10 @@ mod tests {
786794
p2p_broadcast_address: Some(Ipv4Addr::new(127, 0, 0, 1)),
787795
tcp4_port: 4337,
788796
udp4_port: 4337,
789-
bootnodes: vec![enr],
797+
bootnodes: vec![enr.clone()],
790798
node_key: Some(PathBuf::from("~/.silius/p2p/node-key")),
791-
node_enr: Some(PathBuf::from("~/.silius/p2p/node-enr"))
799+
node_enr: Some(PathBuf::from("~/.silius/p2p/node-enr")),
800+
peers_whitelist: vec![enr],
792801
},
793802
P2PArgs::try_parse_from(args).unwrap()
794803
)

crates/p2p/src/config.rs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,9 @@ pub struct Config {
5757

5858
/// List of bootnodes.
5959
pub bootnodes: Vec<Enr>,
60+
61+
/// List of whitelisted peer ENRs
62+
pub peers_whitelist: Vec<Enr>,
6063
}
6164

6265
impl Default for Config {
@@ -85,6 +88,7 @@ impl Default for Config {
8588
chain_spec: ChainSpec::dev(),
8689
target_peers: TARGET_PEERS,
8790
bootnodes: vec![],
91+
peers_whitelist: vec![],
8892
}
8993
}
9094
}
@@ -194,6 +198,12 @@ impl ConfigBuilder {
194198
self.config.bootnodes = bootnodes;
195199
self
196200
}
201+
202+
/// Set the peers whitelist.
203+
pub fn peers_whitelist(mut self, peers_whitelist: Vec<Enr>) -> Self {
204+
self.config.peers_whitelist = peers_whitelist;
205+
self
206+
}
197207
}
198208

199209
/// Create a `GossipsubConfig`.

crates/p2p/src/peer_manager/mod.rs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,19 +55,22 @@ pub struct PeerManager {
5555
target_peers: usize,
5656
/// Peers needs to be dialed.
5757
peers_to_dial: Vec<Enr>,
58+
/// The list of whitelisted ENRs.
59+
peers_whitelist: Vec<Enr>,
5860
/// The heartbeat interval for peer management.
5961
heartbeat: tokio::time::Interval,
6062
}
6163

6264
impl PeerManager {
63-
pub fn new(network_globals: Arc<NetworkGlobals>) -> Self {
65+
pub fn new(network_globals: Arc<NetworkGlobals>, peers_whitelist: Vec<Enr>) -> Self {
6466
Self {
6567
network_globals,
6668
events: Default::default(),
6769
inbound_ping_peers: HashSetDelay::new(Duration::from_secs(PING_INTERVAL_INBOUND)),
6870
outbound_ping_peers: HashSetDelay::new(Duration::from_secs(PING_INTERVAL_OUTBOUND)),
6971
target_peers: TARGET_PEERS,
7072
peers_to_dial: Vec::new(),
73+
peers_whitelist,
7174
heartbeat: tokio::time::interval(Duration::from_secs(HEARTBEAT_INTERVAL)),
7275
}
7376
}

crates/p2p/src/peer_manager/network_behaviour.rs

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -50,20 +50,34 @@ impl NetworkBehaviour for PeerManager {
5050
fn handle_established_inbound_connection(
5151
&mut self,
5252
_connection_id: libp2p::swarm::ConnectionId,
53-
_peer: PeerId,
53+
peer_id: PeerId,
5454
_local_addr: &libp2p::Multiaddr,
5555
_remote_addr: &libp2p::Multiaddr,
5656
) -> Result<libp2p::swarm::THandler<Self>, libp2p::swarm::ConnectionDenied> {
57+
// check if whitelist exists and if the peer is in the whitelist
58+
if !self.peers_whitelist.is_empty() &&
59+
self.peers_whitelist.iter().filter(|enr| enr.peer_id() == peer_id).count() == 0
60+
{
61+
return Err(libp2p::swarm::ConnectionDenied::new("Peer not in the whitelist"));
62+
}
63+
5764
Ok(ConnectionHandler)
5865
}
5966

6067
fn handle_established_outbound_connection(
6168
&mut self,
6269
_connection_id: libp2p::swarm::ConnectionId,
63-
_peer: PeerId,
70+
peer_id: PeerId,
6471
_addr: &libp2p::Multiaddr,
6572
_role_override: libp2p::core::Endpoint,
6673
) -> Result<libp2p::swarm::THandler<Self>, libp2p::swarm::ConnectionDenied> {
74+
// check if whitelist exists and if the peer is in the whitelist
75+
if !self.peers_whitelist.is_empty() &&
76+
self.peers_whitelist.iter().filter(|enr| enr.peer_id() == peer_id).count() == 0
77+
{
78+
return Err(libp2p::swarm::ConnectionDenied::new("Peer not in the whitelist"));
79+
}
80+
6781
Ok(ConnectionHandler)
6882
}
6983

crates/p2p/src/service/mod.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -221,7 +221,8 @@ impl Network {
221221

222222
let rpc = RPC::new();
223223

224-
let peer_manager = PeerManager::new(network_globals.clone());
224+
let peer_manager =
225+
PeerManager::new(network_globals.clone(), config.clone().peers_whitelist);
225226

226227
let mut discovery =
227228
Discovery::new(combined_key, config.clone(), network_globals.clone()).await?;

crates/p2p/tests/common.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@ async fn build_p2p_instance(bootnode: Option<Enr>) -> eyre::Result<Network> {
5959
chain_spec: chain_spec.clone(),
6060
target_peers: TARGET_PEERS,
6161
bootnodes: if let Some(bootnode) = bootnode { vec![bootnode] } else { vec![] },
62+
peers_whitelist: vec![],
6263
};
6364

6465
let (_, receiver) = unbounded();

0 commit comments

Comments
 (0)