# 译文：定义Web3技术栈

By [稻田君](https://paragraph.com/@daotian) · 2022-05-10

---

[原文](https://edgeandnode.com/blog/defining-the-web3-stack)《[Defining the web3 stack](https://edgeandnode.com/blog/defining-the-web3-stack)》作者 [Nader Dabit](https://twitter.com/dabit3) 拥有10年“传统 (web2)”互联网全栈开发的经验，并在2021年4月开始投身于 web3 开发。

我们先回想一下，用传统的全栈开发搭建一个网页或移动应用时，基本可以依托于大量现有的技术轮子，很快就可以搭建市面上几乎所有能想到的应用。我们经常会用到下面这些技术：

*   API 服务端（比如 REST 或是 GraphQL）
    
*   用户验证（通常自建或使用第三方）
    
*   数据库 （关系型数据库或者 NoSQL）
    
*   客户端（各类框架、平台或类库，如 Vue/React）
    
*   文件存储（比如短视频的存储）
    

使用这些核心组件，我可以构建出我想要的大多数类型的应用程序，或者至少可以实现大部分目标。那么这在 web3 中是什么样子的呢？

事实证明，这个问题的答案并不那么简单，因为：

1.  逻辑在许多方面完全不同
    
2.  web3 工具、技术和生态系统不如 web2 成熟
    

我也更难理解如何启动和运行以及构建 web3 应用程序，因为我处理问题的方式与我在 web2 世界中的方式相同。

在过去 8 个月左右的工作、研究、实验和构建之后，我想分享一下我学到的东西。

* * *

什么是 web3？
---------

我们先来看看什么是 web3，然后再去探究 web3 技术栈。毕竟 web3 还在比较早期萌芽的状态，网上能找到各种各样的对 web3 的解释，但 Nader 认为 web3 最为准确的[解释](https://twitter.com/jbrukh/status/1449734638788821002)是：

> web3 是一组开发去中心化应用时所必须遵循的协议。

遵循这些协议，我们就可以开发去中心化应用。遵循 web3 协议所开发的去中心化应用将有以下特点：

*   用户对数据、内容、甚至平台的所有权
    
*   用户身份的自主权
    
*   原生的支付方式（加密货币）
    
*   去中心化、分布式、非基于信任的基础建设
    
*   开放、公开、模块化的应用逻辑层
    

使用 web3 所开发的去中心化应用将会取代一些他们 web2 的前身。但借助于区块链下原生的支付方式以及公开的底层架构， 一系列前所未有的应用将会成为 web3 下全新的产物。 这些新产物是更令人期待的、无法预知的新创造。虽然去中心化的应用在某些场景是更有优势的，但中心化的应用在将仍然有存在的必要，未来更有可能是两种模式的共存和协同。

对于开发人员来说，我们还需要理解 web3 开发所需要的技术栈。web3 技术栈可以分为以下几大类：

*   区块链
    
*   区块链开发环境
    
*   文件存储
    
*   链下数据协议
    
*   数据索引和查询（API）
    
*   身份识别
    
*   客户端（框架和库）
    
*   区块链预言机
    
*   其他相关的协议
    

![](https://storage.googleapis.com/papyrus_images/0c04b59c249ad525299771586d03eb44e5483f4f6a46d34f48a8e437d4d1850b.png)

* * *

区块链
---

当你开发一个区块链应用时，有非常多的区块链可供选择。现在也并没有一个区块链出类拔萃。选择区块链时你要明确自己的需求并做好取舍。

Nader 自己在进行选择时会遵循二八法则，选择更容易上手的区块链。Nader 认为 [Solidity](https://learnblockchain.cn/docs/solidity/) 语言搭配以太机虚拟机（[EVM](https://ethereum.org/en/developers/docs/evm/)）是刚接触区块链的程序员最好的选择。在掌握了以太坊相关技术后，我们可以运用这些技术在以太坊、以太坊 Layer 2、侧链甚至其他公链上（例如[Avalanche](https://www.avax.network/), [Fantom](https://fantom.foundation/), and [Celo](https://celo.org/)）建立应用。

Rust 语言也正逐渐在区块链领域流行起来。包括 [Solana](https://solana.com/), [NEAR](https://near.org/zh/), [Polkadot](https://polkadot.network/) 等公链都对 Rust 语言提供了原生支持。但对于初学者来说，如果今天有人问我，Solidity 仍然是更好的选择。

基于技术成熟度、工具生态链、开发者社区、热度和前瞻性，Nader 列出了他认为比较好的一些区块链平台：

*   以太坊（[Ethereum](https://ethereum.org/en/)）：创世纪的 Smart contract 平台
    
*   ZK rollups（[ZKSync](https://zksync.io/)、[Starknet](https://starkware.co/starknet/)、[Hermez](https://hermez.io/)）：高吞吐量以太坊 Layer 2，但是并不与以太机虚拟机原生兼容
    
*   Optimistic rollups（[Arbitrum](https://offchainlabs.com/)、[Optimism](https://www.optimism.io/)）： 以太坊 Layer 2，且与以太机虚拟机原生兼容
    
*   [Polygon](https://polygon.technology/)：以太坊侧链
    
*   [Solana](https://solana.com/)：高吞吐量、低交易费、区块速度快，缺点是入门门槛相比以太机虚拟机要高
    
*   [NEAR](https://near.org/)：用 Rust 或 Assemblyscript 编写 smart contract
    
*   [Cosmos](https://v1.cosmos.network/)：相互兼容区块链的生态
    
*   [Polkadot](https://polkadot.network/)：区块链算力平台，在此平台之上可以互相连通的区块链
    
*   [Fantom](https://fantom.foundation/?__cf_chl_tk=hkVqppeUFDfRzFwd6Ln5eCa_672VgYpga52iuUhMR4Q-1639611813-0-gaNycGzNCZE)：与以太机虚拟机兼容的 Layer 1
    
*   [Avalanche](https://www.avax.network/)：与以太机虚拟机兼容的 Layer 1
    
*   [Celo](https://celo.org/)：与以太机虚拟机兼容的 Layer 1，对移动端友好、易于在移动端收发存储加密货币
    
*   [Tezos](https://tezos.com/)：与以太机虚拟机不兼容的 Layer 1，但有很多 NFT 基于此区块链
    

跟这些公链需要交互的时候，我们会用到 RPC 接口，以下是一些接入方式：

*   使用一个公共的 RPC 端口
    
*   自己跑一个节点
    
*   使用一个中心化的第三方端口提供商
    
*   使用一个去中心化的第三方端口提供商
    

公链一般都会提供公共的 RPC 端口。但这些公共端口一般都不太稳定，所以你的 dApp（去中心化 APP）往往都要用到你自己的端口或者是一个可靠的第三方供应商。这里列举一些常见的供应商：

*   [Infura](https://infura.io/)
    
*   [Figment Datahub](https://datahub-beta.figment.io/)
    
*   [Ankr](https://www.ankr.com/)
    
*   [Coinbase Cloud](https://www.coinbase.com/cloud)
    
*   [Cloudflare](https://developers.cloudflare.com/distributed-web/ethereum-gateway/interacting-with-the-eth-gateway)
    
*   [Alchemy](https://www.alchemy.com/)
    
*   [Genesis Go](https://genesysgo.com/) (Solana)
    

上面这些都算是“中心化”的供应商，如果你希望找个去中心化的供应商，可以看看 [Pocket Network](https://www.pokt.network/) 。

* * *

区块链开发环境
-------

对于 EVM 开发，有一些很好的开发环境可用：

*   [Hardhat](https://hardhat.org/) (JavaScript)： 相对比较新但越来越流行。Hardhat 的文档很出色，开发工具和开发体验都被打磨得比较好。这是 Nader 本人首选的开发环境。
    
*   [Truffle](https://trufflesuite.com/) (JavaScript)：基于以太机虚拟机的一套开发工具。相对比较成熟，有完善的文档，开发者群体比较大。
    
*   [Foundry](https://github.com/gakonst/foundry)：Paradigm 开发的一个新的 Solidity 开发环境。它可测试且支持模糊测试。因为是用 Rust 编写的，它的速度也相当快。
    
*   [Brownie](https://eth-brownie.readthedocs.io/en/stable/)：基于 Python 的开发和测试框架，适用于 Solidity 和以太机虚拟机开发。
    

对于 Solana 开发，[Anchor](https://project-serum.github.io/anchor/getting-started/introduction.html)正迅速成为新开发人员的切入点。它提供了一个用于搭建、构建和测试 Solana 程序的 CLI，以及可用于构建前端的客户端库。它还包括一个 DSL，它抽象了开发人员在开始使用 Solana 和 Rust 开发时经常遇到的许多复杂性。

* * *

文件存储
----

在 web2 上我们可以把文件存储在中心化的服务器上（包括阿里云 OSS 等），对于 web3，在链上直接存储大体积文件是非常昂贵的，那在我们应该如何存储图片视频等大体积的文件呢？我们也有一些可供选择的文件存储协议：

*   [IPFS](https://ipfs.io/)：P2P 文件系统协议。优势是可靠性高，文档完整且生态完备。劣势是文件有丢失的可能性。
    
*   [Arweave](https://arwiki.wiki/)：支付一笔交易费后可以永久存储数据。Nader 比较推荐这一个[文件存储协议](https://edgeandnode.com/blog/developers-guide-to-arweave)。
    
*   [Filecoin](https://filecoin.io/)：由开发了 IPFS 的 Protocol Labs 开发。适用于永久性文件存储。[web3.storage](https://web3.storage/) 是一个不错的基于 Filecoin 的项目。
    
*   [Skynet](https://siasky.net/)：Nader 并没有实战应用过这个协议。但它的 API 似乎很不错。
    

* * *

链下数据协议
------

除了去中心化的文件存储协议和直接在链上存储文件以外，我们还需要在链外存储一些数据。乍一看这可能跟 web2 的数据库很相似，但实际上你的数据会被复制在一个去中心化网络的多个节点上，理论上这个数据库的可信赖度更高一些。下面是一些链下数据库可供选择：

*   [Ceramic Network](https://ceramic.network/)：去中心化的开源数据平台。
    
*   Textile [ThreadDB](https://docs.textile.io/threads/)：基于 IPFS 和 libp2p 的多方数据库。
    
*   [GunDB](https://gun.eco/)：去中心化的 P2P 数据库。
    

链下数据协议目前还非常不成熟。比如实时数据、数据冲突检测、授权等等都是这些数据协议仍然亟待处理的挑战。同时，链下数据库与区块链的一体化如果不能解决，那我们也不可能做出真正去中心化的大型 APP。

* * *

数据索引和查询
-------

我们与区块链交互和构建区块链的方式与传统技术堆栈中的数据库存在很多差异。使用区块链，数据不会以可以直接从其他应用程序或前端有效或轻松使用的格式存储。

区块链针对写入操作进行了优化。您经常听到围绕每秒交易、区块时间和交易成本发生的创新。区块链数据随着时间的推移以块的形式写入，使得除了基本读取操作之外的任何操作都是不可能的。

在大多数应用程序中，您需要关心数据、排序、过滤、全文搜索、分页和许多其他类型的查询功能等功能。为此，需要对数据进行索引和组织以进行有效检索。

传统上，这是数据库在集中式技术堆栈中所做的工作，但在 web3 堆栈中缺少索引层。

[Graph](https://thegraph.com/en/)是一种用于索引和查询区块链数据的协议，它使这个过程变得更加容易，并为此提供了一个去中心化的解决方案。任何人都可以构建和发布开放的 GraphQL API，称为子图，使区块链数据易于查询。

要了解有关 The Graph 的更多信息，请查看此处的文档[或](https://dev.to/dabit3/building-graphql-apis-on-ethereum-4poa)[此处](https://thegraph.com/docs/)的教程。

* * *

身份识别
----

身份识别也是 web3 和 web2 重要的区别之一。web2 的身份识别是基于个人信息，比如你让用户提供用户名和密码。web3 的身份识别则完全基于“钱包”和公钥加密。

作为一个开发者，我们需要知道如何获取用户的钱包公钥并进行交互。我们至少需要能够链接这些加密钱包。在浏览器内或移动客户端，我们可以借助于类似于 [WalletConnect](https://walletconnect.com/) 和 [Solana’s Wallet Adapter](https://github.com/solana-labs/wallet-adapter) 这样的工具。我们也可自己去处理身份识别，在这里就不做赘述了，详细可以看看这两个例子：[EVM](https://mirror.xyz/sha.eth/i6ry1Mxez53z91ef375sMe2rO1NvK2ipACyzKA4SR9g) 或 [Solana](https://docs.phantom.app/integrating/sending-a-transaction#signing-and-sending-a-transaction)。

那我们如何管理用户资料呢？[Ceramic Network](https://developers.ceramic.network/learn/welcome/) 提供了一套非常健全的协议和工具来帮助我们用去中心化的方法管理用户资料。[ethers.js](https://docs.ethers.io/v5/api/providers/provider/#Provider--ens-methods) 库则为我们提供了获取 ENS 相关信息的工具。[SpruceID](https://spruceid.com/) 也同样值得一试。Ceramic 和 [Spruce](https://spruceid.dev/docs/didkit/) 都是基于 [W3C DID](https://www.w3.org/TR/did-core/) 规范。

* * *

客户端
---

就 JavaScript 来说，我们可以用任何 JS 前端框架来搭建客户端。大部分区块链的 JS SDK 都不限制 JS 框架。懂得 React 仍然还是有一定的好处，毕竟大部分例子还是都基于 React。也有很多类似 [Solana Wallet Adapter](https://github.com/solana-labs/wallet-adapter) 的库直接支持了 React。

对于以太坊开发的 SDK，[web3.js](https://web3js.readthedocs.io/en/v1.5.2/) 和 [ethers.js](https://docs.ethers.io/v5/) 都不错。Ethers.js 可能相对更容易上手。对于 Solana，[@solana/web3.js](https://docs.solana.com/developing/clients/javascript-api) 和 [Anchor](https://project-serum.github.io/anchor/getting-started/introduction.html) 都是很好的选择。如果你用了 Anchor 框架，那自然你的前端用 Anchor 也就更容易了。

* * *

区块链预言机
------

区块链预言机让开发人员在智能合约中使用区块链以外的数据。对于 DeFi 应用，区块链预言机已经有很大的作用，这些金融智能合约需要知道外部世界的很多信息，比如油价。

[Chainlink](https://chain.link/) 是一个区块链预言机。它让智能合约能够获取外部世界数据的同时，确保了安全和可靠性。[Flux](https://www.fluxprotocol.org/) 是一个跨链的预言机。

* * *

其他协议
----

[Radicle](https://radicle.xyz/)：去中心化的 GitHub。

[Livepeer](https://livepeer.org/)：去中心化的视频平台。这个平台已经相当成熟，链上已经有超过 7万个 GPU。

* * *

[https://edgeandnode.com/blog/defining-the-web3-stack](https://edgeandnode.com/blog/defining-the-web3-stack)

[https://dev.to/jiachenyao/web3-ji-zhu-zhan-1k40](https://dev.to/jiachenyao/web3-ji-zhu-zhan-1k40)

如果有问题交流，可以关注并私信我：微信([jingwentian](https://linktr.ee/daotian))、Twitter(@[0xDaotian](https://twitter.com/0xDaotian))、微信公众号([北极之野](https://weixin.sogou.com/weixin?type=1&s_from=input&query=%E5%8C%97%E6%9E%81%E4%B9%8B%E9%87%8E&ie=utf8&_sug_=n&_sug_type_=))、Substack邮件订阅([文叔白话WEB3](https://daotian.substack.com/))。

---

*Originally published on [稻田君](https://paragraph.com/@daotian/web3)*
