使用Go构建以太坊

embedded/2024/10/31 1:52:16/

本篇内容是根据2021年5月份#181 Building for Ethereum in Go音频录制内容的整理与翻译

在这期节目中,主持人和两位嘉宾将讨论如何使用 Go 构建区块链。Prysmatic Labs(以太坊网络升级背后的公司)的两位联合创始人参与了节目。Raul Jordan 和 Preston Van Loon 向 Angelica 讲述了他们如何创办这家公司,以及使用 Go 为以太坊区块链构建技术基础设施的感受。

过程中为符合中文惯用表达有适当删改, 版权归原作者所有.



Angelica Hill: 你好,欢迎收听《Go Time》。本期我们将讨论使用 Go 语言构建区块链,今天的嘉宾是 Prysmatic Labs 的两位联合创始人。Prysmatic Labs 是负责以太坊网络升级的公司。他们分别是 Raul Jordan 和 Preston Van Loon,他们将分享他们是如何创立公司,以及用 Go 构建以太坊区块链技术基础设施的经历。目前,Prysmatic Labs 维护着以太坊最受欢迎的权益证明实现,管理着价值超过 150 亿美元的网络。

让我们来介绍一下我们精彩的嘉宾。首先是 Raul Jordan,他的代词是 he/him。 Raul出生并成长于洪都拉斯,后来来到美国上大学学习计算机科学。然而在获得 Thiel Fellowship 奖学金后,他决定辍学。在 2017 年,他发现了以太坊,并觉得这就像坐上了通往 3000 年的时光机,他知道这就是他必须从事的工作。

蒂尔奖学金(Thiel Fellowship)是一个声名远播又“臭名昭著”项目,创始人彼得·蒂尔(Peter Thiel), 蒂尔奖学金每年从全球挑选20至25名不满20岁的少年, 邀请他们到硅谷,并提供人脉、资源帮助这些少年创业。每名成员可以拿到10万美元的奖学金,前提是你必须辍学——两年

关于 Raul,一个有趣的事实是他会说粤语,业余时间还练习中国书法。我们可能需要在节目的最后聊聊这个,太棒了。欢迎你,Raul,很高兴你能来。

Raul Jordan: 非常感谢,能来这里真是太好了。

Angelica Hill: 我们的第二位嘉宾是 Preston Van Loon,同样是 Prysmatic Labs 的联合创始人。他的代词也是 he/him。Preston 是一位注重影响力的软件工程师,区块链爱好者,还是一名热衷于航空的飞行员;这一点我也很想多聊聊。和 Raul 一样,Preston 也选择辍学,开始了自学计算机科学和软件工程的旅程。

在创立 Prysmatic Labs 之前,Preston 在谷歌工作,与此同时,他还对以太坊协议及其扩展方案充满了痴迷。2018 年底,Preston 离开了谷歌,全职投身于以太坊,并且从未回头。很高兴你能来,Preston,我非常期待今天的讨论。

Preston Van Loon: 是的,谢谢你邀请我。

Angelica Hill: 对于那些不认识我的听众,我叫 Angelica Hill,我将主持本期节目,我非常兴奋,因为这是我自己还没有机会深入了解的话题,所以我和所有听众和观众一样,期待能够学到很多。

那么我们就直接进入主题吧……对于像我这样的新手来说,能否先为我们打下基础:什么是区块链?构建区块链的技术基础设施意味着什么呢?Raul,你可以先来解释一下吗?

Raul Jordan: 当然可以,我来试试。

Angelica Hill: 太好了。

Raul Jordan: 简单来说,区块链常被描述为一种分布式账本技术。对我来说,这意味着---你可以想象有成千上万台计算机遍布全球,它们共享一个数据库,并且彼此同步,以至于如果有人试图篡改数据库中的内容,他们就不再是核心共识的一部分,基本上不再被视为权威的真相。这让我们可以构建许多非常有趣、非常酷的应用程序,尤其是那些我们称之为“抗审查”的应用程序。这意味着你必须摧毁大多数运行这个网络的计算机,才能进行审查。因此,这对于那些受国家监控加剧的地区或需要这种技术来获得技术访问权的地区来说,尤其有趣。所以对我来说,区块链可以简单地描述为这样的东西。

那么,构建区块链的技术基础设施意味着什么呢?当然,区块链本质上是通过开放互联网相互通信的一组服务器。要构建这样的东西,你需要具备分布式系统的知识,还需要了解数据库技术、点对点网络(P2P networking),并能够应对高度对抗性的环境。区块链的设计是为了抵御各种攻击以及那些试图破坏它的人,而在为它构建软件时,你需要知道如何防范恶意攻击甚至意外攻击。因此,构建区块链技术基础设施涵盖了所有与在对抗性环境中构建服务器相关的内容。

Angelica Hill: 太棒了。那么,以太坊是什么?它在这其中扮演了什么角色?

Preston Van Loon: 是的,当然。以太坊是一个区块链,它的关键特性之一是它不仅拥有自己的货币、自己的代币,或者不管你怎么称呼它;它是通过这种分布式方式在全球成千上万的机器上运行的……就像 Raul 刚才所说的,这是一个完全不同的范式。在传统的计算机科学中,你的所有东西都在你的控制之下,你完全理解它。而在这里,我们处于一个完全不同的网络中。所以以太坊的关键特性是它是一个应用平台,不仅所有这些匿名参与者都同意分布式账本的状态,他们还同意在执行任意代码片段后的世界状态。因此,你可以在这个去中心化的环境中部署所谓的去中心化应用程序(dapp),这种环境是真正无须信任的,其他地方无法实现这种类型的应用程序。

