rfc/specs/waku/waku-v2.md

5.3 KiB

title version status authors
Waku 2.0.0-alpha1 Raw Oskar Thorén <oskar@status.im>

Table of Contents

Abstract

Waku is a privacy-preserving peer-to-peer messaging protocol for resource restricted devices. It implements PubSub over libp2p and adds capabilities on top of it. These capabilities are: (i) retrieving historical messages for mostly-offline devices (ii) adaptive nodes, allowing for heterogeneous nodes to contribute, and (iii) bandwidth preservation for light nodes. This makes it ideal for running a p2p protocol on mobile.

Historically, it has its roots in Waku v1, which stems from Whisper, originally part of the Ethereum stack. However, Waku v2 acts more as a thin wrapper for PubSub and has a different API. It is implemented in an iterative manner where initial focus is on porting essential functionality to libp2p. See rough road map.

Motivation and goals

  1. Generalized messaging. Many applications requires some form of messaging protocol to communicate between different subsystems or different nodes. This messaging can be human-to-human or machine-to-machine or a mix.

  2. **Peer-to-peer.**These applications sometimes have requirements that make them suitable for peer-to-peer solutions.

  3. Resource restricted.These applications often run in constrained environments, where resources or the environment is restricted in some fashion. E.g.:

  • limited bandwidth, CPU, memory, disk, battery, etc
  • not being publicly connectable
  • only being intermittently connected; mostly-offline
  1. Privacy. These applications have a desire for some privacy guarantees, such as pseudonymity, metadata protection in transit, etc.

Waku provides a solution that satisfies these goals in a reasonable matter.

Definitions

TODO

Underlying Transports and Prerequisites

TODO Right now this is more like a set of components

Peer Discovery

WakuSub and PubSub don't provide an peer discovery mechanism. This has to be provided for by the environment.

PubSub interface

Waku v2 is implementing the PubSub interface in Libp2p. See PubSub interface for libp2p (r2, 2019-02-01) for more details.

Protocol Identifier

The current protocol identifier is: /wakusub/2.0.0-alpha1.

FloodSub

WakuSub is currently a subprotocol of FloodSub. Future versions of WakuSub will support GossipSub v1.0 and GossipSub 1.1.

Bridge mode

To maintain compatibility with Waku v1, a bridge mode can be achieved. See separate spec.

TODO Detail this in a separate spec

Wire Specification

We are using protobuf RPC messages between peers. Here's what the protobuf messages looks like, as defined in the PubSub interface. Please see PubSub interface spec for more details.

In this section we specify two things:

  1. How WakuSub is using these messages.
  2. Additional message types.

Protobuf

message RPC {
	repeated SubOpts subscriptions = 1;
	repeated Message publish = 2;

	message SubOpts {
		optional bool subscribe = 1;
		optional string topicid = 2;
	}
}

message Message {
	optional string from = 1;
	optional bytes data = 2;
	optional bytes seqno = 3;
	repeated string topicIDs = 4;
	optional bytes signature = 5;
	optional bytes key = 6;
}

WakuSub does not currently use the ControlMessage defined in GossipSub. However, later versions will add likely add this capability.

TopicDescriptor as defined in the PubSub interface spec is not currently used.

Historical message support

TODO(Dean): Fill out this section with historical message API.

Options used

NOTE: Should contain protobuf definitions that cover essentials of Waku v1. In cases where it doesn't cover, we can defer to siblings/child specs, e.g. such as the data field for encryption, etc.

Changelog

TODO

Copyright and related rights waived via CC0.

References

  1. Protocol Identifiers

  2. PubSub interface for libp2p (r2, 2019-02-01)

  3. GossipSub v1.0

  4. GossipSub v1.1

  5. Waku v1 spec

  6. Whisper spec (EIP627)

  7. Waku v2 plan