Web3应用架构(DApp应用架构)

Web 3.0 时代的应用(DApp)架构

Web 2.0时代的应用

Web 3.0 应用 (或"DApps")的架构与Web 2.0 应用完全不同

以Medium为例,这是一个简单的博客网站,让用户发布自己的内容并与他人的内容互动。

作为一个Web 2.0应用,它可能听起来跟简单,但在Medium的架构中,需要许多东西让着一切变成可能。

  • 首先,必须有一个地方来存储基本数据,如用户,帖子,标签,评论,喜欢等等。这需要一个不断更新的数据库。

  • 第二,后端代码(用Node.js,Java或Python等语言编写)必须定义Medium的业务逻辑。例如,当一个新用户注册,发表新博客或在别人的博客上发表评论时会发生什么?

  • 第三,前端代码(通常用JavaScript,HTML和CSS编写)必须定义Medium的用户逻辑。例如,网站是什么样子的,当用户与页面上的每个元素互动时,会发生什么?

把这一切放在一起,当你在Medium上写一篇博文时,你与它的前端互动,它与它的后端进行互动,后者与数据库进行数据的交流。所有的这些代码都托管在集中式服务器上,并通过互联网浏览器发送给用户。这是对今天大多数Web 2.0应用如何工作的一个很好的总结。

Web 2.0 应用架构

但一切都在改变。

区块链技术为Web 3.0应用解锁了一个令人兴奋的新方向。在这篇文章中,我们将重点讨论以太坊区块链带来的东西。

是什么让Web 3.0与众不同?

与Medium等Web 2.0 应用不同,Web 3.0消除了中间人。没有集中的数据库来存储因公程序的状态,也没有集中的网络服务器来存放后端逻辑。

扫描二维码关注公众号,回复: 15049790 查看本文章

相反,你可以利用区块链在一个由互联网上的匿名节点维护的去中心化的状态机上构建应用程序。

通过"状态机",我指的是保持一些给定程序状态和该机器上允许的未来状态的机器。区块链是一种状态机,他被实例化为某种创世状态,并有非常严格的规则(即共识)来定义该状态如何转换。

更好的是,没有一个实体控制这个分散的状态机–它是由网络中的每个人集体维护的。

那么后端服务器呢?与Medium的后端控制方法不同,在Web 3.0中,你可以编写智能合约,定义你的应用程序的逻辑,并将其部署到去中心化的状态机上。这意味着每个想建立区块链应用的人都会在这个共享状态机上部署他们的代码。

前端呢?它几乎保持不变,但有一些例外,我们将在后面介绍。

这里是架构的样子。

近距离观察

现在让我们更深入地了解是什么让这成为可能。

(1)区块链

以太坊区块链经常被吹捧为"世界计算机"。这是因为它是一个全球可访问的,确定性的状态机,由一个点对点的节点网络维护。这个状态机上状态变化是由网络中的对等者所遵循的共识规则所支配的。

因此,换句话说,它被设计成一个世界上任何人都可以访问和写入的状态机。因此,这台机器不属于任何一个单一实体–而是由网络中的每个人共同拥有。

还有一件事要知道:数据智能被写入以太坊区块链–你永远不能更新现有的数据。

(2)智能合约

智能合约是一个在以太坊区块链上运行的程序,定义了区块链上发生的状态变化背后的逻辑。智能合约是用高级语言编写的,如Solidity或Vyper。

由于智能合约代码存储在以太坊区块链上,任何人都可以检查网络上所有智能合约的应用逻辑。
智能合约

(3)以太坊虚拟机(EVM)

接下来,你有以太坊虚拟机,他执行智能合约中定义的逻辑,并处理这个全球可访问的状态机上发生的状态变化。

EVM不懂Solidity和Vyper这样的高级语言,这些语言用于编写智能合约。相反,你必须将高级语言编译成字节码,然后EVM才能执行。

(4)前端

最后,我们有了前台。正如我们之前提到的,它定义了用户界面逻辑,但前端也与智能合约中定义的应用逻辑进行沟通。

前台和智能合约之间的通信比上图中显示的要复杂一些。接下来让我们仔细看一下。

前端代码如何与以太坊上的智能合约进行沟通?

我们希望我们的前端与我们的智能合约进行通信,以便它们能够调用功能,但回顾一下,Ethereum是一个去中心化的网络。以太坊网络中每个节点都保留着以太坊状态机上所有状态的副本,包括每个智能合约相关的代码和数据。

