mirror of
https://github.com/fluencelabs/rust-libp2p
synced 2025-05-30 11:11:21 +00:00
This commit upgrades the current gossipsub implementation to support the [v1.1 spec](https://github.com/libp2p/specs/blob/master/pubsub/gossipsub/gossipsub-v1.1.md). It adds a number of features, bug fixes and performance improvements. Besides support for all new 1.1 features, other improvements that are of particular note: - Improved duplicate LRU-time cache (this was previously a severe bottleneck for large message throughput topics) - Extended message validation configuration options - Arbitrary topics (users can now implement their own hashing schemes) - Improved message validation handling - Invalid messages are no longer dropped but sent to the behaviour for application-level processing (including scoring) - Support for floodsub, gossipsub v1 and gossipsub v2 - Protobuf encoding has been shifted into the behaviour. This has permitted two improvements: 1. Message size verification during publishing (report to the user if the message is too large before attempting to send). 2. Message fragmentation. If an RPC is too large it is fragmented into its sub components and sent in smaller chunks. Additional Notes The peer eXchange protocol defined in the v1.1 spec is inactive in its current form. The current implementation permits sending `PeerId` in `PRUNE` messages, however a `PeerId` is not sufficient to form a new connection to a peer. A `Signed Address Record` is required to safely transmit peer identity information. Once these are confirmed (https://github.com/libp2p/specs/pull/217) a future PR will implement these and make PX usable. Co-authored-by: Max Inden <mail@max-inden.de> Co-authored-by: Rüdiger Klaehn <rklaehn@protonmail.com> Co-authored-by: blacktemplar <blacktemplar@a1.net> Co-authored-by: Rüdiger Klaehn <rklaehn@gmail.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Roman S. Borschel <roman@parity.io> Co-authored-by: Roman Borschel <romanb@users.noreply.github.com> Co-authored-by: David Craven <david@craven.ch>
85 lines
1.9 KiB
Protocol Buffer
85 lines
1.9 KiB
Protocol Buffer
syntax = "proto2";
|
|
|
|
package gossipsub.pb;
|
|
|
|
message RPC {
|
|
repeated SubOpts subscriptions = 1;
|
|
repeated Message publish = 2;
|
|
|
|
message SubOpts {
|
|
optional bool subscribe = 1; // subscribe or unsubscribe
|
|
optional string topic_id = 2;
|
|
}
|
|
|
|
optional ControlMessage control = 3;
|
|
}
|
|
|
|
message Message {
|
|
optional bytes from = 1;
|
|
optional bytes data = 2;
|
|
optional bytes seqno = 3;
|
|
required string topic = 4;
|
|
optional bytes signature = 5;
|
|
optional bytes key = 6;
|
|
}
|
|
|
|
message ControlMessage {
|
|
repeated ControlIHave ihave = 1;
|
|
repeated ControlIWant iwant = 2;
|
|
repeated ControlGraft graft = 3;
|
|
repeated ControlPrune prune = 4;
|
|
}
|
|
|
|
message ControlIHave {
|
|
optional string topic_id = 1;
|
|
repeated bytes message_ids = 2;
|
|
}
|
|
|
|
message ControlIWant {
|
|
repeated bytes message_ids= 1;
|
|
}
|
|
|
|
message ControlGraft {
|
|
optional string topic_id = 1;
|
|
}
|
|
|
|
message ControlPrune {
|
|
optional string topic_id = 1;
|
|
repeated PeerInfo peers = 2; // gossipsub v1.1 PX
|
|
optional uint64 backoff = 3; // gossipsub v1.1 backoff time (in seconds)
|
|
}
|
|
|
|
message PeerInfo {
|
|
optional bytes peer_id = 1;
|
|
optional bytes signed_peer_record = 2;
|
|
}
|
|
|
|
// topicID = hash(topicDescriptor); (not the topic.name)
|
|
message TopicDescriptor {
|
|
optional string name = 1;
|
|
optional AuthOpts auth = 2;
|
|
optional EncOpts enc = 3;
|
|
|
|
message AuthOpts {
|
|
optional AuthMode mode = 1;
|
|
repeated bytes keys = 2; // root keys to trust
|
|
|
|
enum AuthMode {
|
|
NONE = 0; // no authentication, anyone can publish
|
|
KEY = 1; // only messages signed by keys in the topic descriptor are accepted
|
|
WOT = 2; // web of trust, certificates can allow publisher set to grow
|
|
}
|
|
}
|
|
|
|
message EncOpts {
|
|
optional EncMode mode = 1;
|
|
repeated bytes key_hashes = 2; // the hashes of the shared keys used (salted)
|
|
|
|
enum EncMode {
|
|
NONE = 0; // no encryption, anyone can read
|
|
SHAREDKEY = 1; // messages are encrypted with shared key
|
|
WOT = 2; // web of trust, certificates can allow publisher set to grow
|
|
}
|
|
}
|
|
}
|