浅谈 Earendil:第一个去中心化抗封锁通讯系统
去中心化抗封锁的难度、实现方法、维持方法
最近我在 Mel 最主要开发的项目是 Earendil。想到我还没有用中文写过关于这个项目的介绍,我就简单写一个博客总结一下 Earendil 到底是什么。
功能上来说,Earendil 有点类似 I2P 或 Nym,是个高度隐私的通讯网络。但 Earendil 有非常独特的一点是,它将是第一个同时实现下面三个功能的软件网络:
- 去中心化(decentralized):整个网络不信任任何中心化的个人或组织运营和维护
- 经济上可持续(incentive-compatible):向网络提供资源会得到合理的报酬,不会遇到少量志愿者服务大量「白吃」的用户导致供不应求的问题
- 抗封锁(ban-resistant):强有力的攻击者(比如网络供应商或政府)无法阻碍用户自由地使用 Earendil
两种不同的「抗封锁」
这段总结自我之前写的 Two kinds of censorship resistance
读到这里你可能纳闷了,像门罗币(Monero)那种抗封锁虚拟货币不就是又去中心化,又经济上可持续,又抗封锁吗?所谓的 web3 不就是为了解决这种问题吗?问题的关键是要先区分一下两种不同的「抗封锁」:
我们在 Web3 领域说的抗封锁,绝大部分是第一种抗封锁(之后称为甲类)。甲类抗封锁的核心在于避免系统内的「歧视」——以门罗币举例,如果张三和李四都是 Monero 用户,没人有能力精准冻结张三的钱,因为网络上的别人根本区分不出哪些交易是张三做的,哪些是李四做的。
整体来说,甲类抗封锁不是太难实现:只要用加密让别人看不出谁在干啥,再用去中心化确保没有人可以单方面做封谁不封谁的决定,就基本解决了。稍微带点隐私功能的 web3 系统基本上都可以达到甲类抗封锁。
但「乙类抗封锁」防范的是一种更加全面攻击——整个系统被封禁。以 Monero 为例,要防范的不是网络上的节点歧视张三,而是像运营商这种控制基础设施的强敌直接叫停门罗币,或者至少让自己能攻击的张三李四都别想用门罗币。
可惜的是,加密和去中心化这种 Web3 中的常用伎俩对乙类抗封锁其实没啥帮助。全面封锁门罗币并不需要破解加密,试图区分张三和李四的交易,因为「一刀切」封禁所有的门罗币网络流量就可以。去中心化也没有用,因为不管一个去中心化网络的节点有多多,只要正常用户可以逐步获取这些节点的详细信息(绝大部分去中心化网络是这样的),控制网络设施的攻击者照样可以一个一个封锁,直到整个去中心化系统失灵。
更令人烦恼的是,我们现在最有力的乙类抗封锁技术恰恰需要中心化和不透明。这是因为乙类抗封锁技术的瓶颈目前不在隐藏网络通讯是某程序(类似 obfs4 的现代混淆协议可以基本达到这一点),而在于如何避免攻击者通过和正常用户一样的途径,发现连接进入网络的具体方式(比如服务器 IP 地址),进而封锁。解决这个问题必须制造好人和坏人之间的信息不平等,而目前制造这种局面最常见的方式彻底依赖中心化信任。
举例说明,在迷雾通这款抗封锁 VPN 中,想接入网络就必须先用一个「依附自由」在 Netlify 等大型国际 CDN(即不封锁这些大 CDN 就无法封锁)的慢速通讯方式连接到一个中心化的登录服务器上。接下来,这个登录服务器给不同的用户分配不同的服务器——这样,如果有一些用户是攻击者控制的,获得了部分的服务器列表,攻击者仍然无法封锁正常用户使用的服务器。这个中心化服务器甚至可以通过分配服务器给哪些用户会导致它们被封锁而推断出谁是「坏人」,进而封禁。
刚刚说的这种原理适用于基本上所有前沿的乙类抗封锁技术(比如 Snowflake),但很明显,整个设计完全依赖两个超级中心化的被信任对象:一个是 CDN,一个是登录服务器。只要其中一个被攻击者控制,整个网络的乙类抗封锁就会彻底泡汤。
而目前可以搭建类似迷雾通或 Snowflake 这样的系统的世界是极其脆弱的:必须存在攻击者封不起又无法控制的中心化网络平台(如 CDN),还得存在可以安全运营中心化登录服务器的组织。总的来说,这要求攻击者必须只控制世界上部分的网络,而控制的网络又依赖「自由世界」提供的服务。除了一些政府(如中国、伊朗)目前实行的国内网络封锁政策这个历史特例,好像也没啥别的局面符合这种条件。
而我们如果回到 Web3 的初衷,就是信任经济学与加密学而非别人运营的平台保护用户在互联网上组织和交易的自由,那么很明显我们既不能信任运营商,也不能信任中心化平台。
这意味着要想实现 Web3 的梦想,去中心化乙类抗封锁是重要的核心技术。
纯邀请制 + 全局关系网:去中心化抗封锁的秘诀
这段总结自我之前写的这篇博客
如上面所说, Earendil 想要达到去中心化乙类抗封锁,需要解决的核心问题就是如何去中心化地达到「好人和坏人信息不平等」。
Earendil 的解决方案是纯邀请制的 P2P 网络:你如果想加入并使用 Earendil 网络,必须有已经在网络内部,并且信任你的「朋友」私下向你提供他的连接信息拉你进来,然后你才能通过这个朋友接入网络。之后的通讯也与别的 P2P 网络的 bootstrap 不同——你被朋友拉入网络后,再也不会知道你朋友之外的别人的具体连接信息,一切通讯必须通过你知道的朋友进行。
这样,即使你是攻击者,你最多出卖决定信任你的朋友,进而把他们从互联网上封掉,但无法发现也无法封锁绝大部分用户。若每个朋友之间的通讯使用先进的混淆协议,攻击者也没办法通过寻找朋友之间通讯的蛛丝马迹而发现自己不认识的 Earendil 用户。
在这种系统下,每一个用户都有责任也有动力去评估风险,尽量不邀请坏人,因为没有人想因为自己被出卖给了攻击者而从 Earendil 网络上被切断。当然,在危险性低的环境,比如目前的网络「自由世界」,很有可能邀请人会非常随便—— Earendil 整体信任每一个个体自己维护自己的利益。
当然,如果每一个用户真的只知道自己的朋友,整个网络会没太大用:可以通过朋友间的随机传话(即 gossip)达到「广播」的效果,但很难让互相不是朋友的张三和王六互相发现并交流。
解决这个问题的方式是使用朋友之间传话这种广播频道,让整个网络同步一个全局节点关系网:就是网络上所有人,他们的公钥,和他们之间的朋友关系的列表。请注意:这个关系网中并没有人和人之间是如何联系的信息(比如 IP 地址,混淆协议等等),所以仅仅知道关系网是无益于封锁 Earendil 的。
有了关系网之后,张三就知道要想联系王六的话,需要通过李四、郑五,因为李四是自己的朋友,郑五是李四的朋友,而王六是郑五的朋友。只要给李四发一个「收信人:王六」的信息,每一个中间人就都知道要转发给哪个朋友了(就是离王六最近的那个),最终这个信息会很快以最短的时间传到王六。
(实际的 Earendil 网络为了同时达到甲类反封锁——即网络无法「歧视」某些流量——使用洋葱加密的方式,让中间的人并不能直接看到目的地是谁,只能看到「下一跳」是谁,也看不到内容,但整体的原理类似上面的描述)
总的来说,只要我们有三个重要要素:
- 好的混淆协议
- 严格的邀请制
- 包含关系网,但不包含连接信息的全局拓扑
去中心化乙类抗封锁就迎刃而解了。
资助 Earendil 的自由资源市场
这段总结自我之前写的这篇博客
维护这样一个抗封锁架构是需要消耗各种稀缺资源的:带宽、运算、甚至人脉。光凭志愿者提供这些资源的话,网络肯定是很难维持运转的——像 Tor 那样比 Earendil 运营成本更低的系统都不断面临因为志愿者不够而网络过载的状况。志愿者网络也更难抵御故意让网络过载(DDoS 攻击),因为这种情况反而会导致志愿者离开网络,使得资源更加紧缺,网络更加过载。
一种目前比较流行解决方法可以称为「统购统销」模式。这种模式中,一个区块链上智能合约统一给向网络提供贡献的人(比如帮用户「传话」的节点)发放补贴奖励,而同时,想消耗网络资源的人必须先从这个智能合约买「门票」,这样这个智能合约才有资金向贡献者提供补贴。Nym 的奖励机制就是典型的「统购统销」模式。
这种资助模式确实可以解决用户白白「剥削」志愿者的问题,但有一个沉重的代价:为了保证所有人支付的价格和获得的补偿是合理的,这个智能合约必须解决很多高难度问题,实现会相当复杂。比如说 Nym 为了避免路由节点白吃补贴,需要使用复杂且难以万无一失的一套让节点来向智能合约证明真的处理了多少多少流量的算法。统一的收费标准也难以应对不一的实际成本(比如网络带宽的成本在世界不同地区是非常不同的)。另外,虽然目前还没有任何这类网络投入长期大量使用,我认为长期维护这样一个智能合约也很有可能需要不断的人工干预和调整,而因此回到中心化信任的大坑中。
Earendil 没有选择统购统销模式,而是用一个非常简单,完全自由市场的模式:每一对关系网上的「朋友」(比如张三和李四)在 Earendil 上建立连接时,就私自约定这个连接上发信息的收费标准。这个收费标准并不会公布给别人,只需要他们俩知道。而在网络运营过程中,每一次张三和李四之间传输任何数据,张三李四就会双方更新一个「张三李四各欠对方多少钱」的账单。这个账单到了一定的大小(根据这两个人之间的信任度,这个限制可以随意设置),就必须清零——但用任何张三李四双方认可的支付方式都可以,因为别人也不知道也不关心张三李四之间的账单。
这样一种点对点的结算方式就非常简单的保证了,市场行为就会让所有的资源趋于平衡的价格买卖,完全不需要一个统一、巨大的智能合约来猜测正确的收费和补贴。这是因为每一个节点都有动力尽量多的找物美价廉的「朋友」来服务自己,而不使用价格不合理或数据转发服务差的朋友。而这种完全去中心化的市场也就不需要 Nym 那样客观证明自己干了什么活儿的密码学系统——因为账单限额可以无限缩小,就可以达到「一手交钱一手交货」的效果,只需要不满意的一方随时离开就可以避免交易的任何一方白吃服务或卷钱跑路,而并没有向第三方「证明清白」的必要。
Earendil 的结算方式也给每一个提供服务的人自己寻找可信的用户的经济动力。这种经济利益也是我为什么认为纯邀请制能成功的核心——中国的所谓「机场」(即地下翻墙节点)买卖已经证明了,只要释放市场的力量,纯邀请制是可以充分支撑大规模网络自由设施的。
关于账单清零的方式,理论上可以用法币、比特币、门罗币、请吃饭、请喝酒...但实际上的一个重要问题是,这个支付方式本身得是(乙类)抗封锁的,不然攻击者完全可以通过掐断资金流来封锁 Earendil。因此,Earendil 内置一个类似 Lightning Network 但又高度匿名的链下支付系统(Astrape,可以看我挺久之前发表的论文),可以以极低的手续费支付 Mel 区块链的低波动货币 MEL。这个支付系统本身的流量本身都走 Earendil,所以不存在支付系统单独的网络是否容易被封锁的问题,而低手续费也让极低账单限额变得可行。Earendil 默认所有的账单都以 MEL 计价,并且支持 Astrape 结算。
最终还有一个小问题:如果一个人在他所有朋友的账单上都没有了余额,导致他无法说话,那么他其实也就没法跟朋友传输使用 Astrape 支付所需要的信息了!这样,他就一辈子再也没法用 Earendil 了吗?
肯定不行,所以 Earendil 网络必须支持某种免费传输少量数据的能力。
这种非常有限的免费服务实现方法很简单:只要向对方用 proof of sequential work 证明做了 n 天的顺序运算,就可以清零 0.01n MEL 的账单。因为 1 MEL 是和 1 天顺序运算的成本挂钩,这就保证了「免费」实际上比花钱要贵 100 倍——因此理智的用户只会用「免费」数据来沟通付费需要的数据。这样,免费数据对网络不加补偿的负担基本可以忽略不计。(支持这种使用顺序运算配给的免费流量也是为什么账单要用 MEL 计价)
目前的开发进展与路线图
我在 2023 年 7 月在巴黎的 Autonomous Ecologies 2 (「自主生态 2」)会议上宣布了 Earendil 项目后,整个 Mel 的开发中心就转向了 Earendil。Earendil 是一个完全开源的项目,所有的具体进展都可以在 GitHub 项目上查看。
因为 Earendil 的设计非常简洁,开发进展相当的快。在我写这个博客的时候,Earendil 上最核心的功能——点对点的混淆 P2P 网络、全局关系网的广播、基本的洋葱加密通讯——已经实现,已经可以传输类似 UDP 和 TCP 的应用层流量。
我们预计今年年底之前发布一个账单支付之外功能完整的 alpha 测试版本,那时任何人都可以加入 Earendil 的测试网络提供资源,也可以作为用户像使用 Tor 那样使用 Earendil 代理上网流量、架设暗网网站等。
更远期的计划中,在明年 Earendil 的支付系统成熟后,我一直维护的迷雾通项目(即注重隐私和去信任化的一个抗封锁上网,即「翻墙」软件)将从中心化 VPN 改变为对 Earendil 的一个「傻瓜式」外壳。这带来的大量用户就可以快速使 Earendil 成为一个应用常见成熟、用实际的市场(即迷雾通用户制造的带宽费用账单)吸引大量分散的节点运营者参与的去中心化网络。参与的运营者越多,Earendil 的抗封锁性能会越强,最终希望可以让 Earendil 成为在最黑暗的网络环境中仍旧能支撑自由的新网络生态的通讯设施。