3333from libp2p .crypto .keys import (
3434 KeyPair ,
3535)
36+ from libp2p .crypto .ed25519 import (
37+ create_new_key_pair as create_new_ed25519_key_pair ,
38+ )
3639from libp2p .crypto .rsa import (
37- create_new_key_pair ,
40+ create_new_key_pair as create_new_rsa_key_pair ,
3841)
3942from libp2p .crypto .x25519 import create_new_key_pair as create_new_x25519_key_pair
4043from libp2p .custom_types import (
@@ -154,7 +157,17 @@ def create_mplex_muxer_option() -> TMuxerOptions:
154157
155158
156159def generate_new_rsa_identity () -> KeyPair :
157- return create_new_key_pair ()
160+ return create_new_rsa_key_pair ()
161+
162+
163+ def generate_new_ed25519_identity () -> KeyPair :
164+ """
165+ Generate a new Ed25519 identity key pair.
166+
167+ Ed25519 is preferred for better interoperability with other libp2p implementations
168+ (e.g., Rust, Go) which often disable RSA support.
169+ """
170+ return create_new_ed25519_key_pair ()
158171
159172
160173def generate_peer_id_from (key_pair : KeyPair ) -> ID :
@@ -186,6 +199,7 @@ def new_swarm(
186199 tls_client_config : ssl .SSLContext | None = None ,
187200 tls_server_config : ssl .SSLContext | None = None ,
188201 resource_manager : ResourceManager | None = None ,
202+ psk : str | None = None
189203) -> INetworkService :
190204 logger .debug (f"new_swarm: enable_quic={ enable_quic } , listen_addrs={ listen_addrs } " )
191205 """
@@ -201,15 +215,21 @@ def new_swarm(
201215 :param quic_transport_opt: options for transport
202216 :param resource_manager: optional resource manager for connection/stream limits
203217 :type resource_manager: :class:`libp2p.rcmgr.ResourceManager` or None
218+ :param psk: optional pre-shared key for PSK encryption in transport
204219 :return: return a default swarm instance
205220
206221 Note: Yamux (/yamux/1.0.0) is the preferred stream multiplexer
207222 due to its improved performance and features.
208223 Mplex (/mplex/6.7.0) is retained for backward compatibility
209224 but may be deprecated in the future.
225+
226+ Note: Ed25519 keys are used by default for better interoperability with
227+ other libp2p implementations (Rust, Go) which often disable RSA support.
210228 """
211229 if key_pair is None :
212- key_pair = generate_new_rsa_identity ()
230+ # Use Ed25519 by default for better interoperability with Rust/Go libp2p
231+ # which often compile without RSA support
232+ key_pair = generate_new_ed25519_identity ()
213233
214234 id_opt = generate_peer_id_from (key_pair )
215235
@@ -306,7 +326,8 @@ def new_swarm(
306326 upgrader ,
307327 transport ,
308328 retry_config = retry_config ,
309- connection_config = connection_config
329+ connection_config = connection_config ,
330+ psk = psk
310331 )
311332
312333 # Set resource manager if provided
@@ -324,6 +345,21 @@ def new_swarm(
324345
325346 return swarm
326347
348+ # Set resource manager if provided
349+ # Auto-create a default ResourceManager if one was not provided
350+ if resource_manager is None :
351+ try :
352+ from libp2p .rcmgr import new_resource_manager as _new_rm
353+
354+ resource_manager = _new_rm ()
355+ except Exception :
356+ resource_manager = None
357+
358+ if resource_manager is not None :
359+ swarm .set_resource_manager (resource_manager )
360+
361+ return swarm
362+
327363
328364def new_host (
329365 key_pair : KeyPair | None = None ,
@@ -342,6 +378,7 @@ def new_host(
342378 tls_client_config : ssl .SSLContext | None = None ,
343379 tls_server_config : ssl .SSLContext | None = None ,
344380 resource_manager : ResourceManager | None = None ,
381+ psk : str | None = None
345382) -> IHost :
346383 """
347384 Create a new libp2p host based on the given parameters.
@@ -361,6 +398,7 @@ def new_host(
361398 :param tls_server_config: optional TLS server configuration for WebSocket transport
362399 :param resource_manager: optional resource manager for connection/stream limits
363400 :type resource_manager: :class:`libp2p.rcmgr.ResourceManager` or None
401+ :param psk: optional pre-shared key (PSK)
364402 :return: return a host instance
365403 """
366404
@@ -390,6 +428,7 @@ def new_host(
390428 tls_client_config = tls_client_config ,
391429 tls_server_config = tls_server_config ,
392430 resource_manager = resource_manager ,
431+ psk = psk
393432 )
394433
395434 if disc_opt is not None :
0 commit comments