-
Notifications
You must be signed in to change notification settings - Fork 577
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
NIP-88: Discreet Log Contracts over Nostr
- Loading branch information
1 parent
c07f0ea
commit 3353d42
Showing
1 changed file
with
130 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,130 @@ | ||
NIP-88 | ||
====== | ||
|
||
Discreet Log Contracts over nostr | ||
----------------- | ||
|
||
`draft` `optional` | ||
|
||
This NIP describes a way to use Discreet Log Contracts (DLCs) over Nostr. This comes in four main | ||
components: `kind:28_888` for sending DLC messages between wallets. `kind:88` for posting DLC offers to the global | ||
market. `kind:89` and `kind:90` for sending DLC oracle signatures to the global market. And `kind:91` for a DLC | ||
"receipt" that can publish the result of a DLC for social consumption. | ||
|
||
## DLC Messages | ||
|
||
DLCs typically use [BOLT 8](https://github.com/lightning/bolts/blob/master/08-transport.md) for sending messages but | ||
this has various problems: it requires the ability to accept incoming connections and an always-on node. Nostr provides | ||
a unique opportunity to use a different transport layer for DLCs. This NIP proposes a new `kind:28_888` message that | ||
acts like a mailbox for DLC messages. The DLC messages are sent over nostr and available for the user the next time | ||
they open their wallet. This allows for a more mobile-friendly DLC experience. | ||
|
||
### `kind:28_888` | ||
|
||
// todo probably don't want an ephemeral event for this, but it's a good starting point | ||
|
||
Kind 28_888 is a simple message that contains a [NIP04](04.md) encrypted DLC message and it tagged with the recipient's | ||
public key with a `p` tag and if it is in reply to another event, that event should be tagged with an `e` tag. | ||
|
||
```json | ||
{ | ||
"kind": 28888, | ||
"content": "TJob1dQrf2ndsmdbeGU+05HT5GMnBSx3fx8QdDY/g3NvCa7klfzgaQCmRZuo1d3WQjHDOjzSY1+MgTK5WjewFFumCcOZniWtOMSga9tJk1ky00tLoUUzyLnb1v9x95h/iT/KpkICJyAwUZ+LoJBUzLrK52wNTMt8M5jSLvCkRx8C0BmEwA/00pjOp4eRndy19H4WUUehhjfV2/VV/k4hMAjJ7Bb5Hp9xdmzmCLX9+64+MyeIQQjQAHPj8dkSsRahP7KS3MgMpjaF8nL48Bg5suZMxJayXGVp3BLtgRZx5z5nOk9xyrYk+71e2tnP9IDvSMkiSe76BcMct+m7kGVrRcavDI4n62goNNh25IpghT+a1OjjkpXt9me5wmaL7fxffV1pchdm+A7KJKIUU3kLC7QbUifF22EucRA9xiEyxETusNludBXN24O3llTbOy4vYFsq35BeZl4v1Cse7n2htZicVkItMz3wjzj1q1I1VqbnorNXFgllkRZn4/YXfTG/RMnoK/bDogRapOV+XToZ+IvsN0BqwKSUDx+ydKpci6htDRF2WDRkU+VQMqwM0CoLzy2H6A2cqyMMMD9SLRRzBg==?iv=S3rFeFr1gsYqmQA7bNnNTQ==", | ||
"tags": [ | ||
[ | ||
"p", | ||
"04c915daefee38317fa734444acee390a8269fe5810b2241e5e6dd343dfbecc9" | ||
], | ||
[ | ||
"e", | ||
"9ae37aa68f48645127299e9453eb5d908a0cbb6058ff340d528ed4d37c8994fb" | ||
] | ||
], | ||
"pubkey": "97c70a44366a6535c145b333f973ea86dfdc2d7a99da618c40c64705ad98e322", | ||
"created_at": 1679673265, | ||
"id": "30efed56a035b2549fcaeec0bf2c1595f9a9b3bb4b1a38abaf8ee9041c4b7d93", | ||
"sig": "f2cb581a84ed10e4dc84937bd98e27acac71ab057255f6aa8dfa561808c981fe8870f4a03c1e3666784d82a9c802d3704e174371aa13d63e2aeaf24ff5374d9d" | ||
} | ||
``` | ||
|
||
## DLC Offers | ||
|
||
DLCs are done between two parties and Nostr provides a unique opportunity to create a global market for DLCs. This | ||
market can be constructed with a simple list of DLC offers that can be filtered by the user's wallet. The user can then | ||
select an offer and send a message to the offerer to begin the DLC process. `kind:88` is an event that contains a DLC | ||
offer. | ||
|
||
### `kind:88` | ||
|
||
```jsonc | ||
{ | ||
"kind": 88, | ||
"content": "base64 contract details", | ||
"tags": [ | ||
[ | ||
"relays", | ||
"wss://nostr.mutinywallet.com", | ||
"wss://relay.damus.io" | ||
], | ||
[ | ||
"expires", // todo this is a good way to do this? | ||
"1695327657" | ||
] | ||
], | ||
"pubkey": "97c70a44366a6535c145b333f973ea86dfdc2d7a99da618c40c64705ad98e322", | ||
"created_at": 1679673265, | ||
"id": "30efed56a035b2549fcaeec0bf2c1595f9a9b3bb4b1a38abaf8ee9041c4b7d93", | ||
"sig": "f2cb581a84ed10e4dc84937bd98e27acac71ab057255f6aa8dfa561808c981fe8870f4a03c1e3666784d82a9c802d3704e174371aa13d63e2aeaf24ff5374d9d" | ||
} | ||
``` | ||
|
||
## DLC Oracle Gossip | ||
|
||
DLCs require an oracle to attest to the outcome of real world events. This is done by the oracle signing a message | ||
containing the outcome of the event. Before they attest to the outcome, they must create an announcement where they | ||
publish the intent to sign the future event. This announcement is then used by the DLC participants to create the | ||
contract. Here we define two events, `kind:89` and `kind:90` that are used to publish the oracle's announcement and | ||
attestations respectively. | ||
|
||
### `kind:89` | ||
|
||
```jsonc | ||
{ | ||
"kind": 89, | ||
"content": "base64 oracle annoucement", | ||
"tags": [ | ||
[ | ||
"relays", // the relays the oracle will publish attestations to | ||
"wss://nostr.mutinywallet.com", | ||
"wss://relay.damus.io" | ||
], | ||
], | ||
"pubkey": "97c70a44366a6535c145b333f973ea86dfdc2d7a99da618c40c64705ad98e322", | ||
"created_at": 1679673265, | ||
"id": "30efed56a035b2549fcaeec0bf2c1595f9a9b3bb4b1a38abaf8ee9041c4b7d93", | ||
"sig": "f2cb581a84ed10e4dc84937bd98e27acac71ab057255f6aa8dfa561808c981fe8870f4a03c1e3666784d82a9c802d3704e174371aa13d63e2aeaf24ff5374d9d" | ||
} | ||
``` | ||
|
||
### `kind:90` | ||
|
||
```jsonc | ||
{ | ||
"kind": 89, | ||
"content": "base64 oracle attestation", | ||
"pubkey": "97c70a44366a6535c145b333f973ea86dfdc2d7a99da618c40c64705ad98e322", | ||
"created_at": 1679673265, | ||
"id": "30efed56a035b2549fcaeec0bf2c1595f9a9b3bb4b1a38abaf8ee9041c4b7d93", | ||
"sig": "f2cb581a84ed10e4dc84937bd98e27acac71ab057255f6aa8dfa561808c981fe8870f4a03c1e3666784d82a9c802d3704e174371aa13d63e2aeaf24ff5374d9d" | ||
} | ||
``` | ||
|
||
## DLC Receipts | ||
|
||
DLCs can be fun, social events. This NIP proposes a `kind:91` event that can be used to publish the result of a DLC | ||
contract. This event can be used to show off the result of a DLC to the user's followers, similar [Zaps](57.md) but for | ||
DLC bets. | ||
|
||
### `kind:91` | ||
|
||
todo I still need to think about this one |