NIP-01 定义了 Nostr 协议的基本流程,该协议应由所有参与者实现。新的 NIP 可以为此处描述的结构、流程和功能添加新的可选(或强制)字段、消息和特性。
**事件和签名**
每个用户都拥有一个密钥对。签名、公钥和编码都根据 secp256k1 曲线的 Schnorr 签名标准进行。
唯一存在的对象类型是事件,其在网络上的格式如下:
```json
{
"id": <32-bytes lowercase hex-encoded sha256 of the serialized event data>,
"pubkey": <32-bytes lowercase hex-encoded public key of the event creator>,
"created_at": <unix timestamp in seconds>,
"kind": <integer between 0 and 65535>,
"tags": [
[<arbitrary string>...],
// ...
],
"content": <arbitrary string>,
"sig": <64-bytes lowercase hex of the signature of the sha256 hash of the serialized event data, which is the same as the "id" field>
}
```
**标签**
每个标签都是一个或多个字符串的数组,围绕它们有一些约定。请查看下面的示例:
```json
{
"tags": [
["e", "5c83da77af1dec6d7289834998ad7aafbd9e2191396d75ec3cc27f5a77226f36", "wss://nostr.example.com"],
["p", "f7234bd4c1394dda46d09f35bd384dd30cc552ad5541990f98844fb06676e9ca"],
["a", "30023:f7234bd4c1394dda46d09f35bd384dd30cc552ad5541990f98844fb06676e9ca:abcd", "wss://nostr.example.com"],
["alt", "reply"],
// ...
],
// ...
}
```
**种类**
种类指定客户端如何解释每个事件的含义及其其他字段(例如,事件种类为 1 时,"r" 标签可能具有一个含义,而事件种类为 10002 时,则具有完全不同的含义)。每个 NIP 都可以定义一组未在其他地方定义的种类的含义。本 NIP 定义了两种基本种类:
0:用户元数据:内容设置为字符串化的 JSON 对象 `{name: <username>, about: <string>, picture: <url, string>}`,描述创建事件的用户。可以设置额外的元数据字段。中继服务器可以在获取同一公钥的新事件后删除旧的事件。
1:文本笔记:内容设置为笔记的纯文本内容(用户想说的任何内容)。不应使用必须解析的内容,例如 Markdown 和 HTML。客户端也不应将内容解析为这些内容。
**客户端与中继之间的通信**
中继服务器公开一个 WebSocket 端点,客户端可以连接到该端点。客户端应为每个中继服务器打开一个 WebSocket 连接,并将其用于所有订阅。中继服务器可以限制来自特定 IP/客户端/等的连接数量。
**从客户端到中继:发送事件和创建订阅**
客户端可以发送三种类型的消息,这些消息必须是 JSON 数组,并符合以下模式:
`["EVENT", <event JSON as defined above>]`,用于发布事件。
`["REQ", <subscription_id>, <filters1>, <filters2>, ...]`,用于请求事件并订阅新的更新。
`["CLOSE", <subscription_id>]`,用于停止以前的订阅。
**从中继到客户端:发送事件和通知**
中继服务器可以发送五种类型的消息,这些消息也必须是 JSON 数组,并符合以下模式:
`["EVENT", <subscription_id>, <event JSON as defined above>]`,用于发送客户端请求的事件。
`["OK", <event_id>, <true|false>, <message>]`,用于指示已接受或拒绝 EVENT 消息。
`["EOSE", <subscription_id>]`,用于指示已存储事件的结束以及实时接收的新事件的开始。
`["CLOSED", <subscription_id>, <message>]`,用于指示订阅已在服务器端结束。
`["NOTICE", <message>]`,用于向客户端发送人类可读的错误消息或其他内容。