Matty

Matters 社區官方帳號 Official account of Matters Community For English community: @Matterslab Everything related to Web3 / Matters Web3相關活動請見: @web3 Building @thespace

Matters Web3 學習會資料|「Web3 技術架構」課程文字稿

逻辑上的去中心化是防止审查与攻击最有效的形式。但是,大部分应用都需要全局共享的代币、积分、排名或者其他状态,就需要一个全局账本,成为逻辑上中心化的系统。

「Web3 技術架構」是Matters Web3 線上學習會的第二門課,由@刘果主講。

在這門課裡,我們學習討論了Web2和Web3在技術架構上的差異、從歷史上看Web3技術的發展變化、目前區塊鏈應用與去中心化網絡的連結方式、去中心化網絡的重要意義與遭遇到的效率問題等等。

以下是課程的具體內容,謝謝果以文字的方式為我們再一次梳理了課程的內容。

Matters Web3 線上學習會每週五早上11點在Matters discord舉行。點擊這裡,進入discord即可參與。


Web3 的定义有很多面,可以是关于人们产生和使用数字资产的方式,也可以是关于去中心化的网络和权力结构。这次讨论的主题是 Web3 应用的架构,所以局限在去中心化的网络结构上。下面的讨论假设参与者了解区块链的基本原理,熟悉“智能合约”等常见术语。

Web2 与 Web3 的架构

Web3 的技术栈在快速演变,同时也依赖于现有的技术。用户仍然使用浏览器获取网页,再透过浏览器与网页应用交互。浏览器本身是复杂而成熟的软件生态,演变缓慢,所以许多 Web3 的技术进步都依赖于与浏览器生态的共生。

在 Web2 的场景中,用户在浏览器地址中输入网址,比如 google.com,浏览器从域名系统(DNS)服务器获得 Google 服务器的 IP 地址,然后从 Google 服务器获得网页应用,最后再将网页应用呈现给用户。当用户与网页应用交互时,网页应用会再次通过浏览器向 Google 的服务器发起请求。


在 Web3 中,这个流程仍然类似。只是此时浏览器从一个基于区块链的域名系统获取网页应用的数据指纹(content hash),然后从一个去中心化的存储系统中获取网页应用本身。当用户与网页应用交互时,网页应用不再向特定的服务器发起请求,而是向区块链、去中心化的存储系统或者索引网络(indexer)等去中心化网络进行读写。


说到“去中心化”,许多讨论指的是对 API 服务器的去中心化。但域名系统的去中心化有时更加重要,特别是在涉及抗审查与封锁的时候,因为域名系统是用户使用应用的第一步,也是 DNS 污染等常见攻击手段的攻击对象。

区块链天然适合作为去中心化的域名系统。域名系统是一张表格,上面记录着域名(如 google.com)和一组数据(比如 Google 的服务器 IP)的对应关系,每一条对应关系由域名的拥有者控制。这等于是一个全局的账本,可以通过区块链来实现。

一个常见的例子是用以太坊上的 ENS,上面的域名既可以用来对应以太坊地址,也可以对应网页应用的数据指纹。所以用户可以用它作为自己钱包地址的简称,开发者也可以用它作为应用的入口。


去中心化应用(DApps)经常以这种方式结合区块链和去中心化存储来提供方便的访问地址。IPFS 适合用来存储静态数据,而 ENS 则可以动态地指向 IPFS 上最新版本的应用。用户通过 ENS 获取数据之吻,然后通过 IPFS 获取指纹对应的数据。

区块链上存储的成本和形态有很多限制,所以应用常常需要额外的索引,负责合并和处理链上数据。一个流行的例子是 The Graph,让开发者将链上数据整合为需要的数据结构,然后使用一种名为 GraphQL 的语言查询整合之后的数据。另一个例子是 RSS3,它将链上数据整合为内容信息流,便于客户端调用。

智能合约常常需要使用链下真实世界的信息,比如一个依据股票市场买卖代币的合约就需要知道股票市场的价格。这种情况下,用户需要信任一台或者一群服务器,由它们向智能合约中输入信息。这些服务器常常被称为“预言机(oracle)”,Chainlink 就是一个流行的例子。