Raul Jordan: 是的,我想补充一点。它基本上就像是一个全球共享的计算机,任何人都可以使用它。与其将代码部署到 AWS 上的某个服务器,不如将代码部署到这个平台上。由于它的去中心化和不可阻挡性,一旦你发布了代码,想要移除或停止它就很困难。有很多原因让你想要这样做,也有很多原因让你不想这样做。我想我们稍后会深入探讨,但有些用例非常适合这个平台,而有些可能更适合传统的中心化模式。

Angelica Hill: 当你开始研究区块链并对加密货币产生兴趣时,你是如何决定进入这个领域并创建 Prysmatic Labs 的?你有考虑过其他探索方向吗?我很好奇你的想法和兴趣是如何结合在一起,形成了今天的成果?

Raul Jordan: 当然。我想 Preston 和我都认为自己是非常务实的工程师,所以当我们刚开始这段旅程时,我们只是对这个全球计算平台的概念感到兴奋。它让我们觉得“哇,这个平台可以为世界带来多么酷的变化。”当然,区块链和加密货币在很多方面都一直声誉不佳,尤其是因为有很多不法用途。而任何新技术都可能面临类似的情况。

我们对以太坊感到兴奋的原因在于,比特币是最早的区块链,作为一种储值手段,它已经有了自己的定位。比特币的主要叙述是它像数字黄金一样存在。但有意思的是,在比特币上你无法运行代码,无法实现图灵完备的去中心化应用。你不能编写自定义的软件来做任何你想做的事情。而以太坊是第一个允许运行去中心化应用的区块链,允许去中心化计算软件;对我们来说,这非常酷。

以太坊拥有最广泛的网络效应,最多的开发者,最多的人在上面构建应用;它不受任何公司或个人控制。有人说它有自己的灵魂……它基本上是社区所有的,这对我们来说非常棒。这就是我们为什么对它感兴趣的原因。

Preston Van Loon: 对,以太坊的社区是我们最初的动机之一。我们各自独立地发现了以太坊。Raul 和我当时从未见过面,我们都处于人生旅程中的相似阶段,试图弄清楚我们想做什么……然后我们发现了以太坊,它有着惊人的潜力,可以对全球社会产生重大影响,真正赋能各种不同的人群。

当我们决定参与以太坊的开源项目时,我们受到了极大的欢迎,这让我个人非常惊讶。我从未体验过像以太坊生态系统中那样充满善意的社区。

Raul Jordan: 是的。我想在我们深入讨论之前,可以先聊聊以太坊到底能为世界带来什么,为什么我们对它如此兴奋。

从我的角度来看,以太坊启用了两大主要特性,这两个词都是我编的:一种是“无许可性”。无许可性意味着没有任何守门人,没有人会告诉你“你不能做这个,因为不允许”。这是一个全球平台,你可以用它做任何你想做的事情……一个例子可能是获得金融服务的途径,比如说,能够获得担保贷款是许多发展中国家的人们无法享受的奢侈品,或者他们甚至可能无法通过银行或国家的批准。因此,无许可性带来了非常有趣的一系列工具,为世界提供了新的选择。

另一个以太坊启用的特性是“无信任性”。无信任性意味着你不需要信任任何中介、任何第三方与你在这个平台上的互动。没有中间商,没有控制公司可以为你改变规则或结果。我们认为这些是区块链技术的两个非常关键的特性,也是以太坊为其上构建的应用程序所启用的关键特性。

Angelica Hill: 不过,在这个领域工作---我想提一点反方的观点---你有没有遇到过风险?有没有负面的方面?我的直觉是“这听起来很棒”,但没有监管、没有规则让我有点犹豫,觉得“哦,这里会不会有风险?”所以我很好奇听一下反面意见,以及你们如何将这些风险考虑在内,并采取措施降低这些风险。

Preston Van Loon: 我认为这个技术的奇妙之处在于,虽然没有规则,但你确实有机会自己定义这些规则。你可以开发所谓的智能合约,或者这些去中心化应用程序,所有人都可以看到并理解这个协议的约束是什么。

如果你在谈论真正的去中心化,还有一个概念叫做 DAO(去中心化自治组织),它是由一群匿名的人组成,他们在协议中拥有投票权,能够进行升级和改变规则。

在以太坊上,或者说在任何区块链上,它像是一个“只写多读”的数据库,你不能删除、移除或更改任何东西,除非这是你写入的代码的一部分。作为协议的参与者或用户,我可以看到这些并根据我的风险评估决定“我是否想参与这个应用”,我可以阅读代码并自己做出判断。

Raul Jordan: 是的,我们可以给听众举一个例子,展示一个在以太坊上可以实现,但在传统世界中无法实现的应用程序……假设我想创建一个彩票创业公司。你给我钱,然后每周我会决定一个获奖者。假设你是一个普通的软件工程师,想要构建这个应用。如果你现在建立一个网站,告诉人们输入他们的信用卡,并且相信“我每周都会公平地决定彩票的获胜者”---你会信任这个网站吗?大概不会吧。

但在以太坊上,你可以阅读代码,所有的应用程序代码都是公开的,可以在区块链上验证。我可以实际阅读这个彩票应用的代码,检查其中的公平性,确认“哦,确实是一个相对公平的抽奖,我不会被智能合约的开发者骗走钱财。”

Preston Van Loon: 你也可以看到确实有一个奖池在那里。有些彩票会说“嘿,买我的抽奖”,但实际上什么也没有。

Angelica Hill: 对,你可能永远不知道是否有人赢了,因为你只是相信有人会赢。

