Nostr 协议

这是 Nostr 协议的概述,其中包含 Event 的细节介绍以及 Nostr Implementation Possibilities (NIPs) 是如何运作的。

§ Nostr 概述

  • 在 Nostr 网络中有两个主要的组件:客户端 & 中继
    • 客户端 是用户用来读写数据到中继的界面。在社交媒体的背景下,可以把它想象成 Twitter 的网页应用或移动应用。它是一个客户端,允许您从 Twitter 的中心化数据库读取数据和写入数据。
    • 中继 就像数据库(尽管它们做的不仅仅是存储数据)。它们允许客户端将数据发送到它们,并将该数据存储在数据库中。然后客户端可以从中继中读取数据,以显示给用户。
  • 每个用户都由一个公钥来标识。每个事件对象(例如您要发布的消息、您的关注列表的更新等)都是被签名了的。客户端验证这些签名以确保它们是正确的。
  • 客户端从中继获取数据并将数据发布到中继。中继由用户自由选择。中继之间彼此不联系,但将来可能会。
  • 例如,要更新您的个人资料,您只需指示您的客户端向您想要使用的中继发送一个 kind 0 的事件。然后中继将存储该事件。
  • 在启动时,您的客户端从您告诉它的中继查询一些数据。客户端根据这些数据来过滤事件,仅显示您关注的用户的事件,或者您可以要求获取所有人的所有事件,然后客户端将获取到的事件展示给您。
  • 事件有许多不同的类型。事件可以包含各种结构化数据,而最常用的结构正在被整合到 Nostr Implementation Possibilities (NIPs – 所有人都遵循的协议标准) 中,以便所有客户端和中继都可以无缝处理它们。
  • 您在 Nostr 上可以看到什么数据完全取决于您决定连接到哪个中继。有关详细信息,请参阅下面的网络图。

网络图

Nostr network diagram

从上图我们可以看到 3 个中继和 3 个用户。每个用户都使用不同的客户端(在不同的平台上)连接到 Nostr。

看图说话:

  • Bob 可以看到 Alice 的所有帖子,但看不到 Mary 的任何帖子(甚至不知道她的存在)
  • Alice 可以看到 Bob 的所有帖子,但看不到 Mary 的任何帖子(甚至不知道她的存在)
  • Mary 可以看到 Bob 和 Alice 的所有帖子。这是因为尽管她只向中继 3 写入,但她从中继 2 读取,Bob 和 Alice 在那里写入他们的帖子。

这是虽然是个非常简单的情况,但您已经可以看到,您对中继的选择,可能会对您在使用 Nostr 时看到的人和内容产生很大的影响。

§ 事件

事件是 Nostr 网络上唯一的对象。每个事件对象都有一个 kind 属性,它表示事件的类型(可能是用户的一个行为,也有可能是一条消息)。

这是一个 kind 1 事件的例子(kind 1 表示短文本笔记 - 例如 Twitter 的推文)

{
    "id": "4376c65d2f232afbe9b882a35baa4f6fe8667c4e684749af565f981833ed6a65",
    "pubkey": "6e468422dfb74a5738702a8823b9b28168abab8655faacb6853cd0ee15deee93",
    "created_at": 1673347337,
    "kind": 1,
    "tags": [
        ["e", "3da979448d9ba263864c4d6f14984c423a3838364ec255f03c7904b1ae77f206"],
        ["p", "bf2376e17ba4ec269d10fcc996a4746b451152be9031fa48e74553dde5526bce"]
    ],
    "content": "Walled gardens became prisons, and nostr is the first step towards tearing down the prison walls.",
    "sig": "908a15e46fb4d8675bab026fc230a0e3542bfade63da02d542fb78b2a8513fcd0092619a2c8c1221e581946e0191f2af505dfdf8657a414dbca329186f009262"
}
  • id 字段为事件的 ID
  • pubkey 字段为发送事件的用户的公钥
  • created_at 字段为事件发布的时间
  • kind 字段为事件的类型
  • tags 字段为事件的标签。这些标签用于创建链接、添加媒体和提及其他用户或事件。
  • content 字段为事件的内容。在这种情况下,是短文本帖子。
  • sig 字段为事件的签名,客户端使用它来验证具有此公钥的用户确实在指定的日期发送了此事件。

事件类型

这里是当前 Event 类型的列表。最新的列表可以在 Nostr NIPs 仓库 中找到。

类型 描述 提及的 NIP
0 元数据 1
1 短文本 1
2 推荐中继列表 1
3 关注人列表 2
4 加密私信 4
5 删除事件 9
6 转发 18
7 回应 25
8 徽章奖励 58
40 创建聊天室 28
41 聊天室元数据 28
42 聊天室消息 28
43 聊天室隐藏某条消息 28
44 聊天室屏蔽某用户 28
1063 文件元数据 94
1984 举报 56
9734 打闪请求 57
9735 打闪 57
10000 静音列表 51
10001 置顶列表 51
10002 中继列表元数据 65
13194 钱包信息 47
22242 客户端认证 42
23194 钱包请求 47
23195 钱包回应 47
24133 Nostr 连接 46
30000 用户分组列表 51
30001 书签分组列表 51
30008 个人资料徽章 58
30009 徽章定义 58
30017 创建或更新商品列表 15
30018 创建或更新一个商品 15
30023 长文 23
30078 应用自定义数据 78
30402 分类 99
31989 推荐处理者 89
31990 处理者的信息 89

标准化标签

名称 其他参数 提及的 NIP
e 事件 ID(16 进制) 中继 URL, 标记 1, 10
p 公钥(16 进制) 中继 URL 1
a 事件坐标 中继 URL 33, 23
r 引用(URL 等) 12
t 话题 12
g 地理位置 12
nonce 噪声 13
subject 主题 14
d 标识 33
expiration 时间戳(字符串) 40

§ NIPs

一个 Nostr Implementation Possibilty(NIP)的存在是为了记录与 Nostr 兼容的中继和客户端软件必须、应该和可以实现的内容。NIPs 是概述 Nostr 协议如何工作的文档。

我为什么要关心 NIPs?

Nostr 是去中心化的,不是由一个中心化的服务(如 Twitter)拥有。这意味着协议的方向取决于我们所有人!我们可以提出建议和支持那些认可的改变,并给其他提出想法的人提供反馈。

作为社区的活跃者,您可以对网络的发展方向发表意见。主仓库中发布的 NIPs 是已经获得批准的。通过创建 Pull Request 在该仓库上添加新的想法。

我可以在哪找到 NIPs?

您可以在 Nostr NIP 仓库 中看到当前所有的 NIPs。