受人尊敬的密码学家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的最坏倾向起到了抑制作用,所以它不是一无是处,但它也不是一个强大的基础。真的,一篇简单的博客文章,说 "我们保证不把信息记录到磁盘上",应该有同等的分量。
这些都是大问题。我们还不希望人们对加密、隐私或去中心化等概念失去信任:
快速修复
该怎么做?
首先让我们来看看移动通信工具。这里应该有一个快速的增量改进,可以让他们保持一些中央控制,同时为他们的用户提供有意义的保证:阈值签名。移动操作系统在应用更新之前会检查应用程序包上的签名。这些是正常的ECDSA或RSA签名。有可能不是通过单一的私钥来制作这样的签名,而是通过几个钥匙 "碎片 "的持有者的集体努力。通过分割他们的签名密钥,并将碎片分配给各种能够访问源代码的审计公司,更新可以由该小组批准。如果这些公司分布在世界各地,而且他们的合同是公开的,这可以用来将任意的自然语言规则翻译成Android/iOS应用程序更新引擎可读的二进制签名/不签名决定。
这并不是一个完全的解决方案,因为最终审计公司需要得到报酬(他们必须检查来源是否与所宣传的社会契约相符),因此中央机构--我们的对手--将是挑选审计人员的人。但这仍然是一个很大的进步,这意味着如果Facebook突然决定仅仅阻止转发不足以打击 "谣言 "或 "假新闻",他们会被审计师阻止,他们(希望)会拒绝签署取消加密的更新。
对应用程序开发人员来说,缺点相对较小--推送更新的延迟较高,成本较高--但这对最终用户来说是透明的,不会影响用户体验,而这正是他们最看重的地方。他们可以继续快速迭代应用程序,而不需要移动一个生态系统。
服务器、终端用户和他们的偏好
带有分布式审计的阈值签名将是一个很好的升级,但更传统的方法呢?似乎没有控制就不可能有隐私,没有去中心化就很难有控制,但我们建立去中心化系统的尝试并没有成功。可以做什么呢?
让我们退一步,重新审视我们的一些基础性假设。莫克西认为:
人们不想运行自己的服务器,而且永远不会。
第一个条款当然是真的。第二条是对未来的预测,这是一个众所周知的难以预测的事情。
不愿意运行服务器是根本原因还是仅仅因为现在的情况?为什么非技术用户不愿意运行服务器?毕竟,他们在过去已经通过BitTorrent和Gnutella等程序做了。多人游戏通常也是服务器,因为延迟的原因,只依靠一个中央聚会点进行匹配。AirDrop运行一个服务器,以便工作。等等。
有些原因是微不足道的,很容易识别:
但这些事情都是我们当前基础设施的属性,而不是必须普遍存在的事情。像BitTorrent节点、在人们卧室里运行的网络服务器等家庭服务器的 "黄金时代 "是在千禧年之后的几年,当时:
那么显然,今天制约自我运行的分散式基础设施的因素不一定是真的,它们是真的,因为我们不使它们成为假的。一个完全不同的世界是可以想象的。
这里值得注意的是,尽管业界普遍存在着 "一切都应该是网络应用程序 "的群体思维(因此被无端命名为Web3),但苹果公司--这个与技术可用性联系最紧密的公司--并没有真正加入整个网络/云的趋势。他们把一切都作为一个应用来实现,在强大而昂贵的硬件上本地运行,在那里你的数据完全在你的控制之下。特别是在macOS上,你想和苹果分享多少就分享多少。你可以拒绝软件更新,也可以接受它们。你可以轻松地在本地将数据备份到 "时间胶囊"。你可以监控应用程序在网络上可以做什么或发送什么。在许多方面,这是一种反映90年代价值观的传统思维方式,但在与更为集中的ChromeOS的竞争中,它没有以任何方式阻碍苹果的发展。我并不是说苹果是去中心化的典范,因为显然他们不是,而且事实是这样的,这主要是由于他们的历史,而不是任何强烈的支持自由的哲学立场。但仍然如此。他们是一个技术上可能的存在证明。
因此,我的结论是,用户不会运行他们自己的基础设施,或采用更多的去中心化的方法,这实际上并不是必然的。他们今天没有这样做,因为库比蒂诺以外的软件业没有兴趣轻易让他们这样做。尤其是Linux发行版,即使对他们自己的那类人来说,也没能做出一个高度可用的系统。不管像谷歌或Facebook这样的公司如何谈论隐私,他们的文化现在和将来都是立即跳到 "在服务器上做所有事情",当然,苹果知道这一点,并在他们的营销中充分加以利用。
我在这里用非常宽泛的画笔描绘,也有例外--在设备上运行ML模型的趋势就是一个很好的、值得称赞的例子。但我希望你会同意,一般情况是正确的。
前进的道路
我已经思考这些问题很长时间了。这些天,我专注于寻找渐进的、非激进的前进道路。对我来说没有更多的点对点网络,至少在一段时间内没有。
莫克西这样建议:
我们应该努力减轻构建软件的负担。在这一点上,软件项目需要大量的人力投入。即使是相对简单的应用程序,也需要一群人每天坐在电脑前8小时,每天如此,永远如此。情况并不总是这样,曾经有一段时间,50个人在一个软件项目上工作并不被认为是一个 "小团队"。
我完全同意。我认为最重要的是:建立和发布桌面应用程序和小型单机服务器应该更加容易。比加密好得多的是一开始就不把数据发送到另一个地方,而且这比我们实际利用的频率要高得多。苹果公司可以制造出像Pages、Numbers、GarageBand等具有超强竞争力而又私密和分散的 "体验",因为他们在制造电子产品、客户端软件和分销/供应链方面有着深厚的历史。然而,iLife应用程序保持最新,因为苹果建立了自己的应用程序商店基础设施和操作系统,以确保它们的更新。软件行业的其他部分甚至在这些基本问题上都很困难。
构建去中心化系统的第一步:把代码放到今天用户实际插入交流电的强大、高带宽的设备上,保持更新,并出于政治原因在应用商店之外进行。以太坊在这方面完全失败了,Moxie指出这一点是对的。但一旦你真正尝试去做,他们失败的原因是显而易见的:这是一个痛苦的宇宙。笨拙的、被黑掉的、经常被抛弃的工具,糟糕的软件更新系统,众多的软件包和安装程序格式,甚至需要以很多不同的尺寸渲染图标,这些都会拖慢你的速度。
我在2021年的大部分时间都在研究解决所有这些问题的软件。它让你只用一个小的配置文件和一个命令就可以制作自我更新的桌面和服务器应用程序。它还没有准备好进行测试,而且我在开始写这篇论文的时候,实际上并没有打算为我正在做的事情写一个广告,因此目前这个项目还没有网站或邮件列表。你只需要留意我的博客。当它启动时,我会在这里宣布,如果你有兴趣,请订阅更新。
我只想说,这个设计体现了我刚才所倡导的理念:
以这种方式发布的应用程序不一定是点对点的应用程序。像WhatsApp Web这样的集中式服务的简单GUI前台也变得更容易制作。但是,一旦你在桌面上(或Linux服务器),你就会有更多的选择,以及在去中心化/控制/隐私/可用性方面的可用权衡。例如,这个工具的第一个版本将不支持阈值签名的更新,但这是我们非常希望找到时间的一个功能。
我很高兴能推出这个产品和它背后的公司,因为我认为,真正掌握基础知识是解决Moxie发现的一些问题的关键一步。让开发者容易做正确的事情,我们就会有更多的人去做。就这么简单。
我想安装一个带有一些身份验证的私有(private)Rubygem服务器。我希望能够使用公共(public)Ubuntu服务器托管内部gem。我读到了http://docs.rubygems.org/read/chapter/18.但是那个没有身份验证-如我所见。然后我读到了https://github.com/cwninja/geminabox.但是当我使用基本身份验证(他们在他们的Wiki中有)时,它会提示从我的服务器获取源。所以。如何制作带有身份验证的私有(private)Rubygem服务器?这是不可能的吗?谢谢。编辑:Geminabox问题。我尝试“捆绑”以安装新的gem..
最近,当我启动我的Rails服务器时,我收到了一长串警告。虽然它不影响我的应用程序,但我想知道如何解决这些警告。我的估计是imagemagick以某种方式被调用了两次?当我在警告前后检查我的git日志时。我想知道如何解决这个问题。-bcrypt-ruby(3.1.2)-better_errors(1.0.1)+bcrypt(3.1.7)+bcrypt-ruby(3.1.5)-bcrypt(>=3.1.3)+better_errors(1.1.0)bcrypt和imagemagick有关系吗?/Users/rbchris/.rbenv/versions/2.0.0-p247/lib/ru
在Rails4.0.2中,我使用s3_direct_upload和aws-sdkgems直接为s3存储桶上传文件。在开发环境中它工作正常,但在生产环境中它会抛出如下错误,ActionView::Template::Error(noimplicitconversionofnilintoString)在View中,create_cv_url,:id=>"s3_uploader",:key=>"cv_uploads/{unique_id}/${filename}",:key_starts_with=>"cv_uploads/",:callback_param=>"cv[direct_uplo
您如何在Rails中的实时服务器上进行有效调试,无论是在测试版/生产服务器上?我试过直接在服务器上修改文件,然后重启应用,但是修改好像没有生效,或者需要很长时间(缓存?)我也试过在本地做“脚本/服务器生产”,但是那很慢另一种选择是编码和部署,但效率很低。有人对他们如何有效地做到这一点有任何见解吗? 最佳答案 我会回答你的问题,即使我不同意这种热修补服务器代码的方式:)首先,你真的确定你已经重启了服务器吗?您可以通过跟踪日志文件来检查它。您更改的代码显示的View可能会被缓存。缓存页面位于tmp/cache文件夹下。您可以尝试手动删除
require"socket"server="irc.rizon.net"port="6667"nick="RubyIRCBot"channel="#0x40"s=TCPSocket.open(server,port)s.print("USERTesting",0)s.print("NICK#{nick}",0)s.print("JOIN#{channel}",0)这个IRC机器人没有连接到IRC服务器,我做错了什么? 最佳答案 失败并显示此消息::irc.shakeababy.net461*USER:Notenoughparame
我有一个使用PDFKit呈现网页的pdf版本的Rails应用程序。我使用Thin作为开发服务器。问题是当我处于开发模式时。当我使用“bundleexecrailss”启动我的服务器并尝试呈现任何PDF时,整个过程会陷入僵局,因为当您呈现PDF时,会向服务器请求一些额外的资源,如图像和css,看起来只有一个线程.如何配置Rails开发服务器以运行多个工作线程?非常感谢。 最佳答案 我找到的最简单的解决方案是unicorn.geminstallunicorn创建一个unicorn.conf:worker_processes3然后使用它:
我正在使用Ruby/Mechanize编写一个“自动填写表格”应用程序。它几乎可以工作。我可以使用精彩CharlesWeb代理以查看服务器和我的Firefox浏览器之间的交换。现在我想使用Charles查看服务器和我的应用程序之间的交换。Charles在端口8888上代理。假设服务器位于https://my.host.com。.一件不起作用的事情是:@agent||=Mechanize.newdo|agent|agent.set_proxy("my.host.com",8888)end这会导致Net::HTTP::Persistent::Error:...lib/net/http/pe
我在我的rails应用程序中安装了来自github.com的acts_as_versioned插件,但有一段代码我不完全理解,我希望有人能帮我解决这个问题class_eval我知道block内的方法(或任何它是什么)被定义为类内的实例方法,但我在插件的任何地方都找不到定义为常量的CLASS_METHODS,而且我也不确定是什么here,并且有问题的代码从lib/acts_as_versioned.rb的第199行开始。如果有人愿意告诉我这里的内幕,我将不胜感激。谢谢-C 最佳答案 这是一个异端。http://en.wikipedia
我将以下代码放在一起用于一个简单的RubyTFTP服务器。它工作正常,因为它监听端口69并且我的TFTP客户端连接到它,我能够将数据包写入test.txt,但我不只是写入数据包,我希望能够从我的客户端通过TFTP传输文件到/temp目录。预先感谢您的帮助!require'socket.so'classTFTPServerdefinitialize(port)@port=portenddefstart@socket=UDPSocket.new@socket.bind('',@port)whiletruepacket=@socket.recvfrom(1024)putspacketFile
在previousquestion中我想出了如何在多个服务器上启动经过密码验证的sshsession来运行单个命令。现在我需要能够执行“sudo”命令。问题是,net-ssh-multi没有分配sudo需要运行的伪终端(pty),导致以下错误:[127.0.0.1:stderr]sudo:sorry,youmusthaveattytorunsudo根据documentation,可以通过调用channel对象的方法来分配伪终端,但是,以下代码不起作用:它会生成上面的“notty”错误:require'net/ssh'require'net/ssh/multi'Net::SSH::Mul