Raul Jordan: 对。这就满足了我们所珍视的“无信任性”特性。

Angelica Hill: 现在我想聊聊你的项目完全是用 Go 编写的,这也是我们今天在《Go Time》上讨论这个话题的原因。我很好奇你们是如何决定使用 Go 的?这个决定是你们做出的,还是基于社区的意见?我很想了解这个过程。

Raul Jordan: Preston,你要不要先介绍一下我们的项目是什么,然后我们再回答这个问题?

Preston Van Loon: 好的,我来先说说项目吧。我们的项目基本上是我们编写了一个以太坊区块链的客户端,这就是人们如何与系统交互和参与其中的方式。如果你与区块链互动,每个人都以某种形式与客户端接口。我们完全用 Go 编写了这个客户端,我们真的很享受这个过程。构建这种东西的主要目标是帮助以太坊扩展……它帮助保护网络,帮助用户与网络交互,通常来说它是与区块链交互的骨干。Raul,如果你想回答为什么我们选择 Go,那就交给你了。

Raul Jordan: 当然,没问题。我们稍微讲得技术一些……以太坊已经运行了很多年,目前最受欢迎的以太坊实现是一个叫做 Go Ethereum 的项目,它是用 Go 编写的。它是 GitHub 上最受欢迎的 Go 仓库之一。以太坊正在升级其基础设施,升级其协议的工作方式,以便更具可扩展性和安全性……为了做到这一点,我们基本上重写了整个协议。我们的实现是一个独立的项目,叫做 Prysm。我们正在重新设计以太坊,并且使用 Go 来实现。

Go 在以太坊上已经被证明是可行的。对于这样一个应用程序来说,并发支持至关重要;单个区块链节点同时处理许多任务---它要处理传入的点对点连接、处理非常高强度的数据,还要不断地响应用户的 API 请求……有很多事情在同时进行,而 Go 为我们提供了一个非常简单的框架,让我们可以构建一个可维护、可测试的系统,并且能够享受并发带来的好处,而这是这种类型的应用程序所必须的。

Angelica Hill: 进入这个项目时,你们之前用过 Go 吗?这是你们第一次接触 Go 吗?我很好奇你们选择 Go 的部分原因是否因为你们对它有经验,了解它作为编程语言的核心优势?

Preston Van Loon: 我认为我们团队中的每个人在刚开始时都有不同的个人动机来使用 Go。对我来说,这是一个学习的机会。我之前在谷歌工作,加入谷歌时,我想探索使用 Go 语言;我认为这是一种非常酷的技术。

然而,正如你知道的,工作时你不一定能使用你想要的语言或技术。我当时在广告部门工作,使用的是 Java,这并不是我特别感兴趣的,但我也不会拒绝谷歌的工作……所以在我进入以太坊的旅程之前,我一直在学习 Go,我还上了一门由 Bill Kennedy 教授的课程;我想他已经在这个节目中出现过几次了……

Angelica Hill: 是的。

Preston Van Loon: ……这是一门为期两天的课程,涵盖了 Go 的所有基础知识,学费大概只要 10 美元。我简直不敢相信……那是我 Go 语言旅程中的一个重要起点。如果 Bill 你在听,非常感谢你!我不确定你是否还记得,但……这对我选择 Go 以及我的学习之旅影响很大。

Angelica Hill: 在深入开发过程时,使用 Go 是否如你所预期?有没有让你感到惊讶的地方,或者在你们决定使用 Go 之后遇到的痛点?

Raul Jordan: 当然,我知道泛型 (generics) 可能是第一个会被提到的问题……

Angelica Hill: 我本来不想提的,但既然你提到了…… [笑声]

Raul Jordan: 我们遇到过很多情况,真的在推 Go 语言的极限…… 特别是,当你用 Go 编写区块链基础设施时,会遇到很多有趣的挑战。我会说,你必须真正准备好应对可升级性,并确保你使用了正确的抽象。举个例子,有一个我们称之为“状态”的数据结构。它基本上是一个巨大的数据结构,跟踪以太坊区块链整个宇宙中发生的许多事情。区块链通过确定性的状态转换向前推进,因此这个状态会被一个称为区块的输入结构修改,然后你会得到一个新的状态,也就是一个后状态。

这个状态需要是可升级的。假设明天大家都同意 “嘿,也许在一年后我们应该把这个数据结构稍微升级一下”。这不像传统软件那样容易,大家可以简单地升级。你只需进行软件升级即可。但这是一个分布式系统,这意味着一旦它在世界上发布,就像你有一个已经发射到太空的火箭,你不能说 “嘿,让我们更换一些零件”。你需要确保有一个迁移策略,确保升级顺利进行。为此,你需要有非常好的抽象,合理地利用接口…… 你需要利用并通过代码生成或重要逻辑的重复使用找到一种平衡来规避 Go 中缺少泛型的问题。

对我们来说,另一个非常重要且使用 Go 的有趣之处是,对于一个像这样的庞大项目来说,开发者很容易出错,因为有太多的活动部件…… 如果你没有设置正确的抽象,某些人可能会受伤。一个例子是,我们之前有一个数据库访问器,你可以从数据库中检索数据,也可以将数据写入数据库。它可能类似于 save state(保存状态),get state(获取状态)。但我们很快意识到,允许写入状态的接口是非常危险的,因为新开发者可能会使用这个接口,想 “哦,让我使用这个接口…… 如果我写入状态应该没问题”,但实际上不应该这样。

