Web3 技术栈
Tags: web3, beginners
Published: 2022-04-24 04:57:17

> 原文来自美国网红程序员 Nader Dabit 的2021年终总结文章：[https://edgeandnode.com/blog/defining-the-web3-stack](https://edgeandnode.com/blog/defining-the-web3-stack)。本文经原作者授权翻译转载，本文对某些概念也做出了一些补充。
> 

原文作者 Nader Dabit 拥有10年“传统 (web2)”互联网全栈开发的经验，并在2021年4月开始投身于 web3 开发。

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

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

然而 web3 的整个逻辑就完全不同了。Nader 表示在他刚开始学习 web3 时，困扰自己最大的问题就是：“web3 全栈开发究竟包含哪些技术？” 想必很多 web2 的开发人员都有同样的困惑，感觉无从下手。毕竟我们已经习惯了一个成熟的技术社区，当初学者想要学习一个领域时，往往都有高质量的开发文档帮助你快速入门。而 web3 开发则仍然处在早期发展阶段，并没有足够的文档支持，而且很多 API 也不断地在升级改变。下面我们就来看看 Nader 对于 web3 的总结。

---

## 什么是 web3？

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

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

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

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

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

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

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

---

## 区块链

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

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

Rust 语言也正逐渐在区块链领域流行起来。包括 Solana, NEAR, Polkadot 等公链都对 Rust 语言提供了原生支持。

基于技术成熟度、工具生态链、开发者社区、热度和前瞻性，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/) 。

---

## 区块链开发环境

适用于以太机虚拟机的开发环境：

- [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 语言，方便初学者快速上手。

---

## 文件存储

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

- [IPFS](https://ipfs.io/)：P2P 文件系统协议。优势是可靠性高，文档完整且生态完备。劣势是文件有丢失的可能性。
- [Arweave](https://arwiki.wiki/)：支付一笔交易费后可以永久存储数据。Nader 比较推荐这一个文件存储协议。
- [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。

---

## 数据索引和查询

区块链数据交互与传统数据库有很大的区别。在区块链上，数据无法以最高效的形式存储和读取。区块链对数据写入做了最大的优化。在圈子里最常听到的就是有哪些最新技术优化了每秒交易数量或者区块时间。区块链的设计导致了我们很难去做除了简单读取以外的数据操作。然而在大多数应用里，我们都会用到关系型数据，我们需要对数据进行排序和筛选，有时候需要检索大段的文字，对查询结果进行分页等等。为了达到这些目的，我们还得先对数据进行索引。很长一段时间，区块链上的这个技术是缺失的。

[The Graph](https://thegraph.com/en/) 是一个链上数据索引和查询的协议。这个协议也比较新，开发者可以创建和发布公开的 GraphQL API，从而让其他人可以更简便的使用这些数据。

---

## 身份识别

身份识别也是 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/) 提供了一套非常健全的协议和工具来帮助我们用去中心化的方法管理用户资料。Ens.js 库则为我们提供了获取 ENS 相关信息的工具。[SpruceID](https://spruceid.com/) 也同样值得一试。Ceramic 和 Spruce 都是基于 [W3C DID](https://www.w3.org/TR/did-core/) 规范。

---

## 客户端

单就 JS 来说，我们可以用任何 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。