在实际情况中,应用还会依赖更多其他的服务器。比如,大部分应用自己无法直接连接以太坊或者 IPFS,需要依赖服务提供商。这些依赖对于应用架构很重要,决定了整个应用去中心化的程度和抗审查的能力。


去中心化网络演变方向

主机中心与内容中心

我们现在看到的 Web3 架构是过去技术演变的结果。互联网设计之初的心智模型可以被称作“主机中心(host-centric)“,用户在使用时先表明想要访问的主机,浏览器解析主机地址,渲染返回数据,同时全程信任主机。

比如,用户连接到 Facebook 的主机来获取她的信息流,因为她全程信任 Facebook 的主机,Facebook 可以操控她的信息流来增加注意力留存或者插入广告。主机中心的网络必然是以主机为中心的。


构成了互联网的 TCP/IP 协议簇设计之初就是主机中心的。在互联网之前的电话网络中,用户拨通特定的机器地址与另一个用户发起会话,这种心智模型在互联网逐步演变的过程中被沿袭了下来。但随着互联网的进一步演变,大部分用户使用的方式不再是进行一对一会话,而是发布和获取特定的数据,不管是一个联系人发送的邮件,朋友在社交网络上的动态,或者是一部电影的视频文件。

主机中心的模型在这种场景中非常低效,特别是特定数据非常流行的时候。比如,当两个人坐在同一间房间看同一部 Youtube 影片时,两个人需要各自向遥远的 Youtube 的服务器发起请求、建立连接、获得数据,而不能共享他们的数据和带宽。

一个更自然的心智模型是内容中心的网络,也被称作“命名资料网络”。背后的想法是,用户在使用时不是说明自己想要访问的主机,而是说明自己想要获取的数据,向许多不同的计算机发起请求。以这种方式,计算机可以轻易共享带宽。对于应用来说,单个计算机不再重要,相互之间可以取代。所以内容中心网络分发流行内容时非常高效,同时天然容易去中心化。

范·雅各布森是 TCP/IP 协议簇最重要的贡献者之一。他 2006 年在 Google Tech Talks 的演讲“一种理解网络的新视角”里描述了这种思路转换。此后,许多国家的许多研究组都在推进类似的思路。更新的进展可以参考张丽霞教授的演讲“命名网络:一种信息交换的新方式”。

同时,内容中心网络的很多想法已经在不同的项目中实现和落地。BitTorrent 和一些商业 CDN(内容分发网络)使用了内容中心网络的结构,常见的代码版本工具 Git 在某种意义上也是内容中心的。最近兴起的区块链和去中心化存储中也一般都是内容中心网络的结构。

节点发现与数据验证

在一个去中心化网络中,单个计算机被抽象成了节点之一。因为用户的客户端不再与特定的计算机连接,它需要不断地发现网络中新的节点。与网络建立连接时,客户端需要一个节点地址的列表用于启动,通过节点再去发现更多网络中的节点。



因为客户端是在连接随机发现的节点,无法直接信任它们,需要有办法验证获取数据的真实性。所以客户端在请求数据时,命名数据的方式需要同时能够用于验证数据的真实性。

一种命名方式是通过请求内容的哈希值(hash)。哈希值是一段数据的摘要,当数据不同时摘要也会不同,客户端在收到数据后就可以计算摘要来验证收到的数据是否是自己请求的。这种方式适用于静态的数据,分发与缓存效率也很高。IPFS 上的地址,以太坊的交易记录,Git 中 commit 的代号,都用的是内容的哈希值。

对于动态数据来说,因为数据可以被更新,所以客户端没有办法提前知道数据的哈希值。客户端此时可以去验证发布者的身份,先通过发布者公钥的哈希值请求数据,再在收到数据之后验证发布者的数字签名。Dat、IPNS 是通过这种方式验证数据,比特币等虚拟货币也是通过验证数据发布者来验证钱包余额。