因此,我们一直在充分利用可组合接口,确保我们尽可能少地暴露给可能以危险方式与代码交互的开发者。我们认为这非常有趣,我们可以深入探讨很多内容…… 总体来说,我们使用 Go 的方式已经演变,以更好地适应应用的安全要求。

Angelica Hill: 基于你刚刚提到的安全问题,对于你的员工和开源贡献者来说,是否有你们要求他们遵守的安全指南?你们在开发过程中如何保持安全问题始终处于首要位置?也许这只是我个人的看法,但我觉得在这个领域,安全问题极其重要,但同时也是一个你们可能面临许多挑战的领域。我很想听听你们如何处理这个问题,以及如何在前进的过程中始终保持安全意识。

Preston Van Loon: 是的,我认为 Prysm 中的许多变更都必须经过高度审慎的审查。你不仅要看代码在其上下文中的作用,还要看它在整个系统中的作用…… 有很多时候,你只是用一段代码,并带着某些假设在使用它。然而,如果你没有真正考虑到它可能会发生什么,或者它可能被误用的方式,不论是故意的还是无意的,你可能会忽略一些不合适的事情。这可能只是一个性能瓶颈,或者在像以太坊这样的对抗性网络中,攻击者可能会利用它。这是我们始终必须考虑的问题,当我们进行代码审查时,代码审查是我们工作流程中的重要部分。我们必须确保每一行代码至少由另一个人进行审查。当我们有新的贡献者加入时,对这些类型的更改会进行额外的审查。

Raul Jordan: 是的,Angelica,我想你也提到了员工本身的安全问题。

Angelica Hill: 是的。

Raul Jordan: 这是一个有趣的问题。当然,在这个系统中有大量的资金在流动。有人可能会说 “嘿,如果有人威胁开发者添加某个微小但可能非常危险和有风险的变更呢?” 以太坊这样的系统的好处在于开发是足够去中心化的,因此单点故障不那么明显。如果只有一个开发者,一个维护者,并且所有人都使用同一个实现,那么那个人很容易更改规则。但即使那个开发者变得恶意并试图将恶意代码引入代码库,用户也很聪明,大家都有选择权。如果在社交共识中发生这种情况,人们可以分叉项目并自行维护它。

幸运的是,我们不是唯一为以太坊这个重大升级编写代码的人。今天还有另外三个实现在生产中,它们有非常有能力的团队在与我们一起工作。所以我会说责任确实得到了更广泛的分散,不仅仅是 Preston 和我按下一个按钮就能影响所有人。

Preston Van Loon: 我们没有任何单方面权限或类似的东西。我们最关心的是 “这段代码如何被攻击?”,但我们没有任何特别的访问权限或类似的东西,这也是协议设计的原因。你不能信任任何人,甚至包括你自己或开发团队。

Raul Jordan: 是的,没错。我还想补充一点——是的,编写这种软件非常棘手,尤其是与传统的软件工程相比。传统软件通常托管在你自己的服务器上,处于你的控制之下,安全概况完全不同。当你编写一个传统的服务器端应用程序时,通常是一个公司后端,你不需要想---比如说你有一个 Go 文件,你不会去想 “如果攻击者通过了这个文件的第五行、第六行、第七行,会发生什么?” 代码中的每一行基本上都是防御攻击的防线。当你编写这样的代码时,不能有任何疏忽。任何疏忽,尤其是比如空指针异常、恐慌等问题,都可能是灾难性的。它不仅可能意外地被利用,可能只是偶然发生在代码路径中,而且还可能被恶意攻击者轻易利用。

我们经常考虑的一件事是 “这次攻击的成本是多少?如果有人能够利用它,它是否是一种廉价的攻击?如果不是,那么我们是否应该花更多的精力去关注它?”

有很多思维模型可以使用,但确实很可怕,你确实需要有一种非常特别的防御编程思维,即便是提交到代码库中的最小一行代码。

Angelica Hill: 对于那些刚刚加入这个项目的人,你们如何教他们这种防御思维?你们会建议那些对这个领域比较陌生但想要参与进来的人注意哪些事项?也就是说,如何改变他们在编写你们项目代码时的思维方式?

Preston Van Loon: 这是一个很好的问题。关键在于威胁建模,并理解代码的目的,同时思考它可能被滥用的方式。一些常见的陷阱是数值溢出…… 比如在以太坊中,我们处理一些非常大的数字,你可能很容易超出 64 位数的范围。或者你可能使用了一些浮点数,而浮点数会丢失一些精度。当你处理一个区块链网络时,每个人都必须一直达成一致,因此每个实现的行为必须完全相同,精度必须准确无误。

这与安全工程师在审查任何系统时考虑的问题类似,但在区块链中,风险或后果感觉更高,尤其是因为一旦你发现了问题并且它已经发布,修复它非常困难。这就像是一场比赛,比赛的参与者是你、攻击者(如果有的话)和那些你甚至不知道如何联系的数千名匿名用户,你要请求他们 “请更新你们的软件”,同时还要向攻击者暴露 “看,这里有个大漏洞,现在可以利用”。这是一个非常奇怪的领域,我们不得不时刻考虑这些问题。因此,我们在做任何事情时都会考虑到这一点。即便是一些看似无害的代码,我们仍然会试图考虑它可能导致什么问题。

Raul Jordan: 是的,这确实取决于情况,因为不同的更改有不同的风险层次。我们当然会建议贡献者尽量寻找那些标记为 “good first issues”(适合初学者的问题) 或其他初步帮助的地方…… 这些问题,即便出了问题,也不会影响整个系统。有不同层次的威胁。最糟糕的事情之一是我们称之为链分裂的情况。链分裂意味着发生了共识失败,成千上万的节点,其中50%的节点因为一个错误而与其余的节点不一致,或者其他情况;然后没有人能达成一致,那么你如何修复呢?你需要某种社会共识来决定哪个链是权威链。

