From 3353d426b42c034a22d4ca05cd219e1c966c1e75 Mon Sep 17 00:00:00 2001 From: benthecarman Date: Wed, 6 Dec 2023 04:01:13 -0600 Subject: [PATCH] NIP-88: Discreet Log Contracts over Nostr --- 88.md | 130 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 130 insertions(+) create mode 100644 88.md diff --git a/88.md b/88.md new file mode 100644 index 0000000000..1404dbb150 --- /dev/null +++ b/88.md @@ -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