dApp 的架构

2025 年 5 月 30 日 | 阅读 8 分钟

去中心化应用 (dApps) 以其安全性、透明性和自主性正在彻底改变数字世界。 与依赖中心化服务器的传统程序不同,dApps (部分或全部) 基于去中心化技术。本文将详细介绍 dApp 的完整堆栈设计,涵盖前端、托管、钱包、智能合约、节点访问、数据存储以及其他可能涉及的元素。尽管每个层面本身就可能需要一个完整的教程,但我们仍将尝试提供对整个堆栈的全面概述。

Architecture of a dApp

节点

区块链网络的节点是参与交易确认和转发的独立服务器。客户端/前端必须与 区块链 网络节点建立连接才能与 dApp 进行通信。然而,消费者也可以通过另一个智能合约或节点直接与 dApp 进行交互!这意味着,如果您的智能合约部署在公共区块链上,人们可以通过除前端以外的其他方式与您的后端进行交互。

通过 Alchemy 和 QuickNode 等服务,开发者可以访问远程节点,专注于开发 dApps,而无需担心维护自己的基础设施。如果您想设置专用节点但仍无法自行管理,Chainstack 是一个不错的选择。作为替代方案,开发者可以使用 Solana 的 Validator 或 Geth (Ethereum) 等程序来运行自己的节点。

节点支持读写操作。如果您的应用程序仅允许从区块链读取数据,则无需交易费用。如果您的 dApp 允许写入操作,则必须支付交易费用(也称为 Gas 费)。例如,Tatum 不仅提供节点,还为 dApp 开发者提供了一种支付用户 Gas 费用的方式,从而使用户无需自行承担此费用。

前端

dApp 的用户界面 (UI) 称为前端 (客户端)。与 web2 类似,它通常使用广泛使用的 Web 技术构建,包括 JavaScript、HTML 和 CSS。Vue、Angular 和 React 等框架也常用于创建动态且响应式的 UI。

前端和后端之间必须有一种通信方式。库需要通信和连接到节点。Ethers.js 和 Web3.js 是最广泛使用的两个 Javascript 库。Web3.py 是最广泛使用的 Python 库。尽管越来越多的 Javascript 库和软件包正在发布,特别是那些支持 React 的,但 Python 生态系统的发展相对缓慢。这些库提供了用于管理 Web3 钱包、获取账户信息、签名交易和其他前端逻辑任务的工具。在将查询提交到由部署在链上的智能合约组成的 dApp 后端之前,dApps 还要求前端与区块链节点建立连接。

虽然自行运行区块链节点可以减少对任何供应商的依赖,但这需要大量资源。Tatum、Ankr、Infura、QuickNode 和 Alchemy 等供应商提供了相应的解决方案。我们感谢 Alchemy 的朋友们,特别是 Vitto,他们创建了 npx 包 create-web3-dapp,其中包含了开始快速开发 dApp 所需的所有组件。

托管

托管是指存储和提供应用程序文件,以便用户可以在线访问和与之交互的过程。在传统的中心化托管中,应用程序的内容由一个或多个专用服务器提供。这种方法通常依赖于单一实体,即托管公司。如今,绝大多数 dApps 都使用中心化托管。这增加了审查和单点故障的可能性。通过将应用程序的数据分散到节点网络中,每个节点都贡献存储和带宽资源,去中心化应用程序托管偏离了中心化范例。Swarm 或 IPFS 是潜在解决方案的示例。如果您想开始托管您的去中心化应用程序,请查看 Fleek。如果您认为去中心化托管是过度设计,请查看 Fleek。

钱包

钱包用于签名区块链交易、管理用户的数字资产和对用户进行身份验证。dApp 中的钱包支持使用底层智能合约进行交易,并保存用户的私钥。许多人对提供良好用户体验、低进入门槛以及最重要的是高用户安全性的钱包类型有不同的看法。一方面,钱包有两种类型:托管钱包和非托管钱包,以及内置浏览器钱包与浏览器扩展。

某些 Web 浏览器,例如 Opera 或 Brave,内置了钱包,允许用户直接在浏览器中与 dApp 进行交互并管理其数字资产。微软最近宣布其 Edge 浏览器也将内置原生钱包。

通过完全控制其私钥,用户可以独立于第三方维护其数字资产。用户必须自行管理私钥,因为大多数可用于与 dApp 通信的钱包都是非托管的。非托管钱包的方法,例如 Magic、Argent 或 Metamask,各不相同。

智能合约

任何 dApp 的基础是其智能合约,它允许写入和读取区块链。智能合约,以 Solidity (Ethereum) 或 Rust (Solana) 等编程语言编写,规定了控制 dApp 功能的规则和逻辑。