这是我们最害怕的事情,链分裂,因为这会极大地削弱网络的合法性,并在短期内造成很大的损害,直到问题被解决。所以很多这样的事情可能会发生,因为,正如我们所说,以太坊是一个协议,有一个规范。这个规范就像任何规范一样,它是一个蓝图;你可以自由地实现它,只要你满足标准即可。

例如,当我们的节点(用 Go 编写)与另一个用 Rust 编写的实现交互时,如果在状态转换函数中存在一个小小的分歧,导致了不同的结果,那么你就可能发生链分裂。这类更改当然需要极其严格的审查。任何涉及这部分代码的更改都需要极大的谨慎。然而,很多其他更改更像是实现特定内容的调整,因此威胁模型会有所不同。

Angelica Hill: 我想知道当事情出错时会发生什么。你们是否遇到过某些事情爆发并变得非常关键的情况?我很想听听你们的看法——你们采取了许多措施来防止问题发生,但不可避免地,所有系统都会出错。那么当事情出错时你们会怎么做?

Preston Van Loon: Raul,你想回答这个问题吗?

Raul Jordan: 当然。我们实际上遇到过两次事件。其中一次发生在测试网络上。所谓的测试网络,基本上就是一个大规模的测试环境,模拟真实的环境,但使用的是虚拟货币。所以人们在全球范围内运行它,方式与他们运行真实网络的方式相同,但如果出了问题也没关系。测试网络的目的是让事情出错,这样我们就能对其进行测试。

我们在测试网络中遇到了一次非常严重的事件,这让我们学到了如何在出现问题时与社区互动。事情是这样的,我们在代码中做了一个看似无害的假设,结果这个假设非常糟糕。以太坊---特别是我们的软件是一个同步协议,这意味着时间在其中起着非常重要的作用。基本上,每隔12秒,世界上就有人需要生成下一个区块。因此,大家必须有一个相当准确的计算机时间感,系统才能正常运行。

我们做了一个假设,认为 “嘿,如果人们的时钟不同步,也许我们可以帮助他们通过某种方式调整,比如使用 Cloudflare 的 NTP 服务器”。但实际上,Cloudflare 发生了一个错误,他们报告的正确时间是未来六个小时的时间。因此,运行我们软件的所有节点的时钟都完全混乱了。这是一个巨大的麻烦。问题实际上最终自行解决了,但我们实际上让问题变得更糟了,因为我们告诉大家 “嘿,关闭你的节点” 或 “升级你的软件”。然后你有成千上万的节点同时关闭,试图相互同步,而在一个点对点网络中,你基本上是一个好鱼游在一群鲨鱼中…… 每一个提供正确数据的好节点,周围都有 20 或 30 个提供错误数据的节点。

因此,任何节点几乎都无法与链的状态同步。所以我们从中学到了很多教训。实际上,一切都归结为你如何进行沟通,如何修复这些问题。就像我们之前说的,这就像试图召回已经发到世界各地的物理产品,你不能把它们带回工厂。所以这次事件确实是一个有趣的学习经历,让我们重新审视了编写这类软件时的所有假设。任何地方都不能有单点故障;你需要仔细沟通,一切都需要告诉大家不要惊慌。这是一次非常难忘的事件,教会了我们很多关于分布式系统的知识。

Preston Van Loon: 是的,这确实是一个非常有趣的问题,具体来说是它的原因。我们有一个叫做 Roughtime 的 Cloudflare 服务(译者注:可参考 确保计时服务执行无误 Cloudflare将推出Roughtime),它会从一组参与者那里获取时间报告,然后代码会取这些报告的平均值,其中一个报告者的时间偏差了24小时。这导致客户端认为 “好吧,我的时间偏差了四小时”,所以它开始表现得像是未来四小时的时间…… 然后就像 Raul 说的,我们说 “好吧,大家现在都得更新”,但当这些客户端相互通信时,它们在同步过程中并没有帮助传播正确的信息;它们只是仍然保留着那些信息,因为它们不确定这些信息是否正确…… 是的,我们确实学会了在处理这种问题时要慢慢来,不能让问题变得更糟。我们那次确实让问题变得更糟…… 这也在我们遇到主网中的真实问题时派上了用场,那时是真正有资金在流动的。

当时的问题是,所有的 Prysm 客户端(用 Go 编写的客户端)在没有实际验证某些部分数据的情况下同意了这些数据,另外还有第二个 bug 导致了某些无效数据的生成…… 所以一个 bug 被另一个 bug 极大地放大了,这两者结合在一起导致了一个非常奇怪的情况,Prysm 无法生成区块,因为它无法执行这个转换,持续了数个小时。这一天内发生了两次。我们能够真正坐下来,从所有的经验中汲取教训。我想我们花了30个小时连续工作,才最终发布了一个更新…… 但我们很高兴能够有那些经历,经历了这种情况,在没有真正资金风险的情况下,思考 “当区块链中出现问题时你该怎么做?” 因为这是一种完全不同的范式。你不能只是按下一个按钮,服务在30分钟内更新,所有人都运行同样的代码。情况并不是这样。你必须考虑当你有混合版本时事情会怎样运作,还要考虑如何去联系每个人,因为大家都在不同的时区,有些人根本不在意…… 所以是的,这真的很有趣。

