13 KiB
| title | name | category | tags | editor | contributors | |||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| WAKU-API | Waku API definition | Standards Track |
|
Oleksandr Kozlov <oleksandr@status.im> |
|
Table of contents
- Table of contents
- Abstract
- Motivation
- Syntax
- API design
- The Waku API
- The Validation API
- Security/Privacy Considerations
- Copyright
Abstract
This document specifies an Application Programming Interface (API) that is RECOMMENDED for developers of the WAKU2 clients to implement, and for consumers to use as a single entry point to its functionalities.
This API defines the RECOMMENDED interface for leveraging Waku protocols to send and receive messages. Application developers SHOULD use it to access capabilities for peer discovery, message routing, and peer-to-peer reliability.
Motivation
The accessibility of Waku protocols is capped by the accessibility of their implementations, and hence API. This RFC enables a concerted effort to draft an API that is simple and accessible, and provides an opinion on sane defaults.
The API defined in this document is an opinionated-by-purpose method to use the more agnostic WAKU2 protocols.
Syntax
The keywords “MUST”, “MUST NOT”, “REQUIRED”, “SHALL”, “SHALL NOT”, “SHOULD”, “SHOULD NOT”, “RECOMMENDED”, “MAY”, and “OPTIONAL” in this document are to be interpreted as described in RFC2119.
API design
IDL
A custom Interface Definition Language (IDL) in YAML is used to define the Waku API. Existing IDL Such as OpenAPI, AsyncAPI or WIT do not exactly fit the requirements for this API. Hence, instead of having the reader learn a new IDL, we propose to use a simple IDL with self-describing syntax.
An alternative would be to choose a programming language. However, such choice may express unintended opinions on the API.
Primitive types and general guidelines
- No
defaultmeans that the value is mandatory, meaning adefaultvalue implies an optional parameter. - Primitive types are
string,int,bool,enumanduint - Complex pre-defined types are:
object: object and other nested types.array: iterable object containing values of all the same type.result: an enum type that either contains a value or void (success), or an error (failure); The error is left to the implementor.error: Left to the implementor on whethererrortypes arestringorobjectin the given language.
- Usage of
resultis RECOMMENDED, usage of exceptions is NOT RECOMMENDED, no matter the language.
Language mappings
How the API definition should be translated to specific languages.
language_mappings:
typescript:
naming_convention:
- functions: "camelCase"
- variables: "camelCase"
- types: "PascalCase"
nim:
naming_convention:
- functions: "camelCase"
- variables: "camelCase"
- types: "PascalCase"
Application
This API is designed for generic use and ease across all programming languages, for edge and relay type nodes.
The Waku API
api_version: "0.0.1"
library_name: "waku"
description: "Waku: a private and censorship-resistant message routing library."
Initialise Waku node
Type definitions
types:
WakuNode:
type: object
description: "A Waku node instance."
NodeConfig:
type: object
fields:
mode:
type: string
constraints: [ "edge", "relay" ]
default: "relay" # "edge" for mobile and browser devices.
description: "The mode of operation of the Waku node. Core protocols used by the node are inferred from this mode."
waku_config:
type: WakuConfig
default: TheWakuNetworkPreset
message_confirmation:
type: array<string>
constraints: [ "store", "filter" ]
default: []
description: "Whether to apply peer-to-peer reliability strategies to confirm that outgoing message have been received by other peers."
networking_config:
type: NetworkConfig
default: DefaultNetworkingConfig
eth_rpc_endpoints:
type: array<string>
description: "Eth/Web3 RPC endpoint URLs, required for RLN message validation. Accepting an object for ETH RPC will be added at a later stage. Fail-over available by passing multiple URLs"
WakuConfig:
type: object
fields:
entry_nodes:
type: array<string>
default: []
description: "Nodes to connect to; used for discovery bootstrapping and quick connectivity. enrtree and multiaddr formats are accepted. If not provided, node does not bootstrap to the network (local dev)."
static_store_nodes:
type: array<string>
default: []
# TODO: confirm behaviour at implementation time.
description: "The passed nodes are prioritised for store queries."
cluster_id:
type: uint
auto_sharding_config:
type: AutoShardingConfig
default: DefaultAutoShardingConfig
description: "The auto-sharding config, if sharding mode is `auto`"
message_validation:
type: MessageValidation
description: "If the default config for TWN is not used, then we still provide default configuration for message validation."
default: DefaultMessageValidation
NetworkingConfig:
type: object
fields:
listen_ipv4:
type: string
default: "0.0.0.0"
description: "The network IP address on which libp2p and discv5 listen for inbound connections. Not applicable for some environments such as the browser."
p2p_tcp_port:
type: uint
default: 60000
description: "The TCP port used for libp2p, relay, aka, general p2p message routing. Not applicable for some environments such as the browser."
discv5_udp_port:
type: uint
default: 9000
description: "The UDP port used for discv5. Not applicable for some environments such as the browser."
AutoShardingConfig:
type: object
fields:
num_shards_in_cluster:
type: uint
description: "The number of shards in the configured cluster; this is a globally agreed value for each cluster."
MessageValidation:
type: object
fields:
max_message_size:
type: string
default: "150 KiB"
description: "Maximum message size. Accepted units: KiB, KB, and B. e.g. 1024KiB; 1500 B; etc."
# For now, RLN is the only message validation available
rln_config:
type: RlnConfig
# If the default config for TWN is not used, then we do not apply RLN
default: none
RlnConfig:
type: object
fields:
contract_address:
type: string
description: "The address of the RLN contract exposes `root` and `getMerkleRoot` ABIs"
chain_id:
type: uint
description: "The chain id on which the RLN contract is deployed"
epoch_size_sec:
type: uint
description: "The epoch size to use for RLN, in seconds"
Function definitions
functions:
createNode:
description: "Initialise a Waku node instance"
parameters:
- name: nodeConfig
type: NodeConfig
description: "The Waku node configuration."
returns:
type: result<WakuNode, error>
Predefined values
values:
DefaultNetworkingConfig:
type: NetworkConfig
fields:
listen_ipv4: "0.0.0.0"
p2p_tcp_port: 60000
discv5_udp_port: 9000
TheWakuNetworkPreset:
type: WakuConfig
fields:
entry_nodes: [ "enrtree://AIRVQ5DDA4FFWLRBCHJWUWOO6X6S4ZTZ5B667LQ6AJU6PEYDLRD5O@sandbox.waku.nodes.status.im" ]
# On TWN, we encourage the usage of discovered store nodes
static_store_nodes: []
cluster_id: 1
auto_sharding_config:
fields:
num_shards_in_cluster: 8
message_validation: TheWakuNetworkMessageValidation
TheWakuNetworkMessageValidation:
type: MessageValidation
fields:
max_message_size: "150 KiB"
rln_config:
fields:
contract_address: "0xB9cd878C90E49F797B4431fBF4fb333108CB90e6"
chain_id: 59141
epoch_size_sec: 600 # 10 minutes
# If not preset is used, autosharding on one cluster is applied by default
# This is a safe default that abstract shards (content topic shard derivation), and it enables scaling at a later stage
DefaultAutoShardingConfig:
type: AutoShardingConfig
fields:
num_shards_in_cluster: 1
# If no preset is used, we only apply a max size limit to messages
DefaultMessageValidation:
type: MessageValidation
fields:
max_message_size: "150 KiB"
rln_config: none
Extended definitions
mode:
If the mode set is edge, the initialised WakuNode MUST mount:
And must use mount and use the following protocols to discover peers:
If the mode set is relay, the initialised WakuNode MUST mount:
- RELAY
- LIGHTPUSH as service node
- FILTER as service node
- PEER-EXCHANGE as service node
- STORE as client
And must use mount and use the following protocols to discover peers:
edge mode SHOULD be used if node functions in resource restricted environment,
whereas relay SHOULD be used if node has no strong hardware or bandwidth restrictions.
message_confirmation:
As defined in P2P-RELIABILITY. Proceed with confirmation on whether outgoing messages were received by other nodes in the network.
store: Store-based reliability for publishing is enabledfilter: Retransmit on possible message loss detection by installing filter subscription(s) matching the content topic(s) used for publishing.
The Validation API
WAKU2-RLN-RELAY is currently the primary message validation mechanism in place.
Work is scheduled to specify a validate API to enable plug-in validation. As part of this API, it will be expected that a validation object can be passed, that would contain all validation parameters including RLN.
In the time being, parameters specific to RLN are accepted for the message validation. RLN can also be disabled.
Security/Privacy Considerations
Copyright
Copyright and related rights waived via CC0.