Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Replace ConnectedPoint with Dialer in libp2p_swarm::DialError::WrongPeerId #2767

Open
dmitry-markin opened this issue Jul 21, 2022 · 7 comments
Labels
difficulty:easy getting-started Issues that can be tackled if you don't know the internals of libp2p very well help wanted

Comments

@dmitry-markin
Copy link
Contributor

dmitry-markin commented Jul 21, 2022

Description

Change the endpoint type to Dialer, extracting it from ConnectedPoint.

Motivation

Currently in case of DialError with WrongPeerId the ConnectedPoint is returned, which can contain Listener, which can't happen, because we are the dialing side. Replacing ConnectedPoint with Dialer can help to resolve this ambiguity and eliminate client code assertions.

ConnectedPoint endpoint type in WrongPeerId was introduced in this PR, which was merged here.

The original discussion that lead to this issue is in the substrate PR that changes the error printed when we connect to a bootnode that provides a different than expected peer id.

Are you planning to do it yourself in a pull request?

Maybe. Yes.

@mxinden
Copy link
Member

mxinden commented Jul 26, 2022

That sounds reasonable to me. Thanks @dmitry-markin for the detailed report.

I am not going to work on this any time soon. I am happy to help you implement it though. Given your "maybe", are you still interested?

@mxinden mxinden added difficulty:easy help wanted getting-started Issues that can be tackled if you don't know the internals of libp2p very well labels Jul 26, 2022
@dmitry-markin
Copy link
Contributor Author

Yes, I think I can look into it in a week or so. The one thing I worry about is that these changes will definitely break the API, and I don't know how to handle it. I.e, I can update substrate, but we need to somehow notify other clients.

@mxinden
Copy link
Member

mxinden commented Jul 26, 2022

Given that this is not a subtle change, but a change at the type system, I think users will (a) notice early and (b) can consult the changelog to get more advice. In other words, I am not worried about the breaking API change @dmitry-markin.

@dmitry-markin
Copy link
Contributor Author

dmitry-markin commented Aug 2, 2022

It seems the cause for DialError::WrongPeerId to contain ConnectedPoint, and not Dialer or just Multiaddr is that PendingOutboundConnectionError is based on PendingConnectionError also used for PendingInboundConnectionError. So they both share ConnectedPoint internally, even though ConnectedPoint::Listener is not relevant for PendingOutboundConnectionError/DialError.

To fix the API issue we can drop the Listener branch when converting PendingOutboundConnectionError into DialError here.

I see two ways of doing this. First is to extract ConnectedDialer, PendingDialer, and Listener (listeners are the same in both enums) from ConnectedPoint & PendingPoint. Then replace ConnectedPoint with ConnectedDialer in DialError. This requires a lot of modifications throughout the codebase and significantly changes the API. EDIT: I don't think this makes sense :-)

Another option is to keep ConnectedPoint and PendingPoint enums the same, and just modify DialError to include something instead ConnectedPoint. This can be either independent new ConnectedDialer struct, or even a plain Multiaddr.

I would go with the second option, but I don't understand whether we need to report the role_override when reporting the DialError (i.e., use the ConnectedDialer struct), or reporting a Multiaddr will be enough.

@mxinden what do you think?

@dmitry-markin
Copy link
Contributor Author

I've implemented the simplest solution in #2793.

@mxinden
Copy link
Member

mxinden commented Aug 8, 2022

It seems the cause for DialError::WrongPeerId to contain ConnectedPoint, and not Dialer or just Multiaddr is that PendingOutboundConnectionError is based on PendingConnectionError also used for PendingInboundConnectionError. So they both share ConnectedPoint internally, even though ConnectedPoint::Listener is not relevant for PendingOutboundConnectionError/DialError.

I would be in favor of doing as much as possible at compile time. Would splitting PendingConnectionError be an option?

@dmitry-markin
Copy link
Contributor Author

I would be in favor of doing as much as possible at compile time. Would splitting PendingConnectionError be an option?

Yes, this seems reasonable, I'll check it.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
difficulty:easy getting-started Issues that can be tackled if you don't know the internals of libp2p very well help wanted
Projects
None yet
Development

No branches or pull requests

2 participants