AO:构建一个去中心化的 Erlang
作者:ArweaveOasis,来源: @Arweave Oasis 推特
该演讲为 Sam 在南卡罗来纳举办的首次 AO 开发者大会时进行的主旨演讲,围绕 AO 以及 Erlang 语言而展开的话题。以下是演讲全文,Enjoy!
这对我来说是一次特别令人兴奋的演讲。首先,我打算带大家走一段旅程,解释一下 AO 是如何形成的,Erlang 是如何融入其中的,以及这如何融入到我们正在进行的广泛的分布式计算实验中。
我第一次接触计算机是我父母给我买的一台 550 MHz CPU,32 兆字节 ram 的计算机。它大概是在九十年代中期时候的电脑配置。
当我开始使用它的那一刻起,我就被深深地迷住了,这种感觉甚至从来没有停止过。那时正是互联网开始兴起的时候。我不仅可以在自己的计算机上做所有有趣的事情,我还可以连接到其他人的计算机,访问浏览其他人计算机上的信息。我觉得这实在是太酷和令人兴奋了,这真的塑造了我作为个人的旅程。我们可以有共享的信息空间的这个想法。
随着时间的推移,当我们所有人作为一个物种,越来越多地被拉进了 Cyber 空间,这就让这个空间不只是一个浏览信息的地方,而变成了一个可以互相交流,彼此熟识的地方。就好像在座的各位有很多我很熟悉的人,但我们在线下面对面交流的时间可能只有我们交流时间的 2%、3% 左右。
所以无论如何,当我遇到网络时,我被它深深吸引了。但我认为这个世界上最酷的事情,就是超级计算机。
他们看起来很神奇,你可以进行大量的计算,并让一台机器去解决你的问题。但这是一台超级计算机。从九十年代开始,我相信是由日本政府设立的,用来做一些气候科学实验。我猜那时在整个机器的生命周期中,能够真正在其上运行个人程序的人数大概只有三十几人。
这就让我开始思考,我们有这种信息分享的工程,那为什么它不能把一台巨大的计算机分享给每个人呢?
如果我们有互联网,为什么我们不能让每个人都共享应用程序空间,建立可以相互交互的程序呢?
这似乎是一个好主意。实际上那时也在某种程度上实践了这些想法,比如你可以在服务器之间发送数据包,但它非常非常笨拙与缓慢,导致它从未真正地有建设性地发展起来。
直到我刚刚要去大学的时候,我遇到了 Erlang。这是我第一次发现一个编程语言或一个操作系统,能够直观地表达这个想法,即计算的进程,如小单位的计算,能够让任何人运行,并在这个并行环境中自然地相互交互。这正是 Erlang 试图提供的。你可以启动一台机器,在其中运行这个环境。它几乎像一个操作系统,在同一个环境中运行许多不同的应用程序。
然后我去了大学,我有过这样的经历,我们有一个大型的共享 Unix 盒子,这又是同样的想法,但是在小规模上表达了这样的想法,那就是当你有很多不同的人共享同一台计算机,他们的应用程序可以很容易地互相交互。
这是在大约 80 到 100 人的规模上。但你仍然可以看到一部分的乐趣和可组合性。我记得我们会写 shell 脚本,我们会让一个用户在系统中戳另一个用户。当他们被戳的时候。他们会再去戳另一个,形成一种链式反应。这是一个令人愉快的平台,但它仍然离一个分布式的,开放的超级计算机的梦想相距甚远。
然后在那之后,我第一次接触到了以太坊,当时它被称为世界的电脑。
我想,啊!也许这就是我在寻找的东西,这个环境不仅有分布式计算,在计算机科学中它被称为单一系统图像(Single System Image SSI)。我们以许多不同的计算机,让它们看起来像一台计算机,让你无缝地跨越它们操作。
所以它有一个 SSI,这很酷,它也是无需信任的,这是一个相当显著的特性。一旦一个程序在这个计算机上执行,你不需要信任任何人。这与今天的互联网结构以及我们使用的所有网络服务都不相同,实际上,我们目前使用的几乎所有服务,你都需要信任提供服务的人。
以太坊提供了一个不同的世界观。我们可以有一个分布在全世界的超级计算机,统一全人类的计算,其中的每一个程序都不受任何个人或团体的控制。「代码就是法律」是当时的想法,但后来当他们故意打破协议来打破「代码就是法律」的信条时,这成了一个有争议的短语。
不管怎样,我觉得这很酷。当时我还天真地花了 15 美元去参加了他们的 ICO,因为我想,我想要这些代币,这样我可以去运行我的计算。
当他们建立起这个东西之后,原本分布式世界计算机的愿景没有发生。取而代之的是他们在其上建立的庞大的金融经济。原来当你有真正的无需信任的状态变化时,就可以催生出整个去中心化金融生态系统。我们正在看着超过 1000 亿美元的价值被储存在这些机器中。所以那的确是一个惊人的创新。有着深远的意义。
但是,朋友,我的超级计算机在哪里?这不是一个超级计算机。发生了什么,出了什么问题?当你现在试图使用以太坊,坦白地说,它变得荒谬了起来。
我们不能否认他们的确做了很多非常令人难以置信的工作。但它与它开始的时所说的世界计算机相差甚远。以太坊的平均交易费用经常飙升到 25 美元左右,这仅仅只是做一点点的计算,去更新谁拥有什么的状态记录而已。
基本上,这就像七十年代的 IBM 主机。这究竟是怎么发生的呢?
好吧,答案是共享内存系统。所以在以太坊,他们在网络的每一个用户之间,有一个全球共享的内存。它有大概一万到六万之间的网络节点,都在维护那些程序状态的信任性。
所以每个人都在验证,嘿,这个状态转换是有效的。没有人让程序做不应该做的事情,这很好,但是那些程序的内存是共享的,跨越每一个程序和每一个用户的单线程的执行。所以当你想要在以太坊上执行计算时,就会有一条单线,单队列,每个人往这个队列上面加待计算的程序,并排队进行。
在正常的分布式系统设计中,我们会称之为停止世界状态更新(Stop the world state updates)。所以当一个用户过来的时候,我们停止了世界,没有人能用它,然后下一个用户可以去。这是一个纯粹的单线程队列,这显然是超级计算机的反面案例。这甚至比你在计算器上的计算还少。
这是 Solana 的地图。它有世界上许多不同的节点,它比以太坊快得多,但快得多并不足以快到我们在这里谈论的程度。
所以如果我们想创建一个世界计算机,一个分布式的计算机。排队一个一个地生成区块显然是行不通的,以太坊首先采取了共享内存的方法,它现在变成了一种盲目崇拜,每个人都把它当作解决方案。并且所有东西都是在这个思维模式中建立的。
但实际上,共享内存只是两个主要的尝试实现并行的范例之一。所以当我在想如何尝试解释所有这些的时候,我想起了一句引用,共享内存是恶魔。
这句话出自乔·阿姆斯特朗,Erlang 的另一位共同发明者。我认为它非常准确地概括了问题。而且这个问题很有趣,因为如果你在加密空间,你会发现没有人在谈论它,但在计算机科学领域,它已经被争论了 60 年。
乔写道,共享数据的线程不能独立地并行运行。在单核机器上,这无所谓,但在多核 CPU 上,这很重要。
在它们共享数据的执行点,它们的执行变成了串行而不是并行。这正是以太坊正在发生的事情,它只有一个执行线程。而对于 Solana,他们有一些并行线程,但仅是在同一台机器内。每次你想要传输信息或与同一个代理进行交互,就需要再次锁定对那个内存的访问,这使得它从并行变成串行。线程中的临界区域引入了串行瓶颈,限制了可扩展性。
如果我们真的想要高性能,我们必须确保应用程序不共享任何东西。这样我们就可以将解决方案复制到许多独立的 CPU 核心上,你可以在这里将 CPU 核心换成线程,这在去中心化环境中是有效的。
我认为这是对为什么当前的去中心化计算机制不能扩展的准确解释。
所以幸运的是,我们并不是历史上唯一遇到这个问题的人。这张图展示了 1985 年 Erlang 的创造者 Robert Verding 的工作。有趣的是,第一个用例是如何在有许多不同电话通话时,让所有这些通话都由不同的执行线程管理。
显然,他们并没有通过等待同样的锁和共享内存来解决问题。早在 1985 年,他们就尝试了不同的解决方案,我认为这是实现这种功能的最佳范例。令人惊讶的是,还没有人将其应用到加密技术中。
这个解决方案的基本思路是,你可以有两个线程锁定并等待彼此以访问一个状态片段。其中一个更新它,另一个等待,然后另一个更新它,接着下一个人可以访问它。在那个巨大的队列中,我们只是发送我们需要的状态的碎片。我们只共享需要的信息,不互相等待。一切都是异步并行运行。
举个例子,Tom 在 AO 中运行一个计算进程。他给我发送了一条消息,我可能会回复,但我不等待 Tom 的回复,我只是继续做其他事情。他也没有等我。从根本上说,一切都是异步的,这开始看起来像一个真正能创造全球计算机的架构。所以,当你把它连接起来时,你开始看到这样的图景,信息只流向正确的人。你有本地共享状态,而不是全局共享状态,只有需要传递的信息才被传递,一切运行得更加高效。
所以,在使用这种模型时,你可以有许多不同的线程,这些线程同时处理不同的消息,甚至更多。它没有限制,尽管这个看起来有点复杂,但在学术意义上就是如此。
一位名为 Andy 的人曾经写了一篇很好的论文来论述它,他是在 2008 年构建了一个分布式多内核操作系统的 barrelfish 团队。他们在研究的过程中做个模拟,当他们拿一个共享内存的机器并将其扩展到有数千个核心时,得出的结论是它将花费大约 92% 的计算时间在锁的竞争使用上。但如果在一个所有事情都是异步进行的系统中,并且只分享在正确的时间点上需要其他人进行计算的信息,那么一切都会运行得更加顺畅,你可以任意地扩展它。
所以这就是我们如何想出 AO 这个解决方案的。
AO 代表 “actor oriented” 。AO 的前一个名字实际上是 Hyperbeam。Hyperbeam 就是 Erlang 运行的虚拟机。
所以 Erlang 与 AO 以及我们构建的一切深深地交织在一起,这不仅仅是架构,也是一种哲学甚至几乎是美学的交融。虽然我们不再做那种八十年代的电话呼叫的事情,但还是非常接近。并且,我们甚至为它被称为超级光束设计了 Logo。
所以当你在实践 AO 时,你开始看到这种异步通信,这种并行执行的力量。这个 Erlang 首创的这种方式,我们现在已经应用到了一个去中心化的环境当中。社区成员们已经在很好地利用这个。
这张图是一个叫 Gather Chat 的应用。它开发在 AO 之上,屏幕上的每一个个体角色都可以是一个进程,他们都可以并行进行任何数量的计算,但他们可以彼此互动,他们只按需要共享内存。他们发送状态的一部分,并且他们不等待彼此,这使你可以创建真正丰富的体验。我们直觉上觉得在 AO 之上构建的第一件事应该是聊天室。
你无法想象一个聊天室会在 Ethereum 上被建立。因为如果你花费 $25 去发送一条消息,那对人们来说就不会那么有趣了。
这是来自印度的一个团队在 AO 上制作的游戏 The Grid。它是一个在 AO 上的进程,只向正确的人发送恰当的信息,并建立起来这种拥有无需信任、可验证的中立网络空间的体验。在这个游戏中,每一个机器人都是在进程上运行的 AI 代理。它可以做任何数量的计算,然后它通过消息传递系统与其他人进行交互。
我们大约三个月前上线了 AO 的测试网,目前已经有一个相当大且令人兴奋的生态系统围绕着它发展。它似乎真的解锁了人们在去中心化计算空间中想象力与创造力。我们甚至已经能够在 AO 之上运行 Llama 3 了,实现一个完全去中心化的 LLM(大语言模型)。即便如此,你都不会注意到它,因为异步运行的原因,如此规模的计算也不会影响到你的进程的运行。
所以这种并行的,异步的计算模式的核心原则是,我的计算不应该影响你的计算,除非我们真的想要对话。而那只是你给我发一条消息,然后我弄清楚如何处理这条消息的问题而已。所以它开始看起来像一个为人类提供的全球共享的计算机了。我们也真的认为这是去中心化计算的最终形态。
对于这台巨大全球计算机来说,我们的 Arweave 永存网络是其中非常重要的一个环节,我们会让你可以像访问本地硬盘一样访问 Arweave 中的数据。试想一下,这意味着网络中现有的 50 亿条信息,突然成为你本地硬盘的一部分。所以现在你可以构建你想要的任何东西,人们可以相信你的应用在发布后不会被修改。你可以做我们谈论的所有去中心化金融的东西。
昨晚,当我在做这个演讲幻灯片时,我在一些论坛上偶然发现了这篇来自 Erlang 作者 Robert 的帖子。这段话概述了我在心底里长时间以来一直直觉地知道但从未如此优雅地用词表达的东西。
当我们在设计 Erlang 和思考如何使用它的语言特性时,我们更多的是沿着操作系统而不是应用程序的角度来思考问题。我倾向于把它看作不是一个具有并发性的语言,而更像是一个带有语言的操作系统。
如果你使用过 Erlang,你会有同样的感觉。你使用什么语言其实并不那么重要,它实际上是在这个想法下面的语义,即系统中的所有事务都是通过发送消息来完成的。同时,它也指向了这个关于操作系统的想法。
所以当我们在构建 AO 时,我们意识到为了让人们能够更加方便地使用它,就需要有一个用户友好的环境,他们可以在其中操作。所以这就是为什么我们建造了AOS。
如果你在 Crypto 领域工作过,你会发现当你试图在 Ethereum 上部署一个智能合约时,会遇到难以置信的浪费,因为它需要花费数千甚至数万美元才能把你的代码放进机器中,因为它必须被写入这个停止世界的共享状态机制(Stop the world state updates)。
而在 AOS 中,你只需要输入 AOS,它便会为你开启一个你可以用于具体事项的新进程。交互感觉就像一个正常的命令行界面,我们从系统的早期用户那里得到的最大的反馈之一是,使用起来感觉很自然,很有趣。就像当你收到一条消息,你还没有安装一个处理器,一个响应该消息的代码片段,它会直接在控制台上打印出来,所以你可以实时观察你的进程发生了什么。这就像你把你的终端插入到这个巨大的分布式超级计算机中。
那么 Erlang 语言本身呢?坦率地说,它看起来像这样,对于现代的标准来说,它对用户使用体验来说并不是非常友好。可能是因为它是基于一个叫做 Prolog 的六十年代的系统。
所以我们最终实际上选择了 LUA,这是一种非常简单易学的语言。它是在九十年代初建立的,并且非常稳定。它本应该是 JavaScript,但很遗憾它没有成为。JavaScript 就像是在 Erlang 之上加上很多疯狂的东西,然后随着时间的推移,它就像一种不断增长的灾难堆积,变得越发臃肿。
但是 LUA 是那种语言的核心精髓,它简单易懂,没有随着时间的推移添加到它上面的各种疯狂的东西。它只是简单纯粹易学的。几天前在 X 上,有个叫 @DeFi_Dad 的人联系我,他不是一名开发者,但他真的很喜欢这个系统,他可以使用它,他实际上可以开始用它编程。
是的,LUA 看起来很直观,很友好,使得任何人都可以开始用它构建应用程序。我真的认为即使你是一个非技术背景的人,在这里,你很有可能可以在这个分布式超级计算机的基础上构建你自己的第一个应用程序。有趣的是,我们并不是唯一一个想到将 Lua 和 Erlang 结合在一起的人。
事实上,Robert 建造了这个叫做 Lurel 的东西,我会让他来告诉你关于它更多的细节。