diff --git a/CHANGELOG.md b/CHANGELOG.md index e7dd733fff1..1d579529f3a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -35,6 +35,9 @@ - [#4703](https://github.com/ChainSafe/forest/issues/4703) Add support for the `Filecoin.EthGetTransactionByHashLimited` RPC method. +- [#4783](https://github.com/ChainSafe/forest/issues/4783) Add support for the + `Filecoin.NetProtectList` RPC method. + ### Changed - [#4786](https://github.com/ChainSafe/forest/issues/4786) ubuntu image is diff --git a/src/libp2p/peer_manager.rs b/src/libp2p/peer_manager.rs index 343064fe64b..272a61834f0 100644 --- a/src/libp2p/peer_manager.rs +++ b/src/libp2p/peer_manager.rs @@ -353,6 +353,10 @@ impl PeerManager { self.protected_peers.write().remove(peer_id); } + pub fn list_protected_peers(&self) -> HashSet { + self.protected_peers.read().clone() + } + pub fn is_peer_protected(&self, peer_id: &PeerId) -> bool { self.protected_peers.read().contains(peer_id) } diff --git a/src/libp2p/service.rs b/src/libp2p/service.rs index e0669ccfca6..919dfc67bf0 100644 --- a/src/libp2p/service.rs +++ b/src/libp2p/service.rs @@ -154,6 +154,7 @@ pub enum NetRPCMethods { Peers(flume::Sender>>), ProtectPeer(flume::Sender<()>, HashSet), UnprotectPeer(flume::Sender<()>, HashSet), + ListProtectedPeers(flume::Sender>), Info(flume::Sender), Connect(flume::Sender, PeerId, HashSet), Disconnect(flume::Sender<()>, PeerId), @@ -506,6 +507,9 @@ async fn handle_network_message( }); tx.send_or_warn(()); } + NetRPCMethods::ListProtectedPeers(tx) => { + tx.send_or_warn(peer_manager.list_protected_peers()); + } NetRPCMethods::UnprotectPeer(tx, peer_ids) => { peer_ids.iter().for_each(|peer_id| { peer_manager.unprotect_peer(peer_id); diff --git a/src/rpc/methods/net.rs b/src/rpc/methods/net.rs index 7309192ce70..99e3d7c6d74 100644 --- a/src/rpc/methods/net.rs +++ b/src/rpc/methods/net.rs @@ -294,8 +294,15 @@ impl RpcMethod<0> for NetProtectList { type Params = (); type Ok = Vec; - async fn handle(_: Ctx, (): Self::Params) -> Result { - Err(ServerError::stubbed_for_openrpc()) + async fn handle(ctx: Ctx, (): Self::Params) -> Result { + let (tx, rx) = flume::bounded(1); + ctx.network_send + .send_async(NetworkMessage::JSONRPCRequest { + method: NetRPCMethods::ListProtectedPeers(tx), + }) + .await?; + let peers = rx.recv_async().await?; + Ok(peers.into_iter().map(|p| p.to_string()).collect()) } } diff --git a/src/tool/subcommands/api_cmd.rs b/src/tool/subcommands/api_cmd.rs index d73073c4ce8..7d960be0055 100644 --- a/src/tool/subcommands/api_cmd.rs +++ b/src/tool/subcommands/api_cmd.rs @@ -712,6 +712,7 @@ fn net_tests() -> Vec { RpcTest::identity( NetProtectRemove::request((vec![PeerId::random().to_string()],)).unwrap(), ), + RpcTest::basic(NetProtectList::request(()).unwrap()), ] }