网络社会年会

马克.纳达尔|如何建立与架构去中心化网络

本文作者 Mark Nadal

Mark Nadal曾是一位数学家,后来成为程序员。现在的他经营着开源公司ERA(ERA是一个开源创新实验室,专注于将去中心化的网络在基础设施、应用和安全方面)和Gun。Mark曾游历30个国家,他曾领略的多元文化激发了他对学习、分享及为所有人创造免费的开源技术的热情。现在他希望能为所有人提供一个真正的去中心化网络。

Mark Nadal is a mathematician turned programmer. He runs a VC backed Open Source company and has traveled to 30 countries. The diverse cultures he has experienced fuels his passion for learning, sharing, and creating open technology freely for all.



如何建立与架构去中心化网络

文/[美] 马克.纳达尔[Mark Nadal]
译 编/房梓

本文根据马克.纳达尔于第五届网络社会年会“实践智慧之网”主题三“分布式网络“所做的主题演讲整理而成。本文标题原文为”How to Build & Scale the Decentralized Web”。本文作者马克.纳达尔为开源去中心化数据库GUN创始人。

摘要:在此次的演讲中,我将向大家介绍基础的去中心化知识——它意味着什么,它是以怎样的方式影响我们的社会。同时我会和大家探讨我们团队选择的算法是如何服务于月活的三千万用户以及如何在我们的平台上搭建开源软件。

Abstract:In this talk, we’ll start with a basic introduction to decentralization, what it means and how it will impact society.Then we’ll discuss the algorithms our team chose that has let our technology scale to 30 million monthly active users, and how to build Open Source applications with it. 


大家好,我是 Mark Nadal!感谢邀请我参加这次网络社会年会,我很高兴能和大家讨论去中心化网络以及如何扩大其规模的问题。

为了理解“去中心化”,我们得先知道什么是“中心化”。中心化意味着当系统遇到瓶颈或某些缺陷而发生故障时,所有的设备、电脑以及其他相关的人和事都得承受“系统不工作”的后果。而“去中心化”就意味着我们不仅要在一个能够抵御故障、减少故障、不受故障影响、可修复故障的系统上创建一个互联网,还要构建一个更强大和可修复的,对人类来说更好的系统。我们都知道有数十亿人在使用谷歌,但当谷歌服务由于Facebook或亚马逊而宕机,用户就无法完成正在进行的项目和工作,也无法通过网络搜索。在苹果最新的操作系统 Big Sur中,苹果服务器会检查应用程序是否已连接并具有苹果商店的验证证书。当苹果服务器宕机时,计算机上的应用程序就无法被使用,你甚至无法在自己的计算机上打开一个本地应用程序。这是十分令人抓狂且不合理的。更何况,这样的故障可能会发生数十亿次,毕竟或许已经有数十亿人在使用这个操作系统了。总而言之,中心化会给人们带来很多问题,而去中心化是这种情况的应对方法。

图一 中心化网络存在的问题

说到去中心化,我们可能会好奇:哪些算法可以被用来创建和扩展去中心化应用的规模呢?在现存的各种不同的方法中,最著名的方法是“区块链”和所谓的“只添加不可更改”的日志地址,或是DAG (有向无环图);但因为每一条需要增加的额外的信息都要求用户首先了解整个文档的历史内容——要么有它的快照,要么有权验证更新,于是,为验证每个新操作,你就会积累很多不必要的数据。面对日益增多的用户,这样的算法并不是扩展去中心化应用的规模的最佳选项——虽然区块链确实非常棒,尤其是它奇妙的不可更改性。

针对这点,有个很棒的算法叫做CRDT,即“冲突避免可复制数据类型”。这个算法可以同时处理可变和不可变的数据,以更好地完成规模的扩展。以下是这个算法的工作原理:在Alice和Bob的对话中,Alice会问Bob:“你喜欢蛋糕吗?”。Bob不从字面上来解释这句话,他明白在代词“我”到“你”或者是“你”到“我”之间有一种决定性的变化,而这个问题是结合说话者的上下文来解释的。即使Bob收到或听到的实际短语是“你喜欢蛋糕吗?”,他也会把它理解为为“我喜欢蛋糕吗?”,然后,Bob的回复就会是:“是的,我喜欢”。同理,Alice对这个短语的理解是“你”和“我”与实际陈述不一致,它们对应于一个共同的现实模型。Alice和Bob都试图收敛这个短语,Alice提取了Bob说的“我”,这个“我”指向的是 Bob;Bob提取了与他相关的“我”,并明白“我”指的是他自己。“Bob喜欢蛋糕”这种类型的决定论使你会自动接受任何模棱两可的陈述并将其解释为与接收者实际所说的相对或相反的意思,这就是一种收敛(convergence)。这给了我们一个共同的现实模型,我们都能理解并且是正确的收敛复制数据类型,也称为冲突释放复制数据类型。

