438 lines
16 KiB
Markdown
Raw Permalink Normal View History

---
2025-06-30 14:39:30 +10:00
title: WAKU-API
name: Waku API definition
category: Standards Track
2025-09-26 15:56:10 +10:00
status: raw
tags: [reliability, application, api, protocol composition]
editor: Oleksandr Kozlov <oleksandr@status.im>
contributors:
- Oleksandr Kozlov <oleksandr@status.im>
- Prem Chaitanya Prathi <prem@status.im>
- Franck Royer <franck@status.im>
---
## Table of contents
2025-09-25 14:03:10 +10:00
<!-- TOC -->
* [Table of contents](#table-of-contents)
* [Abstract](#abstract)
* [Motivation](#motivation)
* [Syntax](#syntax)
* [API design](#api-design)
* [IDL](#idl)
* [Primitive types and general guidelines](#primitive-types-and-general-guidelines)
* [Language mappings](#language-mappings)
* [Application](#application)
* [The Waku API](#the-waku-api)
* [Initialise Waku node](#initialise-waku-node)
* [Type definitions](#type-definitions)
* [Function definitions](#function-definitions)
* [Predefined values](#predefined-values)
* [Extended definitions](#extended-definitions)
2025-11-13 16:20:02 +11:00
* [Send messages](#send-messages)
* [Type definitions](#type-definitions-1)
* [Function definitions](#function-definitions-1)
* [Extended definitions](#extended-definitions-1)
* [Event source](#event-source)
* [Type definitions](#type-definitions-2)
2025-09-25 14:03:10 +10:00
* [The Validation API](#the-validation-api)
* [Security/Privacy Considerations](#securityprivacy-considerations)
* [Copyright](#copyright)
<!-- TOC -->
## Abstract
This document specifies an Application Programming Interface (API) that is RECOMMENDED for developers of the [WAKU2](https://github.com/vacp2p/rfc-index/blob/7b443c1aab627894e3f22f5adfbb93f4c4eac4f6/waku/standards/core/10/waku2.md) clients to implement,
and for consumers to use as a single entry point to its functionalities.
2025-11-13 16:20:02 +11:00
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.
2025-11-13 16:20:02 +11:00
TODO: This spec must be further extended to include connection health inspection, subscription, and store hash queries.
2025-09-26 15:53:59 +10:00
## Motivation
The accessibility of Waku protocols is capped by the accessibility of their implementations, and hence API.
2025-06-24 12:23:12 +10:00
This RFC enables a concerted effort to draft an API that is simple and accessible, and provides an opinion on sane defaults.
2025-09-26 11:39:49 +10:00
The API defined in this document is an opinionated-by-purpose method to use the more agnostic [WAKU2](https://github.com/vacp2p/rfc-index/blob/main/waku/standards/core/10/waku2.md) 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](https://www.ietf.org/rfc/rfc2119.txt).
## 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.
2025-06-30 15:25:12 +10:00
### Primitive types and general guidelines
- No `default` means that the value is mandatory, meaning a `default` value implies an optional parameter.
2025-10-08 23:49:54 +02:00
- Primitive types are `string`, `int`, `bool`, `byte`, `enum` and `uint`
2025-06-24 12:23:12 +10:00
- Complex pre-defined types are:
2025-09-26 11:39:49 +10:00
- `object`: object and other nested types.
2025-11-13 16:20:02 +11:00
- `array`: iterable object containing values of all the same type. Syntax: `array<T>` where `T` is the element type (e.g., `array<string>`, `array<byte>`).
2025-09-25 13:35:05 +10:00
- `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 whether `error` types are `string` or `object` in the given language.
2025-11-13 16:20:02 +11:00
- `event_emitter`: an object that emits events with specific event names and associated event data types.
2025-06-30 15:25:12 +10:00
- Usage of `result` is RECOMMENDED, usage of exceptions is NOT RECOMMENDED, no matter the language.
2025-09-26 16:00:59 +10:00
TODO: Review whether to specify categories of errors.
2025-06-30 15:25:12 +10:00
### Language mappings
2025-06-18 16:34:21 +10:00
How the API definition should be translated to specific languages.
```yaml
language_mappings:
typescript:
2025-06-18 16:34:21 +10:00
naming_convention:
- functions: "camelCase"
- variables: "camelCase"
2025-06-18 16:34:21 +10:00
- types: "PascalCase"
2025-11-13 16:20:02 +11:00
event_emitter: "Use EventEmitter object with `emit`, `addListener`, etc; with event name the string specified in IDL. For example. eventEmitter.emit('message:sent',...)"
nim:
2025-06-18 16:34:21 +10:00
naming_convention:
- functions: "camelCase"
- variables: "camelCase"
- types: "PascalCase"
2025-11-13 16:20:02 +11:00
event_emitter: TBD
2025-06-18 16:34:21 +10:00
```
2025-06-30 15:25:12 +10:00
### Application
2025-09-26 23:05:58 +10:00
This API is designed for generic use and ease across all programming languages, for `edge` and `core` type nodes.
2025-06-30 15:25:12 +10:00
## The Waku API
```yaml
api_version: "0.0.1"
library_name: "waku"
description: "Waku: a private and censorship-resistant message routing library."
```
### Initialise Waku node
2025-06-30 15:25:12 +10:00
#### Type definitions
```yaml
types:
WakuNode:
2025-09-26 11:39:49 +10:00
type: object
description: "A Waku node instance."
2025-11-13 16:20:02 +11:00
fields:
message_events:
type: MessageEvents
description: "Message related events."
2025-08-05 15:28:46 +10:00
2025-09-12 13:40:54 +10:00
NodeConfig:
2025-09-26 11:39:49 +10:00
type: object
fields:
2025-08-05 15:28:46 +10:00
mode:
type: string
2025-09-26 23:05:58 +10:00
constraints: [ "edge", "core" ]
default: "core" # "edge" for mobile and browser devices.
description: "The mode of operation of the Waku node; 'edge' of the network: relies on other nodes for message routing; 'core' of the network: fully participate to message routing."
protocols_config:
type: ProtocolsConfig
default: TheWakuNetworkPreset
2025-09-15 15:31:50 +10:00
networking_config:
type: NetworkConfig
2025-09-26 15:47:47 +10:00
default: DefaultNetworkingConfig
2025-09-10 14:19:52 +10:00
eth_rpc_endpoints:
type: array<string>
2025-09-26 16:00:59 +10:00
description: "Eth/Web3 RPC endpoint URLs, only required when RLN is used for message validation; fail-over available by passing multiple URLs. Accepting an object for ETH RPC will be added at a later stage."
2025-06-24 12:43:11 +10:00
ProtocolsConfig:
2025-09-26 11:39:49 +10:00
type: object
2025-06-24 12:43:11 +10:00
fields:
2025-09-26 11:32:23 +10:00
entry_nodes:
2025-06-24 12:43:11 +10:00
type: array<string>
2025-09-15 15:31:50 +10:00
default: []
2025-09-26 15:47:47 +10:00
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)."
2025-06-24 12:43:11 +10:00
static_store_nodes:
type: array<string>
default: []
2025-09-26 11:39:49 +10:00
# TODO: confirm behaviour at implementation time.
description: "The passed nodes are prioritised for store queries."
2025-06-24 12:43:11 +10:00
cluster_id:
type: uint
2025-11-13 16:20:02 +11:00
description: "The cluster ID for the Waku network. Cluster IDs are defined in [RELAY-SHARDING](https://github.com/vacp2p/rfc-index/blob/main/waku/standards/core/51/relay-sharding.md) and allocated in [RELAY-STATIC-SHARD-ALLOC](https://github.com/waku-org/specs/blob/master/informational/relay-static-shard-alloc.md)."
2025-06-24 12:43:11 +10:00
auto_sharding_config:
type: AutoShardingConfig
default: DefaultAutoShardingConfig
2025-08-05 15:28:46 +10:00
description: "The auto-sharding config, if sharding mode is `auto`"
2025-08-06 16:15:40 +10:00
message_validation:
type: MessageValidation
2025-09-26 11:39:49 +10:00
description: "If the default config for TWN is not used, then we still provide default configuration for message validation."
2025-08-06 16:15:40 +10:00
default: DefaultMessageValidation
2025-06-24 12:43:11 +10:00
2025-09-15 15:31:50 +10:00
NetworkingConfig:
2025-09-26 15:47:47 +10:00
type: object
2025-09-15 15:31:50 +10:00
fields:
listen_ipv4:
2025-09-15 15:31:50 +10:00
type: string
default: "0.0.0.0"
2025-09-26 11:39:49 +10:00
description: "The network IP address on which libp2p and discv5 listen for inbound connections. Not applicable for some environments such as the browser."
2025-09-15 15:31:50 +10:00
p2p_tcp_port:
type: uint
default: 60000
2025-09-26 16:08:15 +10:00
description: "The TCP port used for libp2p, relay, etc aka, general p2p message routing. Not applicable for some environments such as the browser."
2025-09-15 15:31:50 +10:00
discv5_udp_port:
type: uint
default: 9000
2025-09-26 11:39:49 +10:00
description: "The UDP port used for discv5. Not applicable for some environments such as the browser."
2025-09-15 15:31:50 +10:00
AutoShardingConfig:
2025-09-26 11:39:49 +10:00
type: object
fields:
2025-08-05 15:28:46 +10:00
num_shards_in_cluster:
type: uint
description: "The number of shards in the configured cluster; this is a globally agreed value for each cluster."
2025-08-06 16:15:40 +10:00
MessageValidation:
2025-09-26 11:39:49 +10:00
type: object
2025-08-06 16:15:40 +10:00
fields:
2025-09-25 13:48:40 +10:00
max_message_size:
type: string
default: "150 KiB"
description: "Maximum message size. Accepted units: KiB, KB, and B. e.g. 1024KiB; 1500 B; etc."
2025-08-06 16:15:40 +10:00
# For now, RLN is the only message validation available
rln_config:
type: RlnConfig
2025-08-06 16:15:40 +10:00
# If the default config for TWN is not used, then we do not apply RLN
default: none
RlnConfig:
2025-09-26 11:39:49 +10:00
type: object
2025-08-06 16:15:40 +10:00
fields:
contract_address:
type: string
2025-11-13 16:20:02 +11:00
description: "The address of the RLN contract that exposes `root` and `getMerkleRoot` ABIs"
2025-08-06 16:15:40 +10:00
chain_id:
type: uint
2025-11-13 16:20:02 +11:00
description: "The chain ID on which the RLN contract is deployed"
2025-08-06 16:15:40 +10:00
epoch_size_sec:
type: uint
description: "The epoch size to use for RLN, in seconds"
```
2025-06-30 15:25:12 +10:00
#### Function definitions
```yaml
functions:
2025-09-09 14:49:12 +10:00
createNode:
description: "Initialise a Waku node instance"
parameters:
2025-09-26 15:47:47 +10:00
- name: nodeConfig
type: NodeConfig
description: "The Waku node configuration."
returns:
type: result<WakuNode, error>
```
2025-06-30 15:25:12 +10:00
#### Predefined values
2025-06-24 12:43:11 +10:00
```yaml
values:
2025-06-30 15:25:12 +10:00
2025-09-15 15:31:50 +10:00
DefaultNetworkingConfig:
type: NetworkConfig
fields:
2025-09-26 15:47:47 +10:00
listen_ipv4: "0.0.0.0"
2025-09-15 15:31:50 +10:00
p2p_tcp_port: 60000
discv5_udp_port: 9000
2025-06-24 12:43:11 +10:00
TheWakuNetworkPreset:
type: ProtocolsConfig
2025-06-24 12:43:11 +10:00
fields:
2025-09-26 11:32:23 +10:00
entry_nodes: [ "enrtree://AIRVQ5DDA4FFWLRBCHJWUWOO6X6S4ZTZ5B667LQ6AJU6PEYDLRD5O@sandbox.waku.nodes.status.im" ]
2025-09-25 13:50:15 +10:00
# On TWN, we encourage the usage of discovered store nodes
static_store_nodes: []
2025-06-24 12:43:11 +10:00
cluster_id: 1
2025-08-06 16:15:40 +10:00
auto_sharding_config:
2025-11-13 16:20:02 +11:00
type: AutoShardingConfig
2025-08-06 16:15:40 +10:00
fields:
2025-09-26 15:47:47 +10:00
num_shards_in_cluster: 8
2025-09-10 14:15:23 +10:00
message_validation: TheWakuNetworkMessageValidation
2025-06-30 15:25:12 +10:00
2025-08-06 16:15:40 +10:00
TheWakuNetworkMessageValidation:
type: MessageValidation
2025-06-24 12:43:11 +10:00
fields:
2025-09-26 15:47:47 +10:00
max_message_size: "150 KiB"
2025-08-06 16:15:40 +10:00
rln_config:
2025-11-13 16:20:02 +11:00
type: RlnConfig
2025-08-06 16:15:40 +10:00
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:
2025-08-05 15:28:46 +10:00
num_shards_in_cluster: 1
2025-08-06 16:15:40 +10:00
# If no preset is used, we only apply a max size limit to messages
DefaultMessageValidation:
type: MessageValidation
fields:
2025-09-26 15:47:47 +10:00
max_message_size: "150 KiB"
2025-08-06 16:15:40 +10:00
rln_config: none
2025-06-24 12:43:11 +10:00
```
2025-06-30 15:25:12 +10:00
#### Extended definitions
2025-09-26 15:47:47 +10:00
**`mode`**:
2025-09-29 21:15:32 +10:00
If the `mode` set is `edge`, the initialised `WakuNode` SHOULD use:
2025-06-30 15:25:12 +10:00
- [LIGHTPUSH](https://github.com/vacp2p/rfc-index/blob/main/waku/standards/core/19/lightpush.md) as client
- [FILTER](https://github.com/vacp2p/rfc-index/blob/main/waku/standards/core/12/filter.md) as client
- [STORE](https://github.com/vacp2p/rfc-index/blob/main/waku/standards/core/13/store.md) as client
2025-09-26 16:05:24 +10:00
- [METADATA](https://github.com/vacp2p/rfc-index/blob/main/waku/standards/core/66/metadata.md) as client
2025-09-29 21:15:32 +10:00
- [PEER-EXCHANGE](https://github.com/vacp2p/rfc-index/blob/main/waku/standards/core/34/peer-exchange.md) as client
- [P2P-RELIABILITY](/standards/application/p2p-reliability.md)
2025-06-30 15:25:12 +10:00
2025-09-29 21:15:32 +10:00
If the `mode` set is `core`, the initialised `WakuNode` SHOULD use:
2025-06-30 15:25:12 +10:00
- [RELAY](https://github.com/vacp2p/rfc-index/blob/main/waku/standards/core/11/relay.md)
- [LIGHTPUSH](https://github.com/vacp2p/rfc-index/blob/main/waku/standards/core/19/lightpush.md) as service node
- [FILTER](https://github.com/vacp2p/rfc-index/blob/main/waku/standards/core/12/filter.md) as service node
- [STORE](https://github.com/vacp2p/rfc-index/blob/main/waku/standards/core/13/store.md) as client
2025-09-26 16:05:24 +10:00
- [METADATA](https://github.com/vacp2p/rfc-index/blob/main/waku/standards/core/66/metadata.md) as client and service node
2025-09-29 21:15:32 +10:00
- [P2P-RELIABILITY](/standards/application/p2p-reliability.md)
2025-06-30 15:25:12 +10:00
- [DISCV5](https://github.com/vacp2p/rfc-index/blob/main/waku/standards/core/33/discv5.md)
2025-09-29 21:15:32 +10:00
- [PEER-EXCHANGE](https://github.com/vacp2p/rfc-index/blob/main/waku/standards/core/34/peer-exchange.md) as client and service node
- [RENDEZVOUS](https://github.com/waku-org/specs/blob/master/standards/core/rendezvous.md) as client and service node
2025-06-30 15:25:12 +10:00
`edge` mode SHOULD be used if node functions in resource restricted environment,
2025-09-26 23:05:58 +10:00
whereas `core` SHOULD be used if node has no strong hardware or bandwidth restrictions.
2025-06-30 15:25:12 +10:00
2025-10-07 00:42:32 +02:00
## Send messages
#### Type definitions
```yaml
types:
2025-10-28 01:27:38 +01:00
MessageEnvelope:
2025-10-07 00:42:32 +02:00
type: object
fields:
2025-10-29 22:22:45 +01:00
content_topic:
2025-10-07 00:42:32 +02:00
type: string
2025-10-08 23:43:38 +02:00
description: "Content-based filtering field as defined in [TOPICS](https://github.com/vacp2p/rfc-index/blob/main/waku/informational/23/topics.md#content-topics)"
2025-10-07 00:42:32 +02:00
payload:
2025-10-08 23:49:54 +02:00
type: array<byte>
description: "The message data to be sent."
2025-10-07 00:42:32 +02:00
ephemeral:
type: bool
default: false
2025-10-08 23:49:54 +02:00
description: "Whether the message is ephemeral. Read at [ATTRIBUTES](https://github.com/vacp2p/rfc-index/blob/main/waku/standards/core/14/message.md#message-attributes)"
2025-10-07 00:42:32 +02:00
RequestId:
type: string
description: "A unique identifier for a request"
```
#### Function definitions
```yaml
functions:
send:
2025-10-08 23:49:54 +02:00
description: "Send a message through the network."
2025-10-07 00:42:32 +02:00
parameters:
- name: message
2025-10-28 01:27:38 +01:00
type: MessageEnvelope
description: "Parameters for sending the message."
2025-10-07 00:42:32 +02:00
returns:
type: result<RequestId, error>
```
#### Extended definitions
2025-10-28 01:27:38 +01:00
A first `message` sent with a certain `contentTopic`
SHOULD trigger a subscription based on `Subscribe to messages` section for such `contentTopic`.
2025-10-07 00:42:32 +02:00
2025-10-21 01:19:16 +02:00
The node uses [P2P-RELIABILITY](/standards/application/p2p-reliability.md) strategies to ensure message delivery.
## Event source
#### Type definitions
2025-11-13 00:47:54 +01:00
```yml
2025-10-21 01:19:16 +02:00
types:
MessageSentEvent:
type: object
2025-11-13 00:43:11 +01:00
description: "Event emitted when a message is sent to the network"
2025-10-21 01:19:16 +02:00
fields:
2025-10-29 22:22:45 +01:00
request_id:
2025-10-21 01:19:16 +02:00
type: RequestId
description: "The request ID associated with the sent message"
2025-10-29 22:22:45 +01:00
message_hash:
2025-10-28 01:27:38 +01:00
type: string
description: "Hash of the message that got sent to the network"
2025-10-21 01:19:16 +02:00
MessageErrorEvent:
type: object
2025-11-13 00:43:11 +01:00
description: "Event emitted when a message send operation fails"
2025-10-21 01:19:16 +02:00
fields:
2025-10-29 22:22:45 +01:00
request_id:
2025-10-21 01:19:16 +02:00
type: RequestId
description: "The request ID associated with the failed message"
2025-10-29 22:22:45 +01:00
message_hash:
2025-10-28 01:27:38 +01:00
type: string
description: "Optional property. Hash of the message that got error"
2025-10-21 01:19:16 +02:00
error:
type: string
description: "Error message describing what went wrong"
2025-10-23 00:17:09 +02:00
MessagePropagatedEvent:
2025-10-21 01:19:16 +02:00
type: object
2025-11-13 16:20:02 +11:00
description: "Confirmation that a message has been correctly delivered to some neighbouring nodes."
2025-10-21 01:19:16 +02:00
fields:
2025-10-29 22:22:45 +01:00
request_id:
2025-10-21 01:19:16 +02:00
type: RequestId
2025-10-23 00:17:09 +02:00
description: "The request ID associated with the propagated message in the network"
2025-10-29 22:22:45 +01:00
message_hash:
2025-10-21 01:19:16 +02:00
type: string
2025-10-23 00:17:09 +02:00
description: "Hash of the message that got propagated within the network"
2025-10-21 01:19:16 +02:00
2025-11-13 16:20:02 +11:00
MessageEvents:
2025-10-28 01:27:38 +01:00
type: event_emitter
2025-10-21 01:19:16 +02:00
description: "Event source for message-related events"
2025-11-13 00:47:54 +01:00
events:
"message:sent":
type: MessageSentEvent
"message:error":
type: MessageErrorEvent
"message:propagated":
type: MessagePropagatedEvent
2025-10-21 01:19:16 +02:00
```
2025-10-07 00:42:32 +02:00
2025-07-21 22:07:14 +10:00
## The Validation API
2025-06-30 15:25:12 +10:00
2025-09-25 13:48:40 +10:00
[WAKU2-RLN-RELAY](https://github.com/vacp2p/rfc-index/blob/main/waku/standards/core/17/rln-relay.md) is currently the primary message validation mechanism in place.
2025-07-21 22:07:14 +10:00
Work is scheduled to specify a validate API to enable plug-in validation.
2025-09-25 13:48:40 +10:00
As part of this API, it will be expected that a validation object can be passed,
2025-07-21 22:07:14 +10:00
that would contain all validation parameters including RLN.
2025-09-25 13:48:40 +10:00
In the time being, parameters specific to RLN are accepted for the message validation.
RLN can also be disabled.
2025-06-30 15:25:12 +10:00
## Security/Privacy Considerations
See [WAKU2-ADVERSARIAL-MODELS](https://github.com/waku-org/specs/blob/master/informational/adversarial-models.md).
## Copyright
Copyright and related rights waived via [CC0](https://creativecommons.org/publicdomain/zero/1.0/).