Raul Jordan: 是的。为了量化这个问题的价值…… 要参与共识(共识意味着你运行一个节点,这个节点能够为区块链生成数据,从而推进链的状态),你必须投入我们称之为 “质押” 的东西,你必须质押大量的资本,以以太币(Ether)的形式,这是一种以太坊区块链的原生货币。你需要质押 32 个以太币,我记得没错的话,上周或其他时间,以太币价格涨到了一个疯狂的高度,达到了大约 11 万美元或更多。

为了让大家有一个概念,目前质押在网络中的资金大约在 150 亿到 190 亿美元之间。是一个难以想象的数字。而那次事件暴露出 Prysm 运行了大约 74% 或 75%---抱歉,超过了三分之二,大约是这个比例的整个网络。所以有很多利益相关者依赖于这样的软件…… 因此我们必须非常谨慎地处理。

Angelica Hill: 我很好奇你们是如何测试代码的?你们的测试流程是什么?是回归测试、单元测试吗?你们如何确保在代码进入生产环境之前,已经做好了充分的准备?

Preston Van Loon: 我们有很多层次的测试。最明显的是单元测试,确保在小范围内进行测试。我们有模糊测试,我们有称为规范测试的东西,基本上是符合性测试,由参考实现生成——我们有一个参考实现,所有不同的客户端实现者都可以下载这些测试。基本上,它会告诉你 “有了这些输入,你应该得到这个输出”。我们运行所有这些测试。我们还进行端到端测试,大多数这些测试都在代码提交前完成。所以实际上,如果你提出了一个变更,我们会运行该变更的模拟测试,大约持续十分钟,这基本上就是一个冒烟测试,看看 “你的变更是否让世界继续运行,还是会崩溃?” 这是阻止一些简单 bug 的好方法。

然后我们有一个相当长的预生产浸泡过程。对于我们的软件,我们会将其发布到测试网络中,在这个没有资金风险的环境中运行,但是环境非常接近真实世界的模拟。我们会在那里运行一段时间,检查 “是否有性能回归,是否出现了新的日志,或是否有其他任何奇怪的、令人担忧的东西”,我们称之为预生产浸泡测试。我们还进行金丝雀测试。

Angelica Hill: 从项目现状和未来愿景来看,我很好奇,你们对以太坊的世界以及你们的具体项目有什么展望?接下来会发生什么?你们对什么感到兴奋,或者现在在思考些什么?

Raul Jordan: 是的,我会说,对于那些想了解更多并参与其中的人,我推荐访问以太坊网站。Ethereum.org 是一个非常棒的资源库,它是一个开源资源,里面有关于以太坊的各种非常棒的信息,包括以太坊是什么,它能实现什么,你可以在它上面构建什么,还有未来一两年内以太坊的计划。即将发生的事情是一个叫做以太坊 2.0 的大规模升级,而我们正在为此努力。

当你深入了解并内容,学习即将发生的变化后,你可能会像 Preston 说的那样,试着运行一个节点。在测试网上运行节点是一种很好的方式。我们有一个文档门户,里面有很多关于如何设置节点的说明…… 你甚至可以尝试从源码构建并自己运行它,这真的很酷,因为这样你就可以开始提出问题,比如 Preston 说的那样…… 比如,“哦,为什么它会这样?为什么它使用这么多内存和 RAM?发生了什么?”然后你开始深入挖掘并提出更多问题。

实际上,我们团队中的很多人都是通过这种方式自然加入的。我们有一个 Discord 社区,在这个服务器上我们与用户群体进行交流…… 有些人进来尝试运行节点,然后他们会问,“嘿,为什么这个是这样的?” 最终,很多这些人都全职加入了我们的团队。我觉得这真的很酷。对于那些充满好奇心的人来说,这个领域是完全开放的,所有资源都是可用的,而且有很多乐于解答问题的人。

Angelica Hill: 那如果是有软件工程背景的人加入这个项目,但没有安全背景或密码学知识…… 你觉得这些知识是可以通过自己学习掌握的吗?还是你会建议他们先去学习一下相关知识,阅读一些资料,在参与像你们这样的开源项目之前做好准备?还是说通过你提到的文档,这是一个可以自学的领域?

Preston Van Loon: 你可以查看规范文档,获得一个大致的理解…… 我认为很多人会遇到一个学习曲线,因为有大量的信息需要理解,才能对这样的项目做出有意义的重大贡献,尤其是如果你是从传统的计算机科学或软件工程背景转行到区块链领域——这很有趣,但确实需要学习很多东西。

Angelica Hill: 准备好面对陡峭的学习曲线。

Preston Van Loon: 是的,这就像是一场上坡攀爬,但一旦你掌握了之后,就像是在下坡滑行。你会觉得“哇,这真的很有趣”,然后你就可以轻松前行了。

Angelica Hill: Raul,你有什么要补充的吗?

Raul Jordan: 哦,是的,这确实是一个很有趣的过程…… 当你在学习、提问时,你会真正感受到这其中的乐趣。对,贡献可以涵盖很多方面,从小的结构改进或代码可读性,到一些非平凡的功能。我们非常愿意帮助贡献者在这方面进行贡献。我认为这对我们帮助很大。实际上,有些非平凡的功能是由贡献者编写的,这些功能今天仍在生产环境中运行,并且管理着网络中大量的资金。

Angelica Hill: 所以结论是,你可以做到。只要坚持攀登那道上坡……

Raul Jordan: 任何人都可以做到,是的。我们所做的工作,我们称之为核心开发。核心开发就像是核心协议,是这些系统如何运作的底层基础。这有点像是在为你的计算机操作系统工作。

