powrelay.xyz

Buying proof of work

The interaction with the API happens over a websocket. All json should be sent on a single line, it's pretty printed here for readability. For an example client see here.

To connect to the API server:

$ websocat --origin https://powrelay.xyz https://powrelay.xyz/api

Once connected, you can send a request for proof of work:

{
	"target_difficulty": <number of leading zeroes in the binary representation>,
	"pubkey": <pubkey>,
	"kind": <kind>,
	"tags": <tags>,
	"content": <content>
}
If there's an error, the server will send an error message:
{
	"status": "ERROR",
	"reason": <error details>
}
Otherwise, the server will send back a payment request:
{
	"payment_request": <bech32-serialized lightning invoice>
}
You can verify that the description_hash of this invoice matches the sha256 hash of the UTF-8 JSON-serialized string (with no white space or line breaks) of the following structure:
[
	"POW",
	<target difficulty, as number>,
	<pubkey, as a (lowercase) hex string>,
	<kind, as a number>,
	<tags, as an array of arrays of non-null strings>,
	<content, as a string>
]

When the payment is accepted the server will reply with a payment received message:

{
	"status": "Payment received"
}
and start working on the request. Only when a nonce with sufficient target difficulty is found, will the server settle the payment and reply with the unsigned event:
{
	"pubkey": <pubkey>,
	"kind": <kind>,
	"tags": <tags>,
	"content": <content>
}
If an error happens, the server will cancel the invoice. If a bug causes the invoice to be settled without the unsigned event being delivered, the invoice and preimage constitute proof of payment, so please contact me .