综上,如果要组成一个去中心化并且去信任的网络,浏览器加上网页应用组成的客户端需要能够在本地进行节点发现与数据校验。但是浏览器是非常成熟且复杂的软件,演变起来非常缓慢。尽管很多浏览器项目在实验新的通讯协议,比如 Brave Browser、Unstoppable Browser 或者 Agregore Browser,但大部分想做到去中心化的网络应用仍然是依赖中心化的服务器的。


连接去中心化网络

在以太坊或者 IPFS这样的网络内部,节点之间是点对点分发数据的。但是大部分应用的客户端并不会在本地运行一个节点,而是通过一个服务提供商来连接去中心化网络,这些连接常常就变成了中心化的地方。因为应用的开发者需要不断地为服务提供商支付服务费,这些连接也变成了应用在经济上的敞口,导致应用需要源源不断地现金以维持服务。

在以太坊中,存储数据的成本通过 gas fee 的形式支付给网络中的节点,但去读数据的带宽成本并未包含在系统的设计中。其他大多数区块链也都是如此。在 IPFS 中,网络并不包含经济模型,数据存储的成本也是各个节点自行处理,与 BitTorrent、Dat 等系统类似。所以应用层需要使用或者设计激励系统来让节点为终端用户提供存储和带宽。

应用与去中心化网络之间的连接方式在快速改变,反映了 Web3 基建的演变,也反映了 Web3 去中心化的程度乃至整体的技术成熟度。

接下来我们用以太坊和 IPFS 来进一步讨论。以太坊对于区块链有代表性,IPFS 对于点对点存储网络有代表性。

1、连接以太坊

  • 中心化服务提供商

最常见的连接方式是通过中心化的服务提供商,可以是 Alchemy 或者 Infura 这样的专职提供商,也可以是应用开发者自己提供的服务。提供商的角色相对标准和容易取代,但仍然会导致单点故障,也可以被封锁或者攻击。同时,用户和客户端需要无条件地相信服务提供商返回的数据,而没有验证数据真实性的办法。

  • 去中心化服务提供商

服务提供商本身也可以被去中心化,这样客户端不是固定地连接到某个具体的以太坊节点,而是动态连接到许多节点中的一个。去中心化服务提供商可以用代币来激励节点为客户端提供带宽。

Pocket Network 是的一个例子,最近在 Dapp 开发者中流行起来。但因为客户端无法从本地开始寻址,用户仍然需要依赖中心化的服务器来连接节点。同时,因为客户端无法验证数据真实性,网络就需要某种声誉系统和质押机制来惩罚作恶的节点。

  • 索引网络

索引网络是另一种接入以太坊的方式。以太坊网络中的节点是以标准的 API 向客户端提供区块链上的数据,而索引网络中的节点则是向客户端提供索引和整合过后的数据。因为能够存储在区块链上的数据结构非常有限,所以开发者有时需要索引网络来将区块链上的原始数据整合为更适合的数据结构。

一个常见的例子是 The Graph,它让开发者通过一种名为 GraphQL 的查询语言来查询链上数据。开发者可以向 The Graph 的索引网络提交描述数据结构和解析方式的代码,然后向索引网络查询自定义的数据结构。因为客户端不能验证整合之后数据的真实性,The Graph 也需要一个声誉系统和质押机制来惩罚恶意节点。

  • 轻节点

如前所述,要形成一个真正去中心化的网络,用户的客户端需要能够在本地验证数据真实性,并不断发现网络中的其他节点。比特币或者以太坊中的节点都是这样运行的,但是它们对存储的需求太大,一般无法直接运行在客户端中。

所以以太坊中的轻节点对于去中心化非常重要,目前还不常见,还在快速开发中。轻节点可以在不存储区块链全部数据的情况下验证数据真实性,所以可以以点对点的方式连接到以太坊,形成一个真正去中心化的网络。

