3.2 KiB
Send messages using Waku Lightpush
Waku Light Push enables a client to receive a confirmation when sending a message.
The Waku Relay protocol sends messages to connected peers but does not provide any information on whether said peers have received messages. This can be an issue when facing potential connectivity issues. For example, when the connection drops easily, or it is connected to a small number of relay peers.
Waku Light Push allows a client to get a response from a remote peer when sending a message. Note this only guarantees that the remote peer has received the message, it cannot guarantee propagation to the network.
It also means weaker privacy properties as the remote peer knows the client is the originator of the message. Whereas with Waku Relay, a remote peer would not know whether the client created or forwarded the message.
You can find Waku Light Push’s specifications on Vac RFC.
Create a waku instance
package main
import (
"context"
"fmt"
"github.com/status-im/go-waku/waku/v2/node"
"github.com/status-im/go-waku/waku/v2/protocol/lightpush"
)
...
wakuNode, err := node.New(context.Background(),
node.WithLightPush(),
)
if err != nil {
fmt.Println(err)
return
}
if err := wakuNode.Start(); err != nil {
fmt.Println(err)
return
}
...
If the node also has the relay protocol enabled, it will be able to receive lightpush request to broadcast messages to other relay nodes
Sending messages
import (
"github.com/status-im/go-waku/waku/v2/protocol/pb"
"github.com/status-im/go-waku/waku/v2/utils"
)
...
msg := &pb.WakuMessage{
Payload: []byte("Hello World"),
Version: 0,
ContentTopic: protocol.NewContentTopic("basic2", 1, "test", "proto").String(),
Timestamp: utils.GetUnixEpoch(),
}
msgId, err = wakuNode.Lightpush().Publish(context.Background(), msg)
if err != nil {
log.Error("Error sending a message: ", err)
}
To send a message, it needs to be wrapped into a WakuMessage
protobuffer. The payload of the message is not limited to strings. Any kind of data that can be serialized
into a []byte
can be sent as long as it does not exceed the maximum length a message can have (~1MB)
The following functions can be used to publish a message:
wakuNode.Lightpush().Publish(ctx, msg, opts...)
- to send a message to the default waku pubsub topicwakuNode.Lightpush().PublishToTopic(ctx, msg, topic, opts...)
- to send a message to a custom pubsub topic
Both of these functions will return a message id on success, or an error if the message could not be published.
If no options are specified, go-waku will automatically choose the peer used to broadcast the message via Lightpush. This behaviour can be controlled via options:
Options
lightpush.WithPeer(peerID)
- use an specific peer ID (which should be part of the node peerstore) to broadcast the message withlightpush.WithAutomaticPeerSelection(host)
- automatically select a peer that supports lightpush protocol from the peerstore to broadcast the message withlightpush.WithFastestPeerSelection(ctx)
- automatically select a peer based on its ping reply time