当我们相与区块链上的数据和代码互动时,我们需要与这些节点中一个互动。这是因为任何节点都可以广播请求在EVM上执行一个交易。然后,矿工将执行该交易,并将产生的状态变化传播给网络的其他部分。

有两种方法可以广播一个新交易。

  • 1.建立自己的节点,运行Ethereum区块链软件

  • 使用Infura,Alchemy和Quicknode等第三方服务提供的节点

如果你使用第三方服务,你不必处理自己运行一个完整节点的所有头痛问题。毕竟,在你自己的服务器上设置一个新的以太坊节点可能需要几天时间。(有大量数据需要同步–它甚至可以占用比一般笔记本电脑所能处理的更多带宽和存储)。

此外,随着你的DApp规模的扩大,存储完整的以太坊区块链的成本也在上升,你需要增加更多的节点来扩大你的基础设施。这就是为什么,随着你的基础设施变得更加复杂,你需要全职的DevOps工程师。他们将帮助你维护基础设施,以确保可靠的正常运行时间和快速响应时间。

综上所述,避免这些麻烦是许多DApps选择使用Infura或Alchemy这样的服务来为他们管理节点基础设施的原因。当然,这也是有代价的,因为这创造了一个集中的阻塞点,但让我们把这个兔子图留到下一天。)

继续说,让我们来谈谈提供者。当你需要与区块链互动时,你所连接的节点(无论你自己设置还是使用第三方服务的现有节点)通常被称为"提供者"。

在这里插入图片描述

每个以太坊客户端(即提供者)都是先了JSON-RPC规范。这确保当前端应用程序想要与区块链互动时,有一套统一的方法。如果你了解JSON-PRC的入门知识它是一个无状态,轻量级的远程程序调用(RPC)协议,定义了几个数据结构及其处理规则。它与传输无关,所以这些概念可以在同一进程中使用,通过套接字,通过HTTP,或在许多不同的消息传递环境中使用。它使用JSON(RFC 4627) 作为一种数据格式。

一旦你通过提供者连接到区块链,你就可以读取存储在区块链上的状态。但如果你想写入状态,在向区块链提交交易之前,你还需要做一件事–用你的私钥"签署"交易。

例如,设想我们有一个DApp,让用户阅读或发布博客文章到区块链上。你可能在前台有一个按钮,允许任何人查询某个特定用户写的博文。(回顾一下,从区块链上阅读不需要用户签署交易。)

然而,当用户想要在链上发布一个新的帖子时,我们的DApp会要求用户使用他们的私钥"签署"该交易–只有这样,DApp才会将该交易转发到区块链上。否则,节点将不接受该交易。

这种交易的"签署"时Metamask通常会出现的地方。

在这里插入图片描述

Metamask是一个工具,使应用程序能够轻松地处理密钥管理和交易签名。Metamask还提供与区块链的连接(作为一个"提供者"),因为它已经有了与Infura提供的节点连接,因为它需要它来签署交易。这样一来,Metamaks既是一个提供者,也是一个签署者。

区块链上的存储

当然,如果你正在建立一个应用程序,所有的智能合约和数据完成在以太坊区块链上,这种架构是合理的。但任何在以太坊上构建过应用程序的人都知道,在区块链上存储所有东西会变得非常昂贵。

请记住,对于以太坊,用户每次向区块链添加新数据时都要付费。这是因为向分散的状态机添加状态会增加维护该状态机的节点的成本。

每次用户的交易需要添加新的状态时,要求用户为使用你的DApp支付额外的费用,这不是最好的用户体验。解决这个问题的一个办法是使用一个分散的链外存储解决方案,如IPFS或Swarm。

IPFS是一个用于存储和访问数据的分布式文件系统。因此,IPFS系统不是将数据存储在一个集中的数据库中,而是将数据分布和存储在一个点对点的网络中。这使得你在需要时很容易检索到它。

IPFS也有一个被称为"文件币"的激励层。这个层激励世界各地的节点来存储和检索这些数据。你可以使用像Infura(为你提供一个IPFS节点)或Pinata(提供一个易于使用的服务,你可以将你的文件"钉在"IPFS上,并采取IPFS的哈希值并将其存储在区块链上)这样的供应商。

Swarm也是类似的,它是一个去中心化的存储网络,担忧一个明显的区别。Filecoin是一个独立的系统,而Swarm的激励系统是内置的,并通过以太坊区块链上的智能合约强制执行,用于存储和检索数据。

