定义 web3 技术栈
本文最初发表于 Edge & Node 博客。
在做了大约 10 年的传统全栈开发人员之后,我于 2021 年 4 月转型进入 web3 领域。在深入学习所有这些新技术和理念的过程中,我首先想知道的是“什么是 web3 技术栈?”
在构建传统的 Web 或移动应用程序时,我通常依靠少量构建模块来完成工作。
- API/应用服务器(REST或GraphQL)
- 身份验证层(托管式或手动实现)
- 数据库
- 客户端框架、平台和库
- 文件存储
利用这些核心组件,我可以构建出我想要的绝大多数类型的应用程序,或者至少可以完成大部分工作。那么,这在 web3 中是什么样的呢?
事实证明,这个问题的答案并非如此简单,因为:
- 这种范式在很多方面都截然不同。
- Web3 的工具、技术和生态系统不如 Web2 成熟。
由于我解决问题的方式与我在 Web 2 世界中解决问题的方式相同,因此我也更难理解如何上手和构建 Web 3 应用程序。
经过过去 8 个月左右的工作、研究、实验和实践,我想分享一下我所学到的东西。
什么是web3?
在定义 web3 技术栈之前,我们先来尝试定义一下 web3。关于 web3 的定义有很多种,取决于你问谁,但我认为以下这个定义非常贴切:
Web3 是一套协议栈,它支持完全去中心化的应用程序。
借助这种去中心化技术栈,我们可以开始构建具有自身特性和意义的去中心化应用程序。
web3 的一些特性包括:
- 去中心化网络基础设施
- 所有权(数据、内容和平台的所有权)
- 原生数字支付
- 自主身份
- 分布式、无需信任且强大的基础设施
- 开放、公共、可组合的后端
虽然一些基于去中心化技术栈构建的应用将取代它们的前身,但区块链带来的新原语也催生了一种新的应用范式。
原生数字支付和公共后端基础设施(如机器学习、移动设备、虚拟现实和其他技术原语、平台和构建模块)能够构建全新的应用程序类型,其中一些应用程序甚至还没有被想象出来。
这是否意味着一切都将被 Web 3 取代?未必如此。虽然我认为对于某些类型的应用程序来说,基于去中心化技术栈进行构建是更好的选择——但就像几乎所有技术决策一样,这取决于你构建的是什么。
现在让我们开始深入研究web3技术栈,它被分为以下几个类别:
- 区块链
- 区块链开发环境
- 文件存储
- 链下数据协议
- API(索引和查询)
- 身份
- 客户端(框架和库)
- 神谕
- 其他协议
区块链
可供选择的区块链不胜枚举。没有哪个区块链是“最好的”,你应该权衡它们之间的各种优缺点。
学习新事物时,我常常会运用帕累托法则,也就是如何以最高效的方式利用时间和精力,从而获得最大的收益。遵循这个原则,我就能在最短的时间内获得最大的进步和动力。
在区块链领域,学习 Solidity 和EVM(以太坊虚拟机)可能是区块链开发者入门的最佳选择。掌握这些技能(和技术栈),你不仅可以为以太坊构建应用,还可以为其他以太坊 Layer 2 层、侧链,甚至其他区块链(例如 Avalanche、Fantom 和 Celo)构建应用。
话虽如此,Rust 在区块链领域正变得越来越流行,Solana、NEAR、Polkadot 等项目都对 Rust 提供了顶级的支持。学习两者都不会错,但对于初学者来说,如果有人现在问我,我还是会推荐 Solidity。
除了以上建议之外,这里列举一些区块链项目,它们在技术、实用性、社区、发展势头和未来可行性方面都具备扎实的优势:
- 以太坊——最初的智能合约平台
- ZK Rollups:ZKSync、Starknet、Hermez——高吞吐量的以太坊二层协议,但并非原生兼容EVM。
- 乐观型 Rollups:Arbitrum和Optimism - 以太坊 Layer 2s,兼容 EVM(点击此处了解更多关于乐观型 Rollups 和 ZK Rollups 的区别)
- Polygon - 以太坊侧链
- Solana——高吞吐量、低成本交易、快速区块生成,但比 EVM(Rust)更难学习。
- NEAR ——Layer 1区块链,可以使用Rust或汇编脚本编写智能合约。
- Cosmos——一个可互操作区块链的生态系统
- Polkadot——一个基于区块链的计算平台,它使构建在其上的区块链能够彼此之间执行交易,从而创建一个互联的区块链互联网。
- Fantom - EVM 兼容层 1
- Avalanche - EVM 兼容的 Layer 1
- Celo——兼容EVM的Layer 1,旨在让任何拥有智能手机的人都能轻松发送、接收和存储加密货币。
- Tezos——非EVM兼容的Layer 1,很多NFT项目都在使用它
与网络交互时,您需要使用 RPC 端点。
有几种方法可以做到这一点:
- 访问公共 RPC 端点
- 运行您自己的节点
- 以服务形式访问节点提供商
- 以服务形式访问去中心化节点提供商
网络通常会提供公共 RPC 端点,但对于大多数生产 dapp 而言,您需要利用自己的端点,因为它们不稳定,也不建议用于生产环境。
市面上有一些RPC服务提供商,以下列举几家:
- 因弗拉
- Figment 数据中心
- 安克尔
- Coinbase Cloud
- Cloudflare
- 炼金术
- Genesis Go(Solana)
此外,还有一种名为Pocket Network 的web3/去中心化解决方案,似乎正在获得越来越多的关注。
这些选项中的任何一个都可能是与您的关系网直接互动的好选择。
区块链开发环境
对于EVM开发,目前有一些不错的开发环境可供选择:
-
Hardhat(JavaScript)是一个较新的选择,但它正变得越来越受欢迎。它的文档很棒,工具和开发者体验都很完善,我个人也一直用它来构建去中心化应用(DApp)。
-
Truffle(JavaScript)是一套用于在EVM上构建和开发应用程序的工具。它成熟可靠,久经考验,并且文档齐全。Truffle已经存在一段时间了,被许多开发者使用。
-
Foundry是 Paradigm 公司推出的一款全新的 Solidity 开发环境,前景广阔。其主要亮点包括:支持用 Solidity 编写测试、支持模糊测试以及速度快(它使用 Rust 编写)。我之前写过一篇关于 Foundry 的介绍,点击此处查看。
-
Brownie是一个基于 Python 的智能合约开发和测试框架,适用于 Solidity / EVM 开发。
对于 Solana 开发而言,Anchor正迅速成为新开发者的入门之选。它提供了一个命令行界面 (CLI),用于搭建、构建和测试 Solana 程序,以及可用于构建前端的客户端库。此外,它还包含一个领域特定语言 (DSL),抽象化了开发者在 Solana 和 Rust 开发初期经常遇到的许多复杂细节。
文件存储
在 web3 中,我们应该把图片、视频和其他文件存储在哪里?在链上存储如此庞大的数据通常成本过高,所以我们可能不想把它们存储在那里。
我们可以使用以下几种文件存储协议之一:
- IPFS——点对点文件系统协议
- 优点:它可靠、文档齐全,并且拥有庞大的生态系统。
- 缺点:如果数据没有被锁定,则可能会丢失。
- Arweave——只需支付一次性交易费,即可永久存储数据。我是Arweave的忠实用户,并在此处写了一篇关于它的博文。
- Filecoin由 Protocol Labs 开发,该团队也开发了 IPFS。Filecoin 是一种旨在提供持久数据存储系统的协议。开发者可以通过多种方式在 Filecoin 上进行开发,其中web3.storage就非常不错。
- Skynet——我还没在生产环境中使用过,但试用过,感觉效果不错。这里的API看起来很棒。我有一些疑问,比如数据会保留多久,以及 Skynet 与其他协议的互操作性。
链下数据协议
除了文件存储和链上存储之外,您可能还需要将数据存储在链下。您可以像在传统技术栈中使用数据库一样使用这些解决方案,但它们会在去中心化网络上的多个节点上进行复制,因此更加可靠(至少理论上如此)。
以下是一些选项:
-
Ceramic Network是一个去中心化的开源平台,用于创建、托管和共享数据。Ceramic 还拥有一个不错的身份协议,我稍后会详细介绍。它可能是目前我最喜欢的链下存储解决方案。这里有一个很棒的演示。
-
Textile ThreadDB是一个基于 IPFS 和 Libp2p 构建的多方数据库。如果我理解正确的话,它目前可能正在进行一次重大的 API 更新。我试用过,感觉它很有潜力,但文档和用户体验方面还有待改进。
-
GunDB是一个去中心化的点对点数据库。Gun 已经存在相当长一段时间了,并且已经有一些非常有趣的应用程序基于它构建。
就成熟度而言,我认为链下存储解决方案的生态系统尚未达到足以满足一些开发者可能想要的更高级用例的程度。这方面面临的挑战包括实时数据、冲突检测和解决、写入授权、文档以及整体开发者体验。
将链下数据解决方案与区块链协议集成,是我们拥有能够支持任何类型应用程序的完全去中心化协议栈之前需要跨越的最后一个重大障碍。
API(索引和查询)
在与传统技术栈中的数据库进行交互和构建时,区块链与数据库之间存在诸多差异。区块链中的数据存储格式无法被其他应用程序或前端高效便捷地直接使用。
区块链针对写入操作进行了优化。我们经常听到的创新都围绕着每秒交易量、区块时间和交易成本展开。区块链数据随着时间的推移以区块的形式写入,这使得除基本读取操作之外的任何其他操作都无法实现。
大多数应用都需要关系型数据、排序、筛选、全文搜索、分页以及其他各种查询功能。为了实现这些功能,需要对数据进行索引和组织,以便高效检索。
传统上,这是集中式技术栈中数据库所承担的工作,但 web3 技术栈中缺少索引层。
Graph是一种用于索引和查询区块链数据的协议,它极大地简化了这一过程,并提供了一种去中心化的解决方案。任何人都可以构建和发布开放的 GraphQL API(称为子图),从而轻松查询区块链数据。
要了解有关 The Graph 的更多信息,请查看此处的文档或此处的教程。
身份
在 Web 3 中,身份认证采用了完全不同的范式。
在 Web 2 中,身份验证几乎总是基于用户的个人信息。这些信息通常通过表单或 OAuth 提供商收集,用户需要提供这些信息才能获得应用程序的访问权限。
在 web3 中,身份完全围绕钱包和公钥加密的概念展开。
虽然“钱包”这个名称本身没有问题,但我发现对于刚接触 Web3 的人来说,这个术语在身份验证和身份识别方面容易造成混淆。我希望将来我们能找到其他方式来更好地表达钱包的概念,因为它不仅涉及金融,还与身份和信誉息息相关。
作为开发者,你需要了解如何以各种方式访问和操作用户的钱包和地址。
从最基本的层面来说(这也是一个很常见的需求),你可能需要请求访问用户的钱包。为此,你通常可以在窗口上下文(网页浏览器)中访问用户的钱包,或者使用类似WalletConnect或Solana 的钱包适配器之类的工具。
例如,如果他们有以太坊钱包,您就可以访问 window.ethereum。Solana (window.solana)、Arweave (window.arweaveWallet) 以及其他一些钱包也是如此。WalletConnect 非常适合移动网页和 React Native 应用,因为它允许用户直接通过设备授权使用他们的移动钱包。
如果您想自行处理身份验证,您可以允许用户签署交易,然后在某个地方解码交易以验证用户身份,但这通常需要服务器。以下是使用 EVM 钱包的示例,以及使用 Solana/Phantom 的示例。
如何以去中心化的方式管理用户个人资料?Ceramic Network提供了一套功能强大的协议和工具套件,用于管理去中心化身份。他们最近发布了一篇博文,概述了最新的更新,并提供了所有工具如何协同工作的指南。我建议先从这篇博文入手,然后浏览他们的文档,了解如何开始构建,并可以参考我使用 Ceramic self.id的示例项目(链接在此)。
如果您想获取用户的ENS文本记录,该ensjs库提供了一个不错的 API 来获取用户数据:
const ens = new ENS({ provider, ensAddress: getEnsAddress('1') })
const content = await ens.name('sha.eth').getText('avatar')
SpruceID看起来也很有前景,但我还没有试用过。
Ceramic 和Spruce都实现了W3C DID规范,而 DID 规范本身也是我认为 web3 的一个基本组成部分。话虽如此,任何集中式的 DID 实现都违背了该规范的初衷。
客户
就 JavaScript 框架而言,你几乎可以使用任何你喜欢的框架进行构建,因为客户端区块链 SDK 大多数都与框架无关。话虽如此,大量的项目和示例都是用 React 构建的。此外,还有一些库,例如Solana Wallet Adapter,为 React 提供了额外的实用工具,因此我认为学习或熟悉 React 可能是一个明智的选择。
以太坊客户端 SDK 有web3.js和ethers.js。我个人觉得 ethers.js 更容易上手,文档也更完善,尽管 web3.js 出现的时间更早。
在 Solana 中,你很可能会用到@solana/web3.js和/或Anchor。我发现 Anchor 客户端库是我构建 Solana 程序的首选,因为我本身就在使用 Anchor 框架,而且我发现它更容易理解@solana/web3.js。
神谕
预言机允许开发人员从智能合约内部读取现实世界的数据和外部系统。
例如,大多数金融应用都需要了解链下发生的真实世界数据和事件,因此预言机在 DeFi 中尤为重要。
Chainlink是一个预言机,它能够访问现实世界的数据和链下计算,同时保持区块链技术固有的安全性和可靠性保证。
Flux是一个跨链预言机,它为智能合约提供经济安全的数据源访问权限。
其他协议
Radicle是一个基于 Git 构建的去中心化代码协作协议。它可以被视为 GitHub 的去中心化版本。
Livepeer是一个去中心化的视频流媒体网络。它发展成熟,应用广泛,网络上运行着超过7万个GPU。
总结
这篇文章将是一个动态文档,我会随着学习、实验和收集来自使用 web3 进行开发的开发者的反馈而不断更新。
如果您有任何反馈或想法,欢迎随时联系我,分享您的想法。
看到开发者们积极参与 web3 的开发,并取得如此大的进展,真是令人兴奋。虽然基础设施仍在不断发展,但构建真正去中心化的协议和应用程序,让人们无需将权力和控制权交给大型公司就能进行协作,这一愿景意义重大,我们距离实现这一愿景也越来越近了。