我们认为任何人都可以成为核心开发者…… 真的,任何人都可以。只需要不断提问,现在是最好的时机。人们愿意帮助,愿意回答问题并引导你。所以,尽管这看起来有些吓人,但几年前当我们刚开始接触这些东西时,我们也有同样的感觉。

Angelica Hill: 当然了。我认为这次的总结就是,这一切真的很酷,非常有趣,而且你可以做到。现在我要切换话题,我们进入我们的“非主流观点”环节,这是我们精彩的 Go Time 播客的一个标志性环节。

Angelica Hill: 正如我之前提到的,你们的非主流观点可以是任何话题。它不需要与区块链或软件工程有关。可以是关于食物…… 几周前我们有一个嘉宾说他不喜欢巧克力,这引起了不少争议……

Raul Jordan: 哦,天哪……

Angelica Hill: 所以我先把话题交给你,Preston。你的非主流观点是什么?

Preston Van Loon: 这是 Raul 和我共同持有的一个非主流观点…… 我们真的不喜欢带骨头的食物。所以像鸡翅,或者像——

Raul Jordan: 尤其是披萨。

Preston Van Loon: 披萨上有骨头实在太荒谬了…… [笑声] 但说真的,如果食物有骨头,我希望我看不到它。我知道肉类和其他食物来自有骨头的动物,但我不想看到骨头。这有点像一种心理障碍。

Angelica Hill: 我希望你是在开玩笑说披萨上有骨头。人们真的会在披萨上放鸡翅吗?我是个素食主义者,不碰肉类,所以这对我来说是个新现象……

Raul Jordan: 你会感到惊讶的…… [笑声]

Angelica Hill: 我感觉我做出了正确的决定,远离鸡翅披萨……

Preston Van Loon: 是的,披萨上没有骨头。我猜这是个流行观点

Angelica Hill: 我觉得这确实是一个非主流观点。我确信有很多人喜欢吃带骨头的食物,比如排骨,我的很多朋友都喜欢。所以我们看看这个观点的走向如何。Raul,你的非主流观点是什么?

Raul Jordan: 我的观点是——我认为大多数现代电子游戏音乐要比流行音乐好得多。

Angelica Hill: 好的……

Raul Jordan: 所以这是我的非主流观点。有一些非常棒的——

Angelica Hill: 你觉得电子游戏音乐比流行音乐好?

Raul Jordan: 是的,没错。

Angelica Hill: 是说特定的流行音乐类型吗?还是说主流音乐?

Raul Jordan: 我会说是主流的现代流行音乐。

Angelica Hill: 那为什么呢?你是玩了很多电子游戏吗?

Raul Jordan: [笑] 好问题。我认为电子游戏音乐在情感、环境和氛围的塑造上投入了很多心思…… 它真的能让你进入某种状态。很多这样的音乐都做得非常好。

Angelica Hill: 我不知道你有没有看过《真人快打》的电影…… 我对它非常痴迷,那部电影的配乐非常棒。在此之前我并没有玩过《真人快打》,但看完电影后我不得不去玩了。

Raul Jordan: 是的

Angelica Hill: 它确实做到了。我不确定这是否会是一个非主流观点,让我们拭目以待。你有听流行音乐吗?

Raul Jordan: 嗯,我觉得还算不少……

Angelica Hill: 还不少。好的。

Raul Jordan: 但我只是觉得电子游戏音乐在让你产生情感方面会更加刻意……

Angelica Hill: 好的。

Raul Jordan: ……比我们大多数在收音机上听到的音乐要更能打动人心。所以这是我的非主流观点。

Angelica Hill: 很公平。Preston,你同意吗?你也认同这个观点,和不喜欢带骨头的食物一样吗?

Preston Van Loon: 是的,我觉得是这样。就像 Raul 说的,电子游戏音乐的创作更加注重传达特定的环境。我猜尤其是当你专注于某件事时,这种音乐可以帮助你,或者让你兴奋起来,或其他…… 是的,我同意这个观点。

Angelica Hill: 真棒。我很想知道这些观点是不是真的算非主流。我觉得我们之前的一些观点其实并没有我想象的那么非主流…… 所以我们拭目以待。

今天真的很开心…… 在结束之前,我很想听听——你们有没有什么想告诉听众的,关于你们的项目、如何参与其中,或者我们应该关注的内容?在 Go 社区里有没有什么大更新是我们应该注意的?

Raul Jordan: 是的。就目前而言,以太坊仍然运行在我们称之为“工作量证明”的机制上。大家可能听说过加密货币挖矿---对环境有害,破坏森林,诸如此类的事情。基本上,以太坊和比特币目前的工作方式是,它们需要全球各地的人运行这些专门的计算机电路,这些电路消耗大量电力来解决一个暴力破解的数学问题,并参与到区块链的共识中。

这种模式是,你投入了大量的现实世界电力,使得任何人想要集体回滚链上的记录几乎变得不可能。你无法回滚比特币或以太坊的区块链,除非你拥有比所有这些人加起来还多的电力,他们都为它投入了巨大的努力。

所以,以太坊正在迁移到我们称之为“权益证明”的机制;不再消耗大量电力,而是你需要锁定大量的以太坊币(ETH),就像押注一样,你用这些加密货币参与共识。如果你做了任何恶意行为,你可能会失去这些押注。这个模式改变了,你不再需要那些疯狂的计算资源;基本上任何人都可以在家用服务器上运行,你可以在一台普通笔记本电脑上运行。