这会提供一种“确定性的共识”而非“操作性的协调”,因为每一台机器都在运行相同的算法,而两台机器都会接收数据并根据确定性的规则分析数据。举个例子,在GUN的系统中,我们使用字母排序以确保数据无论如何被发送(数据可能不是按字母顺序排列的)都是可被分类的。如果每台电脑都按字母顺序排列完成数据分类,数据是如何发送的就无关紧要了,毕竟,不管数据如何接收,每台机器都将以相同的方式处理数据。这是“收敛复制数据类型”和“换算复制数据类型”运行的示例。让我来解释一下收敛和换算分别是什么意思:“换算”的意思是:a+b=c和b+a=c的运算顺序虽然改变了,但它们最终得到的结果是相同的。而对就减法来说,虽然5-3=2,但3-5=-2。也就是说,在减法中,运算顺序是很重要的。同样的,操作顺序在区块链和,向无环图和只追加日志中也很重要。然而操作的顺序对CRDT这样的交换式复制数据类型来说就不重要。由于顺序不重要,那么,对之前例子里的Bob来说,“你”和“我”就代表同样的结果(result)了。

我们在GUN的系统中使用CRDT算法后,它的规模已经被扩展到每秒可以被大约5万个用户同时使用的程度了。如今,每个月大约有3000万人在使用我们的技术——这太不可思议了!除BitTorrent外,我还没⻅过任何其他的系统有这种可操作的去中心化网络扩展规模。2020年,我们的下载数突破了2亿次,而2019年的数据是2200万。而当我们的下载量在今年7月突破1亿次时,我欣喜若狂,非常感激,这真是一个历史性的时刻!我们的下载量仅用4-5个月就再次翻倍,这得归功于我们社区中令人难以置信的项目,网站及其团队——像Mask的怿斯,他们团队九在Twitter和Facebook以及其他应用程序之上创建的加密通信。总之,我们的技术可以做到的事情真是令人难以置信。看到去中心化网络通过CRDT算法得到动力并扩展规模是无比令人兴奋的。

图二 Gun
图三 去中心化应用程序 “being paste tool”

我们所使用的CRDT算法类型是GUN。GUN(详情请见gun.eco)是一个开源免费的去中心化数据库,内置网络安全协议,其数据是有安全保障的。接下来我将演示如何用GUN简便地创建去中心化应用程序。首先,我们可以把两个浏览器看作两台设备,只需输入单词“Hello World”并在两个设备间进行运算,就能创建“Hello World”应用程序。你可能觉得,制作去中心化的应用程序一定需要复杂的代码,或一些特殊软件之类的;但对我来说,设计一个容易上手的工具至关重要。例如,这个名为“being paste tool”(图三)去中心化的应用只有17行代码。我选用的javascript前端工具是jQuery,除此之外,你也可以用其他javascript前端工具替代它。因为我已经在我的电脑本地安装了GUN,所以我可以直接在代码中引用(reference)它。

要启动名为GUN的数据库,首先要确保它连接到网络中的各个节点。例如,因为GUN可以在用户电脑上和手机上运行,我的电脑本身首先就可以是一个结点。你可能认为GUN结点就像一种比特币节点,但其实,因为使用CRDT算法的GUN设备负担很小(lightweight)且容易扩展规模,所以它不存在正在运行的工作量证明。此外,我们还可以连接到互联网上其他的节点,例如你朋友的笔记本电脑——如果你知道他的IP地址的话。但是因为互联网防火墙,通常我们不能在没有“协调结点(Coordinating Peer)”的情况下直接与其他计算机对话。

“协调节点”或者所谓的“中继点(Relay Peer)”不是中心化的。任一GUN节点都是中继点,包括其他浏览器。在MASK.IO造成的大量的网络流量拥堵的故事中,浏览器将所有数据中继回其他多个中继点,这些中继点由于数据暴增产生了拥堵。有机会我会把这则有趣的故事再细细告诉大家,但总而言之,这些中继点中因为互联网防火墙会自动连接到其他节点,如果你有两个浏览器,可以将这两个浏览器通过web rtc彼此连结。Web rtc是一种“浏览器到浏览器”的技术,也是其他使用网络接口连接两个浏览器的技术通过中继点。总之,我们可以把中继点视为WiFi路由器,WiFi路由器获取信息,将信息沿正确方向传递。如果你只有一个路由器,那么它就是中心化的,但是如果你有很多的话,它就是去中心化的。在去中心化的系统中,任何节点都可以掉线,即使掉线,系统的其余部分仍可以正常工作。总之,我们的第一步是连接到一个去中心化网络,而下一个步则是交互代码。