一旦部署,标准智能合约的代码就无法更改,这可能在尝试添加新功能或修复错误时造成问题。可通过可升级(代理)合约解决此问题,该合约将合约逻辑与数据存储分开。这些合约由两个主要部分组成,它们本质上是两个或多个智能合约。

  1. 代理合约:代理合约充当中介,在保存合约状态的同时将请求转发给逻辑合约。在更新过程中,此协议不会更改。
  2. 逻辑合约:应用程序的实际代码和业务逻辑包含在逻辑合约中。为了实现平滑更新而不损害合约数据,开发者可以部署逻辑合约的新版本,并修改代理合约以引用更新后的逻辑。

dApp 除了使用内部创建的智能合约外,还可以链接到他人部署的智能合约(协议)。例如,著名的 DEX 聚合 dApp 1inch 已创建智能合约来与 SushiSwap 和 Uniswap 等其他去中心化交易所的智能合约进行通信。

一个链(如 Ethereum)上的智能合约无法直接与另一个链(如 Polygon)上的智能合约进行通信。除了覆盖更广泛的用户群体,支持多个链可以引入更复杂的功能,例如更快的交易吞吐量或零知识证明。实现 Cosmos 等互操作性协议或 Wormhole 等桥接至 dApp 是实现此类跨链连接的唯一方法。

索引解决方案

由于索引解决方案使区块链数据更易于访问和查询,因此它们在去中心化应用程序 (dApp) 生态系统中至关重要。随着区块链的不断扩大和复杂化,直接从链中检索特定数据可能会变得繁琐且耗费资源。为了克服这一困难,索引系统构建了结构化、索引化的 数据库,以实现更快、更有效的数据检索。许多索引解决方案都具有实时数据同步功能,可确保 dApps 在相关事件发生时及时得到通知。这使 dApps 能够准确、快速地响应链上事件来触发 Webhook 或操作。

创建子图最著名的方法是 The Graph,一个去中心化索引协议;然而,包括 QuickNode 在内的多个节点提供商现在都提供索引功能。

数据存储

尽管区块链在存储交易数据方面表现良好,但可扩展性和成本问题使其不适合大规模数据存储。dApp 数据通常使用 IPFS 或 Filecoin 等去中心化存储系统存储在链下,这些系统提供了更有效、更经济的存储选择。为了保护数据的隐私和完整性,一些服务使用分片和加密。在开发 dApp 时,也可以使用中心化数据存储,但这将不再是完全去中心化的。

预言机

预言机智能合约使用 区块链网络 上的数据来执行预先确定的逻辑。然而,为了使许多用例能够正常工作,需要来自其他来源的数据(如天气、市场价格或体育比分)。预言机通过安全地为智能合约提供链外数据来满足这一需求。UMA 和 Chainlink 是知名的预言机。

dApps 如何工作?

dApp 的后端代码运行在去中心化的点对点网络上。与标准程序一样,它也可以拥有用户界面和用任何语言编写的前端代码。IPFS 或任何其他去中心化服务器都可以托管前端。dApps 的工作方式与常规程序类似,除了几个下面将介绍的区别。

dApp 操作具有以下特性:

  1. 去中心化: dApps 由 Ethereum 提供支持,这是一个开放的公共去中心化平台。
  2. 确定性:无论它们在何种上下文中运行,dApps 始终具有相同的功能。
  3. 图灵完备:给定必要的资源,dApps 可以执行任何任务。
  4. 隔离: dApps 在 Ethereum 虚拟机中运行,这是一个虚拟环境,可确保即使智能合约出现错误,也不会干扰区块链网络的正常运行。

dApps 的优点

dApps 的优点包括以下几点:

  1. 容错性:由于 dApps 运行在去中心化平台上,即使只有一个节点运行,网络仍将保持运行,但性能将大大降低。
  2. 隐私:为了使用任何应用程序的特定功能,用户无需提供其真实身份或任何其他个人信息。
  3. 数据完整性:由于使用了共识技术,存储在区块链上的数据是不可更改且牢不可破的。交易无法被黑客伪造,并且存储在区块链上的数据是不可变的。
  4. 平台灵活性:以太坊平台提供了灵活的环境,使得开发 dApps 变得容易。
  5. 可验证行为:智能合约保证以可预测的方式运行,并且可以进行检查,而无需中央机构的监督或干预。

dApps 的缺点

dApps 的一些缺点如下:

  1. 性能开销:为了给以太坊提供期望的安全、透明和完整性,需要大量的性能开销。即使是工作量证明也需要大量的时间和计算能力。
  2. 维护:由于上传到区块链的代码或数据难以更改,并且所有错误修补程序都需要所有网络对等方的共识,而这通常难以及时完成,因此 dApps 难以维护、调试和更新。

总结

去中心化应用程序的完整堆栈由许多层和组件组成,如今有许多供应商和实现策略可供选择。此外,新工具正在迅速开发,dApps 的可用性、功能性和复杂性都在以更快的速度增长。