抗审查的 Nostr 如何抗击滥用?
去中心化社交媒体内容审查的起源, 以及 Nostr 为什么能自称抗审查, 它又如何抗击滥用?
前言
谁是最成功的去中心化和分布式网络协议? 笔者会拿出一直以来和 Nostr 进行类比的 BitTorent. 但是如果要问一个普通人对 BitTorrent 的印象, 那绝大多数人都会是: 盗版天堂.
BitTorrent 几乎就差点和海盗党绑定在了一起, 它能够从二十一世纪之初流行至今也和这些激进的海盗党脱不了关系, 大量国家都在积极打击盗版, 但它们依旧活跃至今, "海盗" 就在我们之中, 甚至我们中的大多数人也无法彻底否认自己曾经成为过他们中的一员.
BitTorrent 的创始人布莱姆·科亨一直遵循着 "将内容交付给大众" 的信条, BitTorrent 在他眼里一直是纯粹的自由且开放的内容交付工具. 他不仅发明了 BitTorrent, 还帮助 Valve 设计内容交付系统, 最后创建了奇亚网络, 推出了曾经在 PC 玩家圈子中臭名昭著的加密货币「奇亚币」. 片面地说, 他是失败的, 除了商业公司 Valve 的履历, 其他的 "发明" 都招致了严重地滥用, 这些东西最后在大众脑海中都留下了暧昧的印象.
最后, BitTorrent 网络甚至不得不开始和 ISP 对抗, 如今大多数人也知道, 不通过 VPN 使用 BitTorrent 是危险的行为, 因为 ISP 能随时找上门, 轻则暂停提供网络接入, 重则律师函送上门. 这是最成功的 P2P 网络, 也是如今和 ISP 直接对抗强度最高的 P2P 网络. 布莱姆自己在 BitTorrent Inc. 中的时候也在努力推进 BitTorrent 网络的合法商业化, 为内容创作者和企业提供分发服务, 通过法律途径合法化 BitTorrent 流量, 但直到他离开这家公司, 都没能让 BitTorrent 变成一个能在阳光底下被所有人审视的网络. 再次片面地说, 布莱姆输掉了对海盗党的战争, 这是海盗党的胜利, 版权公司依旧在无差别地要求 ISP 打击 BitTorrent, 海盗党依旧在 BitTorrent 中来去自如.
Interview with Bram Cohen, the inventor of BitTorrent * TorrentFreak
那么 Nostr 会成为下一个 BitTorrent 现状的复刻吗? 笔者无法预测, 但可以肯定的是已经有人对 Nostr 网络中的垃圾消息印象深刻了, 由此在脑海中对 Nostr 留下了无法磨灭的刻板印象.
本文将介绍如今 Nostr 网络中对抗垃圾消息乃至滥用的手段, 以及这些手段的最初概念的起源. 还有对于去中心化和内容私密性悖论的阐述.
内容审查和审核
「审查制度」在社交媒体中的滥用是互联网去中心化的重要推动力量, 但当权利平等地下放到每个人手里的时候也随之带来了沉重的责任. 人们才发现审查也是一把双刃剑, 一面朝向自己, 一面朝向网络中的滥用者. 去中心化平台的管理员为了与自己平台中的滥用行为对抗, 在这些为了抗击审查的系统中学习中心化平台重新实现了「审核制度」. 这一次, 审查武器也下放到了每个人手里, 有人拿来和垃圾消息和仇恨言论对抗, 有人拿来巩固自己的权威顺便清除异见者, 仿佛就和曾经宣扬要逃离的中心化平台所做的一样.
一般来说, 我们将来自外部不可抗力(如政府和法律)而实施的, 广泛且无差别的强制性内容限制称之为「内容审查」, 这对应于英文单词 Censorship; 而对于为了维持社区可持续性和平台系统稳定, 由平台内部主动采取的内容管理措施称之为「内容审核」, 对应于 Moderation. 它们的关系相互交织, 密不可分. 这部分的工作在商业社交媒体中一般交由公司的「信任与安全部门」处理, 我们在各种社交媒体中常见的 "社区守则" 就出自这些职能部门.
这些审核工具包括但不限于:
- 基于用户行为的: 账户行为, 用户评分, 登录设备限制.
- 基于网络基础设施的: IP 限制, 网络地理位置限制, 访问频率限制, DNS 解析限制.
- 基于消息系统账户的: 账户登录限制, 账户可见性限制, 账户内容可见性限制.
- 基于消息内容的: 内容关键词限制, 视觉识别, 语音识别, 光学字符识别, 元数据(如 Hash)过滤, 人工审核.
- 基于时间和事件的: 实时舆情监控, 新账户发布限制, 特定社会事件管控.
- 基于社交图谱和关系网的: 用户关系网络, 独立社群规则.
- 基于消息类型的: 内容分类与标记, 线程语境分析, 自动风控.
- 基于用户反馈的: 举报机制, 平台审核, 事后申诉.
- ...
而去中心化网络还会基于网络结构特性诞生一些新的审核工具, 比如基于最小节点单位的节点静音, 节点断联, 入站过滤等.
对于打击滥用, 所有的审核工具都只能缓解包括垃圾消息在内的滥用行为, 因为大多数时候滥用者隐藏在真实用户之中, 无法 "一刀切" 式的治理, 大多数的审核工具也只是提升了大规模滥用网络的成本, 平衡了平台实施审查所投入的成本和获取的收益的比例.
Nostr 抗审查的本质
Nostr 是一个用非对称密钥进行社交的网络协议. 基本上, 用现有的 GPG 基础设施也能复刻出一套和 Nostr 完全相同的系统, 但没有人这么做过, 至少没有形成一个积极的社区生态, 没有人去发明类似 NIP-46 这样的协定解决 GPG 反人类的密钥管理和签署加密问题, GPG 现在只是沦为了开发者, 「极客」和「隐私怪」们的玩物. 介绍 GPG 的人都不会着重介绍它能做到社交媒体抗审查, 因为 GPG 从来没有实现过 Nostr 规模的社交网络, 也没有成形的分布式基础设施.
而 Nostr 的「抗审查」其实指的是非对称密钥签署及加密带来的防篡改特性, 以及分布式带来的网络特性, 并不是 Nostr 重新发明了新的抗审查手段. Nostr 所有的事件一旦被篡改, 事件签名就无法通过基于公钥进行的运算验证, 然后就会被 Nostr 的客户端和服务端判定为无效事件然后被拒绝, 仿冒和来自不可抗力要求的单方面内容干扰只能要求客户端直接屏蔽或从服务端删除整个事件. 相对的, 客户端和服务端要做到针对公钥的黑名单是徒劳的的, 因为 Nostr 创建新密钥对然后成为一个新账户简单到不能再简单, 绕过这类服务端和客户端的公钥特征审查易如反掌.
随着核心协议和中心化设施的解绑, Nostr 彻底成了一个分布式网络. 和 GPG 签署的内容一样, Nostr 事件能够被通过任何形式传播而无需考虑设施的限制, 而 Nostr 只是为了稳定的基础生态才要求使用 WebSocket, 实际上没有人阻止 Nostr 用户像 GPG 用户一样通过电子邮件在内的方式发送签署的内容. Nostr 的事件只是一个 JSON 对象, 仅此而已, 可以被以任何网络协议方便地传播和解析, 在原生的中继生态中, 这些 JSON 对象实际上就像随机飘荡在狂风的 "纸条" 一样, 作者一旦在上面使用私钥签署了签名并公开, 这些 "纸条" 就会变成就连作者自己都难以控制传播方式的信息, 更不要说来自中心化机构实施的内容审查了.
同样的, Nostr 的删除和 GPG 的密钥吊销一样, 是一种声明式的删除. 私钥签署的删除事件只是对目标拟定删除事件的引用, 与目标事件一起是两个独立的事件, 而由于其分布式特性, 一旦两个关联事件相隔的时间够久, 其后来的引用删除声明就基本不可能覆盖到全网. 只要网络中有节点保存着拟定删除的事件并且还没有被后来的删除事件覆盖到, 那网络中的用户还是有机会收到那条拟定被删除的事件.
要么 Nostr 实现 X.509 证书类似的强中心化 CA, 要么模仿 GPG 建立弱中心化的 Keyserver 去协调, 否则想要在分布式网络中实现有效的删除始终是一种美好的幻想, 仅仅是看起来有效而已, Nostr 更不例外. 所以, 要在分布式网络中依靠删除实现内容审查更是不现实的, 并且如果 Nostr 事件作者想要主动实现内容可见性控制比如 "私密消息", 要么对所有已知受众预先进行不对称加密甚至 DRM, 要么将内容锁定在一个服务器中并限制读取和传播变成「去中心化网络中的中心化」, 否则就如同大多数互联网「君子协定」一样, 靠附加条款就期望保护自己的内容是种掩耳盗铃的行为, 更是在自欺欺人. 想要在明文内容实际上被无限复制的去中心化社交网络中实现 "内容私密性" 本身就是和去中心化理念背道而驰的, 并且就算是被静态加密的内容, 其一旦被无限复制和传播, 要想实现向前保密性更是无稽之谈.
最终, 对于事后侵权行为的有效制裁也只能诉诸于法律, 而不是靠人身攻击和道德批判就能实现的美梦, 这些协定大多数也都只是一个社区的「社区守则」, 靠着内容条款的强烈排他性和社区成员的排外共识才实现了如今 "看起来有效" 的生态, 然而最后面对跳出这个怪圈之外的敌人的时候, 会显得无比脆弱.
事件类型限制
Nostr 中有很多不同类型的事件, 但是直接用于社交用途的事件实际上只有很少的一部分, 比如:
- 账户元数据:
kind:0
(用户资料),kind:10002
(信箱列表) - 用户内容:
kind:1
(短文本帖子),kind:7
(回应),kind:30023
(长篇内容)
所以 Nostr 网络中的服务端, 也就是中继就可以选择性控制这些会被大多数 Nostr 社交用户看到的内容进行审核. 比如限定中继只接受这些事件, 然后在中继内基于 IP 实行速率限制, 这也是大多数中继软件默认就有的功能.
还有一些特殊的中继甚至只接受其中一种或者几种的同类事件, 一些专门用于存储账户元数据的中继就只会保存 kind:0
和 kind:10002
之类的事件, 比如中继 wss://purplepag.es
:
❯ nak req -a 32e1827635450ebb3c5a7d12c1f8e7b2b514439ac10a67eef3d9fd9c5c68e245 purplepag.es | jq .kind
connecting to purplepag.es... ok.
10002
0
工作量证明
「工作量证明 (PoW)」有很多实现, 在 Nostr 中采用的方式是让客户端通过调整一个动态的标签参数来计算事件 ID 中的前导零, 所需要的前导零数量越多所需要的算力要求就越高, 这被标准化在 NIP-13 中:
于是一些客户端就能基于这个特性选择性过滤中继中事件 ID 含有的前导零位数, 然后就能做到根据 PoW 机制过滤消息, 只显示或者选择性显示经过了 PoW 过程签署的事件. 中继也能根据 PoW 限制事件准入, 只允许那些经过了特定量计算的事件进入.
未来可能还会有这类中继: 只有当中继中已经存在了公钥账户的账户资料(kind:0
)时才允许其他事件进入, 而这个 kind:0
事件需要经过超高难度的 PoW, 普通的家用 PC 甚至可能要为此计算数个小时才能得到合格的事件. 这样可以显著提高滥用成本, 但是, 当这种 PoW 准入机制实现并普及之后, 就一定会催生贩卖算力资源的供应商, 可以让不想浪费时间的用户支付费用代为计算, 加速这个过程, 这也就是比特币和比特币挖矿的原型.
Nostr 并不期望高难度的 PoW 在网络中被广泛使用, 高算力要求等于高能源消耗, 与其计算没有意义的高难 Hash, 还不如要求用户直接付一笔比特币费用.
域名身份标识
域名也就是 DNS 是一个事实上的中心化系统, 但是由于它是互联网非常底层的基础设施并且还拥有成熟的抗击域名滥用的管理机构, 所以也可以作为一种价值证明的方式.
于是一些中继就开始强制要求用户在发送更多事件之前必须要将用户资料先广播进来, 用户资料中必须提供他们的域名身份标识(NIP-05), 然后中继会尝试验证域名标识有效性, 只有通过内部的审核之后, 后续的事件才能进入其中.
比如 Nostr 的 Fediverse 协议桥 Mostr.pub:
❯ nak event -k 1 -c 'Hello' relay.mostr.pub
connecting to relay.mostr.pub... ok.
{"kind":1,"id":"ff3c292c046709d817ce7e034c07d903840686b9726808cac7ba0b026870a459","pubkey":"79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798","created_at":1746289374,"tags":[],"content":"Hello","sig":"be208c683284f46b92344ae2244a785ab931c6603b54a0a315dcc29181dd8e8780e063c2425312c6e2213fa9e22a50405eecf01fb458df9d94599cafccc4f3aa"}
publishing to relay.mostr.pub... failed: msg: blocked: failed to lookup nip05
这类中继可以在自己的服务器上借助现有的 DNS RBL 实现基础过滤, 然后单独处理一些域名的置信度, 这样就能借助 DNS 系统完成准入验证. 这种方式也会被用于一些小型 Nostr 社区中, 通过给成员发放 NIP-05 间接获得社区中继的准入, 然后通过中继或者域名标识过滤消息.
付费准入
这是很多社交网络都在采用的方式, Nostr 的中继也一开始就有, 也没什么神秘的地方, 就是简单地付一笔钱或者代币然后获得准入. 因为和闪电网络的融合, 大多数中继都只接受这个网络的代币进行支付.
中继会选择一次性支付获得准入, 或者长期按时间支付费用获得准入, 这两种办法大多数时候都是作为价值证明使用. 比如一次性付费的 nostr.wine, 订阅制周期付费的 nostr.land.
邀请制
这同样也是常用的方法, 流程不再过多赘述.
除了扁平化的邀请制, Nostr 中也存在使用树形邀请制的中继比如 Nostr 创始人 fiatjaf 的「金字塔」中继: pyramid.fiatjaf.com
信任网络
「信任网络 (WoT)」目前主要存在于 Nostr 的客户端中, 比如 Coracle.social, 以及 Nostr.band 还未发布的 Trust Rank. 不同的实现往往会有不同的信任等级计算公式, 采用的关键因子也各不相同.
中继方面, 也有支持 WoT 进行准入验证的. 通常是中继管理员在服务器一侧为中继设置一个顶级信任公钥列表和递归深度, 中继会获取顶层公钥的关注列表, 将其作为第二级深度, 重复这个过程直到达到预设的最大信任深度. 本质是一个基于社交图谱的动态白名单, 具体的实现比如:
静音列表和关键词
这是客户端的用户一侧目前唯一掌握的主动审核能力, 也是大多数社交客户端就有的基础功能. 用户可以将公钥或者关键词加入列表中, 客户端则会根据列表隐藏这些事件使其不出现在消息时间线中, 从而做到消息审核.
当然, 中继一侧也能对未加密事件内容的主体进行审核, 其中就包括了最基本的关键词. 一些中继还会限制 Nostr 事件中特定标签的数量, 比如 Hashtag 标签 t
的数量和内容, 实现用户提及的 p
标签数量. 这些其实都是对于中继而言的 "关键词" 审核, 只不过它们是 JSON 中的字段而已.
客户端认证
NIP-42 议定标准化了中继对客户端发起的验证挑战流程. 中继可以要求客户端使用用户私钥签署一个临时事件以表明自己所代表的用户身份. 中继软件可以设置这个验证目标的公钥白名单, 从而控制中继对用户的客户端一侧是否开放读写权限.
目前大多数的流行中继软件都实现了这个特性, 而大型的中继服务商 nostr.wine 甚至借助这个功能实现了类 Patreon 的服务:
网关过滤
Nostr 网络的核心是 WebSocket, 而 WebSocket 也是一个经典的 Web 2.0 协议, 能够被 Web 服务器重新代理流量, 能够受益于流行的 Web 安全组件, 比如 WAF. WebSocket 的握手和协议升级还是 HTTP/1.1, 可以实现基本的 HTTP 认证. 中继一侧可以借助 HTTP 标头信息和流量特征进行访客过滤, 从基础设施层面阻止滥用. 同样的, Web 客户端也可以.
现在也有专门设计用于代理 Nostr 中继的中继代理软件, 可以将其作为专用的反向代理服务器并结合现有的 Nostr 协议层能力来实现更精细的过滤.
定期数据库销毁
直接销毁数据库, 可能是 Nostr 这类分布式网络才能经常做的操作.
这是 Nostr 网络遭遇难以抵御的滥用后能实现「自愈」的关键, 因为几乎所有的 Nostr 公共中继都不会承诺永久保存用户的数据. 虽然 Nostr 的中继大多不会互相通讯, 但是事件会随着客户端上用户的互动被重新广播到作者发布的中继之外的中继, 消息互动越多这种可能性越大, 重新广播的范围就会越广, 那些公共的没有严格写入限制的中继最终一定会接收到那些重新广播的随机消息.
同样的, 无人问津的事件, 不仅缺乏中继一侧承诺的数据持久化, 还缺乏其他用户互动带来的重新广播为其提供的 "保活" 操作. 最终这类事件会随着时间推移真正从 Nostr 网络上消失, 而垃圾消息也和这类消息非常相似: 无人问津甚至被人主动避开, 没有中继为其提供数据持久化承诺, 缺乏互动带来的重新广播. 最终, 这些 Nostr 网络上的冷门事件就和冷门 Torrent 一样 "死种" 了, 也就是事实上的从 Nostr 网络中消失了, 不过区别在于 Nostr 网络中的最小信息单位是事件, 并没有像 BitTorrent 那样传输时再被分块, 所以事件只会整个地消失, 并不会 "消失一部分".
最终, 垃圾消息也会随着时间推移逐渐消失在 Nostr 网络中, 其中也包括一对 Nostr 密钥成为一个真实用户这个过程所代表的账户元数据事件.
信息
实际上, "账户元数据" 这类特殊的事件目前会有一些特殊的中继去专门保存并存档, 使其更加持久地可用, 当然这些中继并不是为了让这些滥用网络的消息才去让保存并长期存档, 它们只是平等地保留所有元数据而已.
如今的 Nostr 用户也根本找不到 2023 年 Damus 刚推出的时候遭受的大规模中文垃圾消息的记录了, 因为 Damus 自己的官方中继就主动进行过很多次数据库销毁操作.
所以, 真正加入 Nostr 网络的方式只有用户确保自己的数据始终有效, 要么支付代价寻找中继为自己代托管这堆 JSON, 要么自托管中继自己保存. 没有人能无条件地永久保存互联网内容还提供给别人访问, 更不要说在 Nostr 中了.