这个例子中,我使用的是jQuery,它会捕捉到文本区域内发生的所有更改。当有人输入一条新消息时,它不会要求我们去数据库中查找,而是查找“测试”记录(“test record”)后遍“测试”记录并获得“paste”属性 。我们正在尝试构建一个简单的复制粘贴工具,它可以让我们轻松地在不同的设备上复制信息。一旦进入了我们想要放在GUN数据库记录内的数据,一旦我们在所有连接了去中心化应用的计算机上调用下一行,所有设备都将自动被调用。他们会说:“嘿,我想听从对应粘贴连接测试的所有数据变化”。那么,我们就可以将接收到的数据通过去中心化网络进行同步,再将其放回文本区——创建一个分散的应用程序就是这么简单。

图四 待办事项的实时更新

接下来,我要在这里创建一个用户。用户注册后我的后台出现了任务清单,一旦我添加待办事项,它就会自动识别,让同一帐户下的其他登录用户后台也出现该待办事项。这真是太棒了!因为,请看,密码错误就不能登录该系统,而用不同的用户登录则会得到一个不同的用户列表。也许我们都以为创建一个像这样的去中心化应用程序非常困难和复杂,但它其实只包含52行代码。如果你使用 UI 库,代码可能会更少。在这个新的 UI 库(图五)中,有一些基本的 HTML用于创建和登录用户的登录表单,以及用于输入待办事项的表单,也有我想要展示的列表。这里现在包含了GUN,也包括了SEA——它代表安全,加密,授权。SEA包含的代码让我们只需几行代码就可以创建经过加密验证的端对端加密用户。

图五 UI库

我们现在再过一遍像之前那样初始化数据库。gun.user(图六)提供了一个我们能使用的账户。当有人点击注册表单时,屏幕会显示“创建一个新用户”。我们通过了这个用户名和密码——这可能会让很多习惯在其他系统中使用区块链的人感到有些困惑,因为大家都认为用户名和密码是不安全的,你是对的,它们是不安全的;然而这种技术非常酷的一点是,它在加密安全的基础上为你创建了一个公钥,它是加密且安全的。然后,系统尝试将其与正常的用户名和密码组合进行分别的关联。

图六 gun.user(选中处)

我们保证安全的方法是记录密码。拿到密码后,我们使用三种加密方法来确保它受到保护。有一种名为PBDK2的算法,它会使用一个普通密码并将其与salt结合。生成此密钥需要大量的时间和计算机资源,这就是现在用来加密的密码,类似于对称加密中的AES密钥(图七)或非对称加密中的私钥。PBDK2接受任何正常的,我们认为不安全的密码,它对它们进行运算,以创建用于保护和登录到我们系统密钥的加密安全系统。之所以说它安全,是因为如果黑客试图使用gas暴力攻击我们的系统 ,他们将花费50到100年的时间来猜出这个密码。因为在额外的时间里,系统为每一个gas增加了额外的工作量。我们制作了一个卡通视频来展示这些加密算法是如何工作的,你可以去gun.eco/docs/SEA查看视频。

然后是快速查看此应用程序的案例“user.auth”,它有登录功能。现在我们想要通过用户名和密码登录到我们中心化的加密安全帐户,所以在登录后,我们要隐藏我们的登录表单。你可以通过.map转换数据来得到.map待办事项列表,但我们希望保持数据不变,将其传递给UI输出并显示到屏幕上。当用户提交待办事项(To Do)时,我们希望确保找到该用户,访问该数据库上的“Set”属性或“To Do”属性,然后我们可以“set”这些内容。“set”像数学集合(mathematical set),它的工作原理就像一张桌子或一个集合体,我们可以把一个项目或某组东⻄添加到表中。只需53行代码,你就可以创建加密安全的多用户协同应用。

图七 AES密钥

最后我想展示的是克隆TikTok项目。我现在要把“A Big Bunny”这支视频放进数据库里,它不仅可以在标签上同步,还可以拖放视频、照片和歌曲到数据库中,在应用程序之间同步。你可能认为这个简单的例子要求大量的代码,但其实只需34行代码就可以实现它。大家可以在我们的网站和Github上和我们讨论这个项目。

图八 克隆TikTok项目

总而言之,我们已经回顾和演示了加密算法的运作,解释了这项技术背后算法。最后,我还想说一说我们未来的发展方向。既然我们已经创建了一个可扩展到数千万用户的去中心化网络,现在急需被关注的就不只是技术,还有系统的心理学或经济学。我们的计划是创造一系列电子游戏,让人们在一种新型的社交网络上一起玩。这一系列的电子游戏本身将会是去中心化的。如果你有兴趣帮助我们构建去中心化网络的未来并参与其中,就请加入我们的社区吧!

谢谢!我是Mark Nadal,GUN数据库的作者和创建者。作为一家试图为每个人创造更好的去中心化未来的公司,我们希望创造一个全新的纪元。谢谢各位!