Compare commits

..

5 Commits

Author SHA1 Message Date
fiatjaf_
9fcff79cfd change kind of community post from 1 to 72 2023-10-28 06:46:33 -03:00
Mike O'Bank
ca73c5dd5e Clarify Unsigned Event Object type 2023-10-21 16:05:32 -03:00
Egge
4216f0bf2f added nodestr 2023-10-19 14:32:41 -03:00
fiatjaf
cf672b764b remove useless "block" tag on OTS. 2023-10-17 07:38:53 -03:00
Mike O'Bank
202e18f2b2 Nip 06 test vectors (#819) 2023-10-12 10:31:58 -03:00
6 changed files with 74 additions and 109 deletions

2
03.md
View File

@@ -13,7 +13,6 @@ This NIP defines an event with `kind:1040` that can contain an [OpenTimestamps](
"kind": 1040 "kind": 1040
"tags": [ "tags": [
["e", <event-id>, <relay-url>], ["e", <event-id>, <relay-url>],
["block", <block-height-as-string>, <block-hash>],
["alt", "opentimestamps attestation"] ["alt", "opentimestamps attestation"]
], ],
"content": <base64-encoded OTS file data> "content": <base64-encoded OTS file data>
@@ -21,7 +20,6 @@ This NIP defines an event with `kind:1040` that can contain an [OpenTimestamps](
``` ```
- The OpenTimestamps proof MUST prove the referenced `e` event id as its digest. - The OpenTimestamps proof MUST prove the referenced `e` event id as its digest.
- The `block` tag is optional, it exists to establish a minimum date since which the given event has existed.
- The `content` MUST be the full content of an `.ots` file containing at least one Bitcoin attestation. This file SHOULD contain a **single** Bitcoin attestation and no reference to "pending" attestations since they are useless in this context. - The `content` MUST be the full content of an `.ots` file containing at least one Bitcoin attestation. This file SHOULD contain a **single** Bitcoin attestation and no reference to "pending" attestations since they are useless in this context.
### Example OpenTimestamps proof verification flow ### Example OpenTimestamps proof verification flow

16
06.md
View File

@@ -13,3 +13,19 @@ Basic key derivation from mnemonic seed phrase
A basic client can simply use an `account` of `0` to derive a single key. For more advanced use-cases you can increment `account`, allowing generation of practically infinite keys from the 5-level path with hardened derivation. A basic client can simply use an `account` of `0` to derive a single key. For more advanced use-cases you can increment `account`, allowing generation of practically infinite keys from the 5-level path with hardened derivation.
Other types of clients can still get fancy and use other derivation paths for their own other purposes. Other types of clients can still get fancy and use other derivation paths for their own other purposes.
### Test vectors
mnemonic: leader monkey parrot ring guide accident before fence cannon height naive bean\
private key (hex): 7f7ff03d123792d6ac594bfa67bf6d0c0ab55b6b1fdb6249303fe861f1ccba9a\
nsec: nsec10allq0gjx7fddtzef0ax00mdps9t2kmtrldkyjfs8l5xruwvh2dq0lhhkp\
public key (hex): 17162c921dc4d2518f9a101db33695df1afb56ab82f5ff3e5da6eec3ca5cd917\
npub: npub1zutzeysacnf9rru6zqwmxd54mud0k44tst6l70ja5mhv8jjumytsd2x7nu
---
mnemonic: what bleak badge arrange retreat wolf trade produce cricket blur garlic valid proud rude strong choose busy staff weather area salt hollow arm fade\
private key (hex): c15d739894c81a2fcfd3a2df85a0d2c0dbc47a280d092799f144d73d7ae78add\
nsec: nsec1c9wh8xy5eqdzln7n5t0ctgxjcrdug73gp5yj0x03gntn67h83twssdfhel\
public key (hex): d41b22899549e1f3d335a31002cfd382174006e166d3e658e3a5eecdb6463573\
npub: npub16sdj9zv4f8sl85e45vgq9n7nsgt5qphpvmf7vk8r5hhvmdjxx4es8rq74h

3
07.md
View File

@@ -12,7 +12,7 @@ That object must define the following methods:
``` ```
async window.nostr.getPublicKey(): string // returns a public key as hex async window.nostr.getPublicKey(): string // returns a public key as hex
async window.nostr.signEvent(event: Event): Event // takes an event object, adds `id`, `pubkey` and `sig` and returns it async window.nostr.signEvent(event: { created_at: number, kind: number, tags: string[][], content: string }): Event // takes an event object, adds `id`, `pubkey` and `sig` and returns it
``` ```
Aside from these two basic above, the following functions can also be implemented optionally: Aside from these two basic above, the following functions can also be implemented optionally:
@@ -34,3 +34,4 @@ async window.nostr.nip04.decrypt(pubkey, ciphertext): string // takes ciphertext
- [TokenPocket](https://www.tokenpocket.pro/) (Android, IOS, Chrome and derivatives) - [TokenPocket](https://www.tokenpocket.pro/) (Android, IOS, Chrome and derivatives)
- [Nostrmo](https://github.com/haorendashu/nostrmo_faq#download) (Android, IOS) - [Nostrmo](https://github.com/haorendashu/nostrmo_faq#download) (Android, IOS)
- [Spring Browser](https://spring.site) (Android) - [Spring Browser](https://spring.site) (Android)
- [nodestr](https://github.com/lightning-digital-entertainment/nodestr) (NodeJS polyfill)

2
72.md
View File

@@ -48,7 +48,7 @@ Any Nostr event can be a post request. Clients MUST add the community's `a` tag
"id": "<32-bytes lowercase hex-encoded SHA-256 of the the serialized event data>", "id": "<32-bytes lowercase hex-encoded SHA-256 of the the serialized event data>",
"pubkey": "<32-bytes lowercase hex-encoded public key of the event creator>", "pubkey": "<32-bytes lowercase hex-encoded public key of the event creator>",
"created_at": <Unix timestamp in seconds>, "created_at": <Unix timestamp in seconds>,
"kind": 1, "kind": 72,
"tags": [ "tags": [
["a", "34550:<Community event author pubkey>:<d-identifier of the community>", "<Optional relay url>"], ["a", "34550:<Community event author pubkey>:<d-identifier of the community>", "<Optional relay url>"],
], ],

48
91.md
View File

@@ -1,48 +0,0 @@
NIP-91
======
IoT sensors and intents
-----------------------
`draft` `optional` `author:BlackCoffee` `author:arcbtc` `author:fiatjaf`
This NIP standardizes communication of public sensor and intent events in order to create an open, pluggable and interoperable standard for "Internet of Things" devices to communicate.
The standard event format follows the following template:
```js
{
"kind": <a number from the table below>,
"tags": [
["device", <optional device id>],
["alt", <optional human-readable translation of the event>],
],
"content": "<data according to the format in the table below>"
...
}
```
Ideally each device would have its own public key, which allows for easy command-and-control and comes with built-in trus guarantees (i.e. you know you're getting the data from the correct device if you know its key and can check the signature), but the `device` tag exists for when that is too cumbersome and more than one device is using the same key.
The `alt` tag follows NIP-31 and can accomodate all human-readable needs, like the device name or the human-readable name of the place it is in.
Other generic tags, like `g` for geolocation, may be included.
### Event Kinds
Kinds between 8000-8999 (inclusive) are reserved for this NIP, to be filled in the table below.
| kind | name | type | unit | example | description |
| ----- | ----- | ------ | ----- | ----- | -------- |
| 8000 | intent | | | | someone wants to trigger an action on a device? |
| 8001 | on | empty | | | device was turned on |
| 8002 | off | empty | | | device will turn off |
| 8003 | temperature | number | celsius | 20.9 | |
| 8004 | pressure | number | pascals | 1013 | |
| 8005 | location | array | decimal degrees | [51.5053, -0.08737] | |
| 8006 | light | | | | |
| 8007 | humidity | | | | |
| 8008 | rain | | | | |
| 8009 | moisture | | | | |
| 8010 | unary switch | | empty | | a sensor that detects if a thing happened or not |
| 8011 | binary switch | boolean | | true / false | a switch that can be turned on or off |

112
README.md
View File

@@ -67,69 +67,67 @@ They exist to document what may be implemented by [Nostr](https://github.com/nos
- [NIP-75: Zap Goals](75.md) - [NIP-75: Zap Goals](75.md)
- [NIP-78: Application-specific data](78.md) - [NIP-78: Application-specific data](78.md)
- [NIP-89: Recommended Application Handlers](89.md) - [NIP-89: Recommended Application Handlers](89.md)
- [NIP-91: IoT Sensors and Intents](91.md)
- [NIP-94: File Metadata](94.md) - [NIP-94: File Metadata](94.md)
- [NIP-98: HTTP Auth](98.md) - [NIP-98: HTTP Auth](98.md)
- [NIP-99: Classified Listings](99.md) - [NIP-99: Classified Listings](99.md)
## Event Kinds ## Event Kinds
| kind | description | NIP | | kind | description | NIP |
| ------- | -------------------------- | ----------- | | ------- | -------------------------- | ----------- |
| `0` | Metadata | [1](01.md) | | `0` | Metadata | [1](01.md) |
| `1` | Short Text Note | [1](01.md) | | `1` | Short Text Note | [1](01.md) |
| `2` | Recommend Relay | | | `2` | Recommend Relay | |
| `3` | Contacts | [2](02.md) | | `3` | Contacts | [2](02.md) |
| `4` | Encrypted Direct Messages | [4](04.md) | | `4` | Encrypted Direct Messages | [4](04.md) |
| `5` | Event Deletion | [9](09.md) | | `5` | Event Deletion | [9](09.md) |
| `6` | Repost | [18](18.md) | | `6` | Repost | [18](18.md) |
| `7` | Reaction | [25](25.md) | | `7` | Reaction | [25](25.md) |
| `8` | Badge Award | [58](58.md) | | `8` | Badge Award | [58](58.md) |
| `16` | Generic Repost | [18](18.md) | | `16` | Generic Repost | [18](18.md) |
| `40` | Channel Creation | [28](28.md) | | `40` | Channel Creation | [28](28.md) |
| `41` | Channel Metadata | [28](28.md) | | `41` | Channel Metadata | [28](28.md) |
| `42` | Channel Message | [28](28.md) | | `42` | Channel Message | [28](28.md) |
| `43` | Channel Hide Message | [28](28.md) | | `43` | Channel Hide Message | [28](28.md) |
| `44` | Channel Mute User | [28](28.md) | | `44` | Channel Mute User | [28](28.md) |
| `1063` | File Metadata | [94](94.md) | | `1063` | File Metadata | [94](94.md) |
| `1311` | Live Chat Message | [53](53.md) | | `1311` | Live Chat Message | [53](53.md) |
| `1040` | OpenTimestamps | [03](03.md) | | `1040` | OpenTimestamps | [03](03.md) |
| `1984` | Reporting | [56](56.md) | | `1984` | Reporting | [56](56.md) |
| `1985` | Label | [32](32.md) | | `1985` | Label | [32](32.md) |
| `8000-8999` | IoT Sensors and Intents | [91](91.md) | | `4550` | Community Post Approval | [72](72.md) |
| `4550` | Community Post Approval | [72](72.md) | | `9041` | Zap Goal | [75](75.md) |
| `9041` | Zap Goal | [75](75.md) | | `9734` | Zap Request | [57](57.md) |
| `9734` | Zap Request | [57](57.md) | | `9735` | Zap | [57](57.md) |
| `9735` | Zap | [57](57.md) | | `10000` | Mute List | [51](51.md) |
| `10000` | Mute List | [51](51.md) | | `10001` | Pin List | [51](51.md) |
| `10001` | Pin List | [51](51.md) | | `10002` | Relay List Metadata | [65](65.md) |
| `10002` | Relay List Metadata | [65](65.md) | | `13194` | Wallet Info | [47](47.md) |
| `13194` | Wallet Info | [47](47.md) | | `22242` | Client Authentication | [42](42.md) |
| `22242` | Client Authentication | [42](42.md) | | `23194` | Wallet Request | [47](47.md) |
| `23194` | Wallet Request | [47](47.md) | | `23195` | Wallet Response | [47](47.md) |
| `23195` | Wallet Response | [47](47.md) | | `24133` | Nostr Connect | [46](46.md) |
| `24133` | Nostr Connect | [46](46.md) | | `27235` | HTTP Auth | [98](98.md) |
| `27235` | HTTP Auth | [98](98.md) | | `30000` | Categorized People List | [51](51.md) |
| `30000` | Categorized People List | [51](51.md) | | `30001` | Categorized Bookmark List | [51](51.md) |
| `30001` | Categorized Bookmark List | [51](51.md) | | `30008` | Profile Badges | [58](58.md) |
| `30008` | Profile Badges | [58](58.md) | | `30009` | Badge Definition | [58](58.md) |
| `30009` | Badge Definition | [58](58.md) | | `30017` | Create or update a stall | [15](15.md) |
| `30017` | Create or update a stall | [15](15.md) | | `30018` | Create or update a product | [15](15.md) |
| `30018` | Create or update a product | [15](15.md) | | `30023` | Long-form Content | [23](23.md) |
| `30023` | Long-form Content | [23](23.md) | | `30024` | Draft Long-form Content | [23](23.md) |
| `30024` | Draft Long-form Content | [23](23.md) | | `30078` | Application-specific Data | [78](78.md) |
| `30078` | Application-specific Data | [78](78.md) | | `30311` | Live Event | [53](53.md) |
| `30311` | Live Event | [53](53.md) | | `30315` | User Statuses | [38](38.md) |
| `30315` | User Statuses | [38](38.md) | | `30402` | Classified Listing | [99](99.md) |
| `30402` | Classified Listing | [99](99.md) | | `30403` | Draft Classified Listing | [99](99.md) |
| `30403` | Draft Classified Listing | [99](99.md) | | `31922` | Date-Based Calendar Event | [52](52.md) |
| `31922` | Date-Based Calendar Event | [52](52.md) | | `31923` | Time-Based Calendar Event | [52](52.md) |
| `31923` | Time-Based Calendar Event | [52](52.md) | | `31924` | Calendar | [52](52.md) |
| `31924` | Calendar | [52](52.md) | | `31925` | Calendar Event RSVP | [52](52.md) |
| `31925` | Calendar Event RSVP | [52](52.md) | | `31989` | Handler recommendation | [89](89.md) |
| `31989` | Handler recommendation | [89](89.md) | | `31990` | Handler information | [89](89.md) |
| `31990` | Handler information | [89](89.md) | | `34550` | Community Definition | [72](72.md) |
| `34550` | Community Definition | [72](72.md) |
## Message types ## Message types