protocols/relay: Implement circuit relay specification (#1838)
This commit implements the [libp2p circuit
relay](https://github.com/libp2p/specs/tree/master/relay) specification. It is
based on previous work from https://github.com/libp2p/rust-libp2p/pull/1134.
Instead of altering the `Transport` trait, the approach taken in this commit
is to wrap an existing implementation of `Transport` allowing one to:
- Intercept `dial` requests with a relayed address.
- Inject incoming relayed connections with the local node being the destination.
- Intercept `listen_on` requests pointing to a relay, ensuring to keep a
constant connection to the relay, waiting for incoming requests with the local
node being the destination.
More concretely one would wrap an existing `Transport` implementation as seen
below, allowing the `Relay` behaviour and the `RelayTransport` to communicate
via channels.
### Example
```rust
let (relay_transport, relay_behaviour) = new_transport_and_behaviour(
RelayConfig::default(),
MemoryTransport::default(),
);
let transport = relay_transport
.upgrade(upgrade::Version::V1)
.authenticate(plaintext)
.multiplex(YamuxConfig::default())
.boxed();
let mut swarm = Swarm::new(transport, relay_behaviour, local_peer_id);
let relay_addr = Multiaddr::from_str("/memory/1234").unwrap()
.with(Protocol::P2p(PeerId::random().into()))
.with(Protocol::P2pCircuit);
let dst_addr = relay_addr.clone().with(Protocol::Memory(5678));
// Listen for incoming connections via relay node (1234).
Swarm::listen_on(&mut swarm, relay_addr).unwrap();
// Dial node (5678) via relay node (1234).
Swarm::dial_addr(&mut swarm, dst_addr).unwrap();
```
Co-authored-by: Pierre Krieger <pierre.krieger1708@gmail.com>
Co-authored-by: Roman Borschel <romanb@users.noreply.github.com>
Co-authored-by: David Craven <david@craven.ch>
2021-03-11 16:07:59 +01:00
|
|
|
syntax = "proto2";
|
2022-01-14 19:58:28 +01:00
|
|
|
package message_v1.pb;
|
protocols/relay: Implement circuit relay specification (#1838)
This commit implements the [libp2p circuit
relay](https://github.com/libp2p/specs/tree/master/relay) specification. It is
based on previous work from https://github.com/libp2p/rust-libp2p/pull/1134.
Instead of altering the `Transport` trait, the approach taken in this commit
is to wrap an existing implementation of `Transport` allowing one to:
- Intercept `dial` requests with a relayed address.
- Inject incoming relayed connections with the local node being the destination.
- Intercept `listen_on` requests pointing to a relay, ensuring to keep a
constant connection to the relay, waiting for incoming requests with the local
node being the destination.
More concretely one would wrap an existing `Transport` implementation as seen
below, allowing the `Relay` behaviour and the `RelayTransport` to communicate
via channels.
### Example
```rust
let (relay_transport, relay_behaviour) = new_transport_and_behaviour(
RelayConfig::default(),
MemoryTransport::default(),
);
let transport = relay_transport
.upgrade(upgrade::Version::V1)
.authenticate(plaintext)
.multiplex(YamuxConfig::default())
.boxed();
let mut swarm = Swarm::new(transport, relay_behaviour, local_peer_id);
let relay_addr = Multiaddr::from_str("/memory/1234").unwrap()
.with(Protocol::P2p(PeerId::random().into()))
.with(Protocol::P2pCircuit);
let dst_addr = relay_addr.clone().with(Protocol::Memory(5678));
// Listen for incoming connections via relay node (1234).
Swarm::listen_on(&mut swarm, relay_addr).unwrap();
// Dial node (5678) via relay node (1234).
Swarm::dial_addr(&mut swarm, dst_addr).unwrap();
```
Co-authored-by: Pierre Krieger <pierre.krieger1708@gmail.com>
Co-authored-by: Roman Borschel <romanb@users.noreply.github.com>
Co-authored-by: David Craven <david@craven.ch>
2021-03-11 16:07:59 +01:00
|
|
|
|
|
|
|
message CircuitRelay {
|
|
|
|
|
|
|
|
enum Status {
|
|
|
|
SUCCESS = 100;
|
|
|
|
HOP_SRC_ADDR_TOO_LONG = 220;
|
|
|
|
HOP_DST_ADDR_TOO_LONG = 221;
|
|
|
|
HOP_SRC_MULTIADDR_INVALID = 250;
|
|
|
|
HOP_DST_MULTIADDR_INVALID = 251;
|
|
|
|
HOP_NO_CONN_TO_DST = 260;
|
|
|
|
HOP_CANT_DIAL_DST = 261;
|
|
|
|
HOP_CANT_OPEN_DST_STREAM = 262;
|
|
|
|
HOP_CANT_SPEAK_RELAY = 270;
|
|
|
|
HOP_CANT_RELAY_TO_SELF = 280;
|
|
|
|
STOP_SRC_ADDR_TOO_LONG = 320;
|
|
|
|
STOP_DST_ADDR_TOO_LONG = 321;
|
|
|
|
STOP_SRC_MULTIADDR_INVALID = 350;
|
|
|
|
STOP_DST_MULTIADDR_INVALID = 351;
|
|
|
|
STOP_RELAY_REFUSED = 390;
|
|
|
|
MALFORMED_MESSAGE = 400;
|
|
|
|
}
|
|
|
|
|
|
|
|
enum Type { // RPC identifier, either HOP, STOP or STATUS
|
|
|
|
HOP = 1;
|
|
|
|
STOP = 2;
|
|
|
|
STATUS = 3;
|
|
|
|
CAN_HOP = 4; // is peer a relay?
|
|
|
|
}
|
|
|
|
|
|
|
|
message Peer {
|
|
|
|
required bytes id = 1; // peer id
|
|
|
|
repeated bytes addrs = 2; // peer's known addresses
|
|
|
|
}
|
|
|
|
|
|
|
|
optional Type type = 1; // Type of the message
|
|
|
|
|
|
|
|
optional Peer srcPeer = 2; // srcPeer and dstPeer are used when Type is HOP or STOP
|
|
|
|
optional Peer dstPeer = 3;
|
|
|
|
|
|
|
|
optional Status code = 4; // Status code, used when Type is STATUS
|
|
|
|
}
|