因此,现在有了IPFS或Swarm,我们的应用架构看起来像这样。

在这里插入图片描述

你可能还会注意到,在下图中,前端的代码没有存储在区块链上。我们可以把这段代码托管在AWS上,就像我们在Web 2.0中通常会做的那样,但这为你的DApp创造了一个中心化的节点。如果AWS瘫痪了怎么办?如果它审查你的应用程序呢?

这就是为什么,如果你想建立一个真正的去中心化的应用程序,你可能会选择在一个去中心化的存储解决方案上托管你的前端,如IPFS或Swarm。

所以现在你的应用架构看起来更像这样。

在这里插入图片描述

查询区块链

到目前为止,我们已经谈到了如何通过部署交易,然后将其发送到区块链上,从而向区块链写入。但从区块链上的智能合约中读取数据呢?有两种主要方式可以做到这一点。

1)智能合约事件

你可以使用Web3.js库来查询和监听智能合约事件。你可以监听特定的事件,并在每次事件被触发时指定一个回调。例如,如果你有一个智能合约,每个区块都会从人A向人B发送一个连续的支付流,那么你可以在每次向人B支付新的款项时发出一个事件。你的前端代码可以监听由智能合约发出的事件,并根据它执行具体的行动。

2)图表

上述方法可行,但它有一些限制。例如,如果你部署了一个智能合约,后来发现你需要一个最初没有包括的事件,怎么办?不幸的是,你必须用该事件和数据重新部署一个新的智能合约。此外使用回调来处理各种UI逻辑很快就会变得非常复杂。

这就是"图表"的的作用。

图表是一个链外索引解决方案,使其更容易查询以太坊区块链上的数据。Graph允许你定义哪些智能合约需要索引,哪些事件和函数调用需要监听,以及如何将传入的事件转化为你的前端逻辑(或使用API的东西)可以消费的实体。它使用GraphQL作为查询语言,许多前端工程师喜欢这种语言,因为与传统的REST API相比,他的表达能力很强。

通过索引区块链数据,The Graph让我们在应用逻辑中以低延迟查询链上数据。

现在,你的DApp架构看起来像这样。

在这里插入图片描述

我们就快完成了,但我们还有一个主要议题:扩展。

扩展你的DApp

正如你可能已经听说的,以太坊没有规模–至少现在还没有。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
很明显,我们在这里有一个问题。在以太坊上建立一个具有高额Gas费用和完整区块的DApp会导致非常糟糕的用户体验。值得庆幸的是,有一些解决方案正在开发中。

一个流行的拓展解决方案是Polygon,这是一个二级拓展解决方案。Polygon没有在主区块链上执行交易,而是有"侧链"来处理和执行交易。侧链是一个二级区块链,与主链对接。每隔一段时间,侧链就会将其最近的区块汇总提交给主链。
在这里插入图片描述L2解决方案的其他例子是乐观的滚动和zkRollups。这里的想法是类似的:我们使用"滚动"智能合约在链外批量交易,然后将这些交易提交到主链。

我们的想法是这样的。二级解决方案在链外进行交易的执行(即缓慢的部分),只在链上存储交易数据。这让我们可以拓展区块链,因为我们不需要在链上执行每一笔交易。这也是的交易更快,更便宜–而且在必要时,它们仍然可以与主以太坊区块链进行通信。
在这里插入图片描述

将所有的东西拼凑起来

如果所有这些都让你头晕目眩,你不是一个人。把所有这些工具 拼凑在一起是很复杂的,可能导致痛苦的开发者体验。但是不要担心–我们开始看到新的开发者框架,这些框架真正改善了开发者体验。

例如,Hardhat是一个开发者框架,使以太坊开发者更容易建立,部署和测试他们的智能合约。Hardhat提供了"Hardhat网络",开发者可以用它来将他们的智能合约部署到本地网络上–而不需要处理实时环境。更好的是,它提供了一个伟大的插件生态系统,使开发者的生活更加轻松。Hardhat还提供了console.log()功能,类似于javascript,用于调试目的。

当然,这只是一个 开始。我希望我们在未来能继续看到更好的开发者工具。

原网页:https://www.preethikasireddy.com/post/the-architecture-of-a-web-3-0-application

猜你喜欢

转载自blog.csdn.net/weixin_45976751/article/details/126032832