# Nostr 协议以及相关思考

By [James Sun](https://paragraph.com/@ungigdu) · 2023-02-15

---

[https://github.com/nostr-protocol](https://github.com/nostr-protocol)

先从名字说起，nostr是Notes and Other Stuff Transmitted by Relays的缩写，直译过来就是通过中继传输的笔记和其它。名字很清楚的说明了，这是一个传输协议，并且，有中继存在，说明这并不是一个P2P传输协议。

nostr的协议由两种参与者：客户端（client）和中继服务器（relay），客户端之间不能直接交流，必须通过中继。客户端A把信息发给中继1，客户端B可以从中继1中取得信息，这样就完成了客户端A把信息发给客户端B的这样一个过程。如果只讲nostr协议本身而不讲它出现的背景，难免会得出“nostr是个很简单的协议”这样的草率结论。所以，让我们先跳出nostr，来看看web技术发展的历史以及每一代技术带来的问题，会更好的理解nostr的设计思路。

web1由于互联网技术刚刚出现，网站大多数是静态的，交互性基本没有，一句话带过。

在web2时代中，大型互联网公司以及平台应用的出现，使得web2和web1有本质的区别，其主要特征可概括为：

*   UGC（用户生成内容）是web2内容的绝大多数
    
*   UGC和用户的账号，本质上是web2公司的资产，并不属于用户自己
    
*   广告是平台型应用的主要营收方式
    
*   web2应用是中心化的，运营公司可以任意删除用户的内容，封禁其账号
    
*   免费应用是主流
    

web2平台的“用户”，其实不是真正的用户，因为这些用户不付费。付费的是广告商，广告商才是web2平台真正服务的对象。所以平台希望免费用户上传的内容，尽量吸引更多的广告受众来观看。平台也会审查不符合主流价值观（或者对平台/广告商利益有影响）的上传内容，所谓的没有言论自由。

web3的一些社交/内容项目希望借助区块链的去中心化特性来构建免于审查的DApp，本文使用的mirror.xyz就是其中的佼佼者。在mirror写文章有两种状态，草稿状态和发布状态。在草稿状态中，文章内容是中心化存储的，和web2写作平台区别不大。发布过程包含用户和mirror平台的一系列操作：首先，mirror会把文章中的图片使用IPFS（分散式文件存储网络）存储，文章内容存储在Arweave（永久化存储网络）；其次，mirror平台会生成包含图片和文章的链接，编码为json格式的metadata（元信息）；最后，用户需要使用钱包把包含metadata的NFT合约部署在Optimism网络上。在这个过程中，IPFS，Arweave的使用费用是mirror平台承担，文章上链到Optimize的gas费用是用户承担（文章发布时刻为1.6美元）。这种发布文章的方式，的确做到了去中心化，即文章内容去中心化，作为文章索引的NFT也是去中心化的。但这一系列过程费用相当昂贵，更不用提用户需要操作加密钱包来登陆平台，这进一步增加了使用门槛。

一个健壮的区块链网络，是由众多的节点来维持的。这些节点通过共识算法来保证状态的一致性。简单来说，一个发布的文章会同时存在于“所有”的节点之中。这么多份冗余的记录，占用的资源是相当多的，这是使用区块链如此昂贵的原因之一。另外，节点之间达成共识状态是需要时间的，大多数区块链的TPS非常低。以上两点导致区块链基础设施暂无法支持比如像发推，即时通讯这样的高频使用场景。

另外一些SocialFi类型的DApp则走了更奇怪的路线：web2的发帖，加上web3的代币经济系统，post 2 earn。DApp希望通过代币激励让更多的用户使用，从而提高项目的估值以及代币的价格，在项目上升期间，或者币圈牛市的时候，也许能让平台暂时起飞。但是币价不可能一直向上走，代币价格下降必然会导致用户的流失和活跃度的降低。如果遭遇熊市，那项目可谓九死一生。我个人认为SocialFi的过度金融化带来的问题多于解决的问题。总之，web3也没有很好的解决社交应用的易用性和抗审查性的问题。

2022年10月27日，马斯克成功收购twitter，万众期待的言论自由却没有这么轻易的被实现。在这情况下，nostr的IOS客户端Damus，以twitter挑战者的姿态出现在公众的视线中，引起了广泛的讨论。那么nostr是如何做到它声称的易用，去中心化，抗审查等等特性呢，接下来我们回归到协议本身上来。

首先是**账户体系**，nostr是无需注册的，用户靠公钥/私钥对来登陆客户端，或者通过Alby这样的钱包插件来管理私钥。这一点类似于区块链应用，其好处是用户的账号不会被封禁，缺点当然是用户需要自己妥善管理好私钥。

![作者的密钥对](https://storage.googleapis.com/papyrus_images/2507980c43c113ea4e758429659ed63d02e76a57e3f5754afb0326693998a86f.png)

作者的密钥对

用户可以使用同一个私钥来同时登陆多个/多种客户端，**客户端**的作用是把用户的消息（Event）发送到订阅的**中继**服务器中，如下图所示：

![接受这条信息的中继](https://storage.googleapis.com/papyrus_images/411ca4121a5ddf16828ae0dd90dc97528bb91423c115fdf0e60ba52227da1c2d.png)

接受这条信息的中继

每次发消息的时候，客户端尝试把这个消息推送到所有订阅的中继服务器中，但是如上图所示，只有其中一部分（红圈）中继接受了这个消息。一旦某个中继存储了我的消息，订阅了同一个中继的别人的客户端，就能查询到我的消息，这个过程就完成了类似twitter的推送功能。没有订阅同样中继服务器的客户端，是无法取得我的消息，也不知道我发过消息。

在目前版本的nostr协议中，中继之间是不会通讯的，我发送的信息不会在多个中继之间传播，从这一点可以看出，中继和区块链节点有本质的不同。由于nostr协议没有共识层，也就不会被“区块打包”，“同步”等拖累效率，能支持任何高频应用。目前，有基于nostr的发推、即时通讯、在线战棋、笔记等等应用出现。

既然nostr协议中，中继是不同步信息的，挑选中继的任务落在了用户头上。问题来了，中继有没有可能作恶？答案是肯定的。在nostr协议中，客户端和中继之间无需信任，中继可以删除用户数据，停止服务，或者停止为一部分用户提供服务，但中继无法伪造用户的消息，因为用户的消息是被私钥签名过的，伪造消息几近不可能。

如果用户发现中继提供的服务有问题，他可以换一批中继，甚至自己架设中继来继续为自己提供服务。这就nostr协议抗审查的原理——用户需要为自己的账号，消息，消息发布渠道负责。nostr协议也没有涉及中继的激励问题，上图中的中继都是免费中继，提供的服务质量参差不齐。nostr希望生态自己解决中继激励的问题，无论是简单的付费订阅或者使用了代币经济学。

nostr协议的流程可以用两个图来总结（没有考证来源）：

![发消息的过程](https://storage.googleapis.com/papyrus_images/b3f8c7139c1fb34fd85f2a6b1bce7100f9a4606f71bc657f96c926eeea78be3e.png)

发消息的过程

![订阅中继](https://storage.googleapis.com/papyrus_images/1f9fa507d6e8c4342a9196dabf552d077c313e3f039fc5e74e0b589ad3edcbe3.png)

订阅中继

nostr协议有一系列的NIP（Nostr Implementation Possibilities），即在基础协议之上扩展的功能，客户端/中继可以选择性的实现，其中比较有趣的包括：

*   NIP-04: 消息加密，利用secp256k1算法来完成Diffie-Hellman密钥交换，点对点加密
    
*   NIP-05: 映射公钥到域名，方便记忆，比如作者的公钥是
    
    npub10jprg9n3ecjlpez0fyg7y7yvpl66drtjv8rv0hfllxpdxhesuwzs4c2kw6，映射到了@NomandJames这个域名上面
    
*   NIP-06: 助记词，和加密货币钱包的助记词类似
    
*   NIP-13: 工作量证明。此概念的提出早于比特币的出现，现被广泛应用在区块链POW共识层中，以太坊whisper协议中也有应用。它的原理是在客户端发送消息之前，要先完成一个计算密集型的工作量证明，接受信息的中继服务器会验证这个证明的有效性。提供这个证明意味着花费了算力，提高了发送垃圾信息堵塞中继的门槛。
    
*   NIP-22: 消息时间戳。告知中继服务器消息创造的时间，以便中继选择性的接收消息。时间戳可以设置为过去或者未来。
    
*   NIP-40: 过期时间。告知中继服务器消息过期的时间，以便中继删除。
    
*   NIP-57: 闪电网络打赏链接。
    
*   NIP-65: 中继服务推荐列表。
    

以上是我理解的nostr协议。我认为，nostr协议为我们展示了一个不使用区块链技术的去中心化，抗审查的通讯类DApp的可能性，也许在未来会有很长远的发展和广泛的应用。nostr的发展还非常早期，我想到了几个问题，期待nostr生态会在未来逐步解决：

1.  客户端信息备份的问题。目前各种客户端都没提过用户备份信息到本地的功能
    
2.  中继间信息迁移问题。假如一个中继拒绝给我提供服务，我当然可以换一个中继来使用，但是历史消息如何转移？
    
3.  信息先后顺序的问题。由于nostr协议没有共识层，客户端可以在现在伪造时间戳为一天前的消息，来达到“预言”的效果。对于时间戳和UNIX时间差距很大的消息，一些中继并没有进行处理
    
4.  中继服务质量的问题。未来也许中继服务器众多，如何挑选中继服务器是一个难题，也许会有一个专门的中继市场出现
    

**总结**：我个人是非常看好nostr协议发展的，言论自由是人类一直追求的目标。DApp也不一定非得使用区块链技术，nostr开了一个好头。

---

*Originally published on [James Sun](https://paragraph.com/@ungigdu/nostr)*