由于以太坊已经是工作量证明,所以向权益证明的过渡非常稳固,因为我们可以利用以太坊这些年积累的所有安全性,转向这种新的模式。我们是构建以太坊权益证明的团队之一。以太坊的工作量证明---也就是挖矿---计划在不到一年的时间内消失,所以基本上市场上不会再有 GPU 短缺问题。你会看到很多非常酷的事情发生,据估计,这种机制能提高大约 99.98% 的计算效率,而且对环境更加友好。这是我们非常激动的一个点,大家可以多关注一下。

Angelica Hill: 这确实很令人兴奋。作为一个对此非常愤怒的人,我一直没有持有任何加密货币就是这个原因……

Raul Jordan: 对的。

Angelica Hill: 这个百分比是理论上的,还是说这是一个可以比较准确的估算?我能用它来追究你们的责任吗?

Raul Jordan: 不,这是真的。

Angelica Hill: 太棒了。

Raul Jordan: 你可以在自己的电脑上运行。这就是我们正在做的事情。所以,是的,我们正在努力摆脱挖矿。我们和你有同样的感受。

Angelica Hill: 这太棒了。你认为其他项目也会朝这个方向发展吗?我指的是以太坊之外的项目。你觉得整个行业会朝这个方向转型吗?尤其是最近一些知名人物,比如 Elon Musk 的评论…… 在那之前,环保问题已经是很多人关注的焦点。你觉得这个领域整体上会朝类似的方向发展吗?

Preston Van Loon: 确实感觉越来越少的项目是基于工作量证明的,更多的项目在使用权益证明或其他类似的抗性机制。这确实是很多人关心的问题,我个人也认为,如果一个项目不转向更高效的机制,那么它在长期内难以生存。

Raul Jordan: 是的。我觉得比特币很难转型。比特币以其不可改变性和稳定性而自豪,它们不太可能采用像这种激进的改变。比特币有一个非常强烈的观点,即工作量证明是唯一的正确路径。我们并不认同这种思维方式。

不过有一点我确实同意,那就是我认为从头开始推出一个权益证明网络是有风险的。因为权益证明,顾名思义,就是你在押注某些东西;你把有价值的东西拿出来冒险,你不希望失去它,以此来确保区块链的安全。如果你从零开始推出一个权益证明项目---那价值从哪里来?你押注的东西没有任何价值,你却告诉我它会安全运行?

所以我对那些纯粹依靠权益证明的项目更加怀疑。我认为这可能非常危险。不过,正如我所说,以太坊已经运行了很长时间的工作量证明,它已经拥有了一个巨大的安全池,转向权益证明对以太坊来说是合理的。所以我认为这里有一个权衡。但是的,我们正在努力推进这个方向……

Angelica Hill: 太棒了。我真的很期待看到它的发展。总之,非常感谢你们今天加入我的节目。这次的讨论非常有趣。准备好吧,我会在 Gophers Slack 上向你们不断提问,因为我也想深入了解。

Raul Jordan: 当然。

Angelica Hill: 真的是一次非常愉快的对话,再次感谢你们。

Preston Van Loon: 是的,感谢你邀请我们。

Raul Jordan: 非常感谢你。


http://www.ppmy.cn/embedded/133765.html

相关文章

Java 代理模式详解

如果目标对象实现了接口,则默认采用 JDK 动态代理,否则采用 CGLIB 动态代理。 代理模式的定义 代理模式是一种设计模式,它为其他对象提供一种代理,以控制对这个对象的访问。代理对象可以在客户端和目标对象之间起到中介的作用&…

基于uniapp微信小程序的宠物救助宠物领养系统

作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏:…

【计网】网络协议栈学习总结 --- 浏览器上输入网址域名后点击回车,到底发生了什么?

未来的路不会比过去更笔直,更平坦, 但是我并不恐惧, 我眼前还闪动着道路前方野百合和野蔷薇的影子。 --- 季羡林 《八十抒怀》--- 浏览器上输入URL后回车,到底发生了什么? 1 前言2 解析URL形成http请求3 DNS域名解…

60V恒流IC SL8443B内置功率MOS 支持2.5A电流 降压LED恒流驱动芯片

一、概述 SL8443B是一款高性能的LED恒流驱动芯片,具有60V的耐压能力,适用于高电压应用场景。它内置了5A(或说5V,根据上下文理解为功率等级)的功率MOS,可以减少外部元件数量,降低成本&#xff0…

基于微信小程序的图书馆座位预约系统+LW示例参考

系列文章目录 1.基于SSM的洗衣房管理系统原生微信小程序LW参考示例 2.基于SpringBoot的宠物摄影网站管理系统LW参考示例 3.基于SpringBootVue的企业人事管理系统LW参考示例 4.基于SSM的高校实验室管理系统LW参考示例 5.基于SpringBoot的二手数码回收系统原生微信小程序LW参考示…

利用EasyExcel实现简易Excel导出

目标 通过注解形式完成对一个方法返回值的通用导出功能 工程搭建 pom <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance&qu…

vue组件在项目中的常用业务逻辑(1)

若要使用一个组件&#xff08;已有基本结构&#xff09; 1.在api>index.js获取接口数据&#xff08;这里是模拟数据&#xff09; 2.去vuex仓库&#xff08;store>home.js&#xff09;存储数据&#xff08;state mutations actions三连环&#xff09; &#xff08;准备…

如何解决前端发送数据到后端为空的问题

在进行前后端交互时&#xff0c;经常会遇到前端发送数据到后端时数据为空的问题。本文将详细探讨如何解决这一问题&#xff0c;并提供具体的解决方案。 问题描述 在前后端交互过程中&#xff0c;前端通过 axios 发送数据到后端&#xff0c;但在后端接收时发现数据为空。这可能…