受人尊敬的密码学家Moxie Marlinspike写了一些关于以太坊和现代 "加密货币 "生态系统的想法。虽然我一开始就参与了比特币,但我从未参与过以太坊或Web3,目前没有拥有任何加密货币,我大致同意他所说的很多内容。尽管如此,我在几个关键点上有不同意见。在这篇文章中,我将总结Moxie的部分论点,阐述一些不同意见,然后提供一些关于未来道路的建议。
以太坊实际上并不是去中心化的
在谈到关于服务器和密码学的想法之前,我先说一个小小的技术分歧。
Moxie论点的核心是观察到以太坊声称是一个去中心化的生态系统,但不是。这大致是事实。他还观察到,对于这种情况,有很多借口在流传,比如 "现在是早期",作为一个在2009年使用过比特币的人,这似乎是相当错误的。12年的时间足以解决这些问题了。
不幸的是,Moxie将以太坊与所有区块链系统混为一谈。
当人们谈论区块链时,他们谈论的是分布式信任、无领导共识以及所有的工作机制,但往往掩盖了客户最终无法参与这些机制的现实。所有的网络图都是服务器的,信任模型是在服务器之间,一切都与服务器有关。区块链被设计成一个对等人的网络,但没有设计成你的移动设备或你的浏览器真的可能成为这些对等人之一。
随着向移动设备的转变,我们现在牢牢地生活在一个客户端和服务器的世界里--前者完全无法充当后者--这些问题对我来说似乎比以往任何时候都更重要。同时,以太坊实际上将服务器称为 "客户端",所以甚至没有一个词来形容一个实际的不可信任的客户端/服务器界面,它将不得不存在于某个地方,也没有承认如果成功,最终将有数十亿(!)客户端比服务器更多。
我觉得有必要回应这个问题,因为这个评论实际上只对以太坊试用。我很清楚,因为我加入比特币世界的第一个项目是与Andreas Schildbach合作开发一个真正的点对点移动钱包应用,这就是安卓版比特币钱包。它有一个有竞争力的用户体验,并且能够发展一个庞大的用户群,尽管它是以最去中心化的方式建立的。
Bitcoin Wallet for Android
我们能做到这一点,是因为中本聪对不被信任的客户端/服务器界面进行了非常仔细的思考。从第一天起,比特币协议就有一种轻量级客户端模式的概念。中本聪没有给这种模式一个明确的名字,但论文中讨论它的部分标题是 "简化的支付验证",所以我开始把使用它的应用程序称为SPV钱包,这个名字就这样留下来了。SPV模式到底是如何工作的,在其他地方有充分的解释,但简单地说,客户端应用程序像正常一样引导连接到P2P网络,但发送一个特殊的消息说:"请不要向我发送每个区块或交易的内容,我只想看到符合过滤器的交易"。然后,它从对等人那里下载每个区块的头,但不是它们的内容,并进行必要的计算,以选择具有最高总功的区块头链。匹配过滤器的交易提供了一个Merkle分支,将它们与嵌入头文件的Merkle树根相连接。通过这种方式,客户端可以以相当小的带宽、存储和CPU需求穿越区块链,同时将P2P网络作为一个不可信任的对手。在我们的实现中,过滤器是一个布鲁姆过滤器,所以你可以大概率地隐藏你感兴趣的东西(尽管在实践中,真正的用户更关心的是性能而不是这种类型的隐私)。
Moxie观察到:
关于web3,尽管是建立在 "加密 "之上的,但对我来说,令人惊讶的事情之一是,似乎很少涉及到加密技术!"。
我认为刚才概述的协议确实以一些有趣的方式使用了密码学,或者说,在2011年我们建立基础设施的时候,这些方式是有趣的新方式。
这个系统实施起来非常复杂,但效果却出奇的好。我们实施了很多性能技巧,如后台唤醒以保持大致同步,带宽适应,测量对等的延迟,在晚上插电充电时同步等等。虽然SPV钱包的速度永远比不上那些简单地轮询集中式数据库的竞争对手,但对许多用户来说,它们已经足够快了。
那是以前。现在是这样。为什么以太坊不像比特币那样有SPV客户端?嗯,简单地说,它的设计没有考虑到资源消耗(坦白说,也没有考虑到普通商业)。一个比特币的实现不仅可以通过SPV模式控制它的工作量,而且还可以将大量的全模式工作进行并行化和分片化,以获得巨大的可扩展性。这是由于区块内容的设计方式所导致的。以太坊保留了比特币的区块链理念,但从根本上改变了这些区块内部的内容,在这个过程中,不仅失去了拥有移动客户端的能力,而且还破坏了自己通过并行化进行扩展的能力。
不幸的是,在加密货币/区块链领域经常出现的一个问题就是Moxie在这里所做的:把以太坊、比特币和区块链算法混为一谈,导致 "区块链不能很好地扩展 "或 "区块链不能有移动客户端 "这样不正确的结论,而事实更接近于 "以太坊不能做这些事情"。(当然,它可以做许多其他比特币做不到的事情)。如果你感兴趣的问题是 "NFTs是怎么回事?"那么这种区别几乎不重要,因为在比特币社区上头后,它作为一种交易媒介崩溃了--如今我看到用比特币买卖东西的机会比十年前更少了。势头和兴趣都转移到了以太坊。但如果你感兴趣的问题是 "我如何建立去中心化的、保护隐私的系统",那么这个区别仍然很重要。
Signal加密实际上不起作用
上面的论点有点吹毛求疵,所以现在我想提出一个更大胆的反对意见。
通过他在Signal和WhatsApp上的工作,Moxie是我称之为集中式密码学的主要倡导者。他对自己的立场总结得很好,所以我就在这里引用一下。
1、人们不想运行自己的服务器,而且永远不会。
2.一个协议比一个平台的发展要慢得多。
我们应该接受这样一个前提,即人们不会运行他们自己的服务器,设计出能够分配信任而不需要分配基础设施的系统。这意味着架构预计并接受相对集中的客户端/服务器关系的不可避免的结果,但使用密码学(而不是基础设施)来分配信任。
30多年后,电子邮件仍然是未加密的;与此同时,WhatsApp在一年内从未完整加密到e2ee
我同意第1和第2点,但这个论点有一个概念上的问题:密码学不能对同时控制做加密的客户端的对手施加任何限制。使用密码学来击败中心化基础设施是一个矛盾的说法,不可能成功。
让我们把它说得不那么抽象。Moxie声称,Signal和WhatsApp使用端对端加密,以确保他们无法读取我们的信息。我们怎么知道这个说法是真的?我并不反对Moxie,也没有看到任何他不值得信任的证据,但我也对这一信念赋予了零的权重,因为WhatsApp可以在明天悄悄地改变,让一个或多个用户禁用这一技术,甚至没有人注意到,包括Moxie本人。至于Signal,它至少是开源的,但没有办法检查我或我的朋友所使用的客户端是否真的与该源代码相符。即使有,也是不相关的。集中式基础设施可以声称提供隐私,但永远不能提供控制:他们可以在任何时候公开改变交易,如果我不能让我的朋友改用其他东西,我就会被迫继续使用它。
这不是一个理论上的论点。禁用E2E加密已经发生了,尽管几乎没有人知道它。2019年,WhatsApp对信息实行转发限制,以 "减缓谣言、病毒性信息和假新闻的传播"。这代表着对Signal协议的加密目标的彻底失败:任何现代加密方案的基本目标都是确保同一消息加密两次不会加密到相同的字节。这样做的目的是为了阻止对手知道你在重复发送相同的信息,而那些在这方面出错的加密模式(如AES/ECB)是不值得信赖的。然而,一旦Facebook--对手--被视无限通信为混乱的独裁者所控制,他们就简单地改变了客户端,在信息的加密部分之外加入一个转发计数器。对此,任何人都无能为力。它只是在某一天出现了,而所有旨在阻止这种 "攻击 "的花哨的数学方法都是不相关的。
WhatsApp FAQ中的说明性图片
如果一个加密方案不能阻止基础设施供应商对信息的道德价值有意见,那么它的意义何在?
因此,尽管我尊重Moxie的设计和成就,但我不赞成将Signal/WhatsApp的方法作为可以提供隐私、分散控制的东西,甚至作为有任何影响的东西。它充其量只是后来的工作的一个基石,可以满足这些目标,而且它可能确实对Facebook的最坏倾向起到了抑制作用,所以它不是一无是处,但它也不是一个强大的基础。真的,一篇简单的博客文章,说 "我们保证不把信息记录到磁盘上",应该有同等的分量。
这些都是大问题。我们还不希望人们对加密、隐私或去中心化等概念失去信任:
以太坊被宣传为去中心化,但实际上并非如此。E2E信使被宣传为私有化,但实际上并非如此。
快速修复
该怎么做?
首先让我们来看看移动通信工具。这里应该有一个快速的增量改进,可以让他们保持一些中央控制,同时为他们的用户提供有意义的保证:阈值签名。移动操作系统在应用更新之前会检查应用程序包上的签名。这些是正常的ECDSA或RSA签名。有可能不是通过单一的私钥来制作这样的签名,而是通过几个钥匙 "碎片 "的持有者的集体努力。通过分割他们的签名密钥,并将碎片分配给各种能够访问源代码的审计公司,更新可以由该小组批准。如果这些公司分布在世界各地,而且他们的合同是公开的,这可以用来将任意的自然语言规则翻译成Android/iOS应用程序更新引擎可读的二进制签名/不签名决定。
这并不是一个完全的解决方案,因为最终审计公司需要得到报酬(他们必须检查来源是否与所宣传的社会契约相符),因此中央机构--我们的对手--将是挑选审计人员的人。但这仍然是一个很大的进步,这意味着如果Facebook突然决定仅仅阻止转发不足以打击 "谣言 "或 "假新闻",他们会被审计师阻止,他们(希望)会拒绝签署取消加密的更新。
对应用程序开发人员来说,缺点相对较小--推送更新的延迟较高,成本较高--但这对最终用户来说是透明的,不会影响用户体验,而这正是他们最看重的地方。他们可以继续快速迭代应用程序,而不需要移动一个生态系统。
服务器、终端用户和他们的偏好
带有分布式审计的阈值签名将是一个很好的升级,但更传统的方法呢?似乎没有控制就不可能有隐私,没有去中心化就很难有控制,但我们建立去中心化系统的尝试并没有成功。可以做什么呢?
让我们退一步,重新审视我们的一些基础性假设。莫克西认为:
人们不想运行自己的服务器,而且永远不会。
第一个条款当然是真的。第二条是对未来的预测,这是一个众所周知的难以预测的事情。
不愿意运行服务器是根本原因还是仅仅因为现在的情况?为什么非技术用户不愿意运行服务器?毕竟,他们在过去已经通过BitTorrent和Gnutella等程序做了。多人游戏通常也是服务器,因为延迟的原因,只依靠一个中央聚会点进行匹配。AirDrop运行一个服务器,以便工作。等等。
有些原因是微不足道的,很容易识别:
IPv4地址耗尽/防火墙/NAT。笔记本电脑和智能手机的能源/带宽受到限制。主导的服务器操作系统是Linux、AWS、Kubernetes、Apache/Nginx等的一些混合。这种堆栈即使对专家来说也有可怕的可用性。考虑一下为新的Linux服务器配置工作备份是多么的尴尬--这是一个基本的任务,应该很容易,但它不是。但这些事情都是我们当前基础设施的属性,而不是必须普遍存在的事情。像BitTorrent节点、在人们卧室里运行的网络服务器等家庭服务器的 "黄金时代 "是在千禧年之后的几年,当时:
主流操作系统是Windows,即使是服务器应用程序也有GUI。IPv4地址很丰富。防火墙和NAT的使用要少得多。计算机24小时不间断地与主电源相连。
那么显然,今天制约自我运行的分散式基础设施的因素不一定是真的,它们是真的,因为我们不使它们成为假的。一个完全不同的世界是可以想象的。
这里值得注意的是,尽管业界普遍存在着 "一切都应该是网络应用程序 "的群体思维(因此被无端命名为Web3),但苹果公司--这个与技术可用性联系最紧密的公司--并没有真正加入整个网络/云的趋势。他们把一切都作为一个应用来实现,在强大而昂贵的硬件上本地运行,在那里你的数据完全在你的控制之下。特别是在macOS上,你想和苹果分享多少就分享多少。你可以拒绝软件更新,也可以接受它们。你可以轻松地在本地将数据备份到 "时间胶囊"。你可以监控应用程序在网络上可以做什么或发送什么。在许多方面,这是一种反映90年代价值观的传统思维方式,但在与更为集中的ChromeOS的竞争中,它没有以任何方式阻碍苹果的发展。我并不是说苹果是去中心化的典范,因为显然他们不是,而且事实是这样的,这主要是由于他们的历史,而不是任何强烈的支持自由的哲学立场。但仍然如此。他们是一个技术上可能的存在证明。
因此,我的结论是,用户不会运行他们自己的基础设施,或采用更多的去中心化的方法,这实际上并不是必然的。他们今天没有这样做,因为库比蒂诺以外的软件业没有兴趣轻易让他们这样做。尤其是Linux发行版,即使对他们自己的那类人来说,也没能做出一个高度可用的系统。不管像谷歌或Facebook这样的公司如何谈论隐私,他们的文化现在和将来都是立即跳到 "在服务器上做所有事情",当然,苹果知道这一点,并在他们的营销中充分加以利用。
我在这里用非常宽泛的画笔描绘,也有例外--在设备上运行ML模型的趋势就是一个很好的、值得称赞的例子。但我希望你会同意,一般情况是正确的。
前进的道路
我已经思考这些问题很长时间了。这些天,我专注于寻找渐进的、非激进的前进道路。对我来说没有更多的点对点网络,至少在一段时间内没有。
莫克西这样建议:
我们应该努力减轻构建软件的负担。在这一点上,软件项目需要大量的人力投入。即使是相对简单的应用程序,也需要一群人每天坐在电脑前8小时,每天如此,永远如此。情况并不总是这样,曾经有一段时间,50个人在一个软件项目上工作并不被认为是一个 "小团队"。
我完全同意。我认为最重要的是:建立和发布桌面应用程序和小型单机服务器应该更加容易。比加密好得多的是一开始就不把数据发送到另一个地方,而且这比我们实际利用的频率要高得多。苹果公司可以制造出像Pages、Numbers、GarageBand等具有超强竞争力而又私密和分散的 "体验",因为他们在制造电子产品、客户端软件和分销/供应链方面有着深厚的历史。然而,iLife应用程序保持最新,因为苹果建立了自己的应用程序商店基础设施和操作系统,以确保它们的更新。软件行业的其他部分甚至在这些基本问题上都很困难。
构建去中心化系统的第一步:把代码放到今天用户实际插入交流电的强大、高带宽的设备上,保持更新,并出于政治原因在应用商店之外进行。以太坊在这方面完全失败了,Moxie指出这一点是对的。但一旦你真正尝试去做,他们失败的原因是显而易见的:这是一个痛苦的宇宙。笨拙的、被黑掉的、经常被抛弃的工具,糟糕的软件更新系统,众多的软件包和安装程序格式,甚至需要以很多不同的尺寸渲染图标,这些都会拖慢你的速度。
我在2021年的大部分时间都在研究解决所有这些问题的软件。它让你只用一个小的配置文件和一个命令就可以制作自我更新的桌面和服务器应用程序。它还没有准备好进行测试,而且我在开始写这篇论文的时候,实际上并没有打算为我正在做的事情写一个广告,因此目前这个项目还没有网站或邮件列表。你只需要留意我的博客。当它启动时,我会在这里宣布,如果你有兴趣,请订阅更新。
我只想说,这个设计体现了我刚才所倡导的理念:
它是一个工具,而不是一个服务。你在你拥有的任何类型的计算机上本地运行它,它可以为Windows、Mac和Linux进行完全签名和公证的下载,而不需要你拥有这些操作系统。应用程序保持更新。在线更新很容易,只需改变配置文件中的版本,重建并重新上传生成的静态文件到网络服务器。你不必牺牲迭代速度,而且更新技术在每个平台上都是最 "原生 "的(Windows的MSIX,macOS的Sparkle,Linux的软件包管理器)。用户可以被授权。只要你允许,用户可以审查和拒绝升级,例如,因为他们要做历史消息回顾,不想改变他们的设置,或者他们不喜欢新的用户界面等等。或者你可以确保应用程序总是以Chrome浏览器的方式默默地更新:在企业部署或有快速变化的客户端/服务器协议的地方,这一点很有用。选择对你的目标市场最有意义的方式。生成Linux服务器包。同样,来自任何操作系统。它们使用systemd,可以是沙盒,可以依赖其他软件包,如数据库,在安装/启动时自动启动,在适当的时候处理升级等。以这种方式发布的应用程序不一定是点对点的应用程序。像WhatsApp Web这样的集中式服务的简单GUI前台也变得更容易制作。但是,一旦你在桌面上(或Linux服务器),你就会有更多的选择,以及在去中心化/控制/隐私/可用性方面的可用权衡。例如,这个工具的第一个版本将不支持阈值签名的更新,但这是我们非常希望找到时间的一个功能。
我很高兴能推出这个产品和它背后的公司,因为我认为,真正掌握基础知识是解决Moxie发现的一些问题的关键一步。让开发者容易做正确的事情,我们就会有更多的人去做。就这么简单。