但是,因为轻节点需要从其他的全节点处下载数据,它们形成了类似于 eDonkey 网络中“吸血驴”的效果,下载数据多于上载数据,导致其他全节点带宽压力增大。目前尚不知道这个问题会多严重,因为轻节点还未广泛使用。一种可能的方案是增加对带宽分享的激励,类似于 Pocket Network,让轻节点为使用的带宽付费,同时维持网络的去中心化。

2、连接 IPFS

从 IPFS 网络中读取数据最常见的方式是通过公共网关,常常是由各个团队自愿提供的。存储数据最常见的方式与以太坊一样,通过中心化的服务提供商。这些服务商可以是 Infura,Pinata,或者 Matters,同时是开发者持续支出的成本。这两种情况也都引入了单点故障的问题,易被封锁与攻击,依赖一个公司的存续和运行。它们也依赖项目方或者其他人免费提供资源,或者找到其他赚回成本的办法。

另一种接入 IPFS 的方式是通过由代币激励的网络,用户通过支付代币让网络中的节点给自己存储数据,比如 Crust Network,Arweave (通过 IPFS 连接桥),或者 Filecoin。Filecoin 同时也让用户付费读取数据。而 Meson Network 则专门提供 IPFS 数据读取,将客户端重定向到附近的 IPFS 节点,并通过代币激励这些节点分享带宽。

不过,只要客户端无法点对点地完成节点发现和数据验证,用户就需要无条件地相信和依赖一个中心化的服务器,不管是用于数据交易还是重定向。这种依赖又一定会引入单点故障。所以形成去中心化存储网络的唯一方式是让客户端也运行一个 IPFS 节点。相比以太坊节点,IPFS 需要的资源少很多,所以已经被用在很多桌面版本的客户端中,比如 Brave Browser,Audius 和 OpenBazaar。这种情况下,用户直接在彼此之间分享数据,如 BitTorrent 和 eDonkey 一样。


去中心化的类别

上面的讨论直接假设“去中心化”本身是目标,常常我们有必要区分讨论的是什么类型的去中心化,其中哪些又是必要的和现实的。Vitalik Buterin 提议过将中心化分为逻辑,架构和政治几个维度:一个系统拆分成两半是否还能正常运作,反映了逻辑上的中心化程度;整个系统由多少计算机、以什么方式组成,决定了架构上的去中心化程度;系统演变当中决策如何做出的,则决定了政治上的去中心化程度。


逻辑上的去中心化是防止审查与攻击最有效的形式,因为网络的一部分仍然和整个网络一样正常运作。Holochain 和 Secure Scuttlebutt 都是这样的例子,在理论上非常稳健和可靠。但是,大部分应用都需要全局共享的代币、积分、排名或者其他状态,就需要一个全局账本,成为逻辑上中心化的系统。

架构上的去中心化也提供了可靠性,因为网络不依赖单个计算机。从之前的讨论我们也可以看到,让客户端进行节点发现和数据验证对于去中心化架构很重要,因为这样才能真正地不依赖单个服务器。不过因为这两点常常都很费计算资源,网页应用需要通过浏览器高效地进行这些操作。所以对于应用开发者来说,这些操作在浏览器中的标准化程度,可以看作是 Web3 去中心化程度甚至技术成熟程度的一个指标。当然,如果对于去中心化有足够强的需求,浏览器标准化之前开发者仍然用 WebAssembly 等技术实现这些功能。

政治上的去中心化也许是更重要的去中心化形式,因为所有的应用都会演变,而演变方向应该是使用和开发产品的人的共同决定的。但政治上的去中心化常常会降低决策速度、增加决策成本,所以应用常常会在逐步成熟的过程中渐进式去中心化。

政治上的去中心化就不在这次讨论的范畴内了,可能也超过了任何一次讨论的范畴,因为从古至今无数的社群和社会都在尝试。这个话题也很难有一个清晰的答案与解法,但是却是我们每个人都能够和需要参与的,无关乎对技术进步的了解。

Like my work??
Don't forget to support or like, so I know you are with me..

CC BY-NC-ND 2.0

與 Matters 團隊一起學習|歡迎參加 Web3 線上學習會

10

Want to read more ?

Login with one click and join the most diverse creator community.