原文《Defining the web3 stack》作者 Nader Dabit 拥有10年“传统 (web2)”互联网全栈开发的经验,并在2021年4月开始投身于 web3 开发。
我们先回想一下,用传统的全栈开发搭建一个网页或移动应用时,基本可以依托于大量现有的技术轮子,很快就可以搭建市面上几乎所有能想到的应用。我们经常会用到下面这些技术:
使用这些核心组件,我可以构建出我想要的大多数类型的应用程序,或者至少可以实现大部分目标。那么这在 web3 中是什么样子的呢?
事实证明,这个问题的答案并不那么简单,因为:
我也更难理解如何启动和运行以及构建 web3 应用程序,因为我处理问题的方式与我在 web2 世界中的方式相同。
在过去 8 个月左右的工作、研究、实验和构建之后,我想分享一下我学到的东西。
我们先来看看什么是 web3,然后再去探究 web3 技术栈。毕竟 web3 还在比较早期萌芽的状态,网上能找到各种各样的对 web3 的解释,但 Nader 认为 web3 最为准确的解释是:
web3 是一组开发去中心化应用时所必须遵循的协议。
遵循这些协议,我们就可以开发去中心化应用。遵循 web3 协议所开发的去中心化应用将有以下特点:
使用 web3 所开发的去中心化应用将会取代一些他们 web2 的前身。但借助于区块链下原生的支付方式以及公开的底层架构, 一系列前所未有的应用将会成为 web3 下全新的产物。 这些新产物是更令人期待的、无法预知的新创造。虽然去中心化的应用在某些场景是更有优势的,但中心化的应用在将仍然有存在的必要,未来更有可能是两种模式的共存和协同。
对于开发人员来说,我们还需要理解 web3 开发所需要的技术栈。web3 技术栈可以分为以下几大类:
当你开发一个区块链应用时,有非常多的区块链可供选择。现在也并没有一个区块链出类拔萃。选择区块链时你要明确自己的需求并做好取舍。
Nader 自己在进行选择时会遵循二八法则,选择更容易上手的区块链。Nader 认为 Solidity 语言搭配以太机虚拟机(EVM)是刚接触区块链的程序员最好的选择。在掌握了以太坊相关技术后,我们可以运用这些技术在以太坊、以太坊 Layer 2、侧链甚至其他公链上(例如Avalanche, Fantom, and Celo)建立应用。
Rust 语言也正逐渐在区块链领域流行起来。包括 Solana, NEAR, Polkadot 等公链都对 Rust 语言提供了原生支持。但对于初学者来说,如果今天有人问我,Solidity 仍然是更好的选择。
基于技术成熟度、工具生态链、开发者社区、热度和前瞻性,Nader 列出了他认为比较好的一些区块链平台:
跟这些公链需要交互的时候,我们会用到 RPC 接口,以下是一些接入方式:
公链一般都会提供公共的 RPC 端口。但这些公共端口一般都不太稳定,所以你的 dApp(去中心化 APP)往往都要用到你自己的端口或者是一个可靠的第三方供应商。这里列举一些常见的供应商:
上面这些都算是“中心化”的供应商,如果你希望找个去中心化的供应商,可以看看 Pocket Network 。
对于 EVM 开发,有一些很好的开发环境可用:
对于 Solana 开发,Anchor正迅速成为新开发人员的切入点。它提供了一个用于搭建、构建和测试 Solana 程序的 CLI,以及可用于构建前端的客户端库。它还包括一个 DSL,它抽象了开发人员在开始使用 Solana 和 Rust 开发时经常遇到的许多复杂性。
在 web2 上我们可以把文件存储在中心化的服务器上(包括阿里云 OSS 等),对于 web3,在链上直接存储大体积文件是非常昂贵的,那在我们应该如何存储图片视频等大体积的文件呢?我们也有一些可供选择的文件存储协议:
除了去中心化的文件存储协议和直接在链上存储文件以外,我们还需要在链外存储一些数据。乍一看这可能跟 web2 的数据库很相似,但实际上你的数据会被复制在一个去中心化网络的多个节点上,理论上这个数据库的可信赖度更高一些。下面是一些链下数据库可供选择:
链下数据协议目前还非常不成熟。比如实时数据、数据冲突检测、授权等等都是这些数据协议仍然亟待处理的挑战。同时,链下数据库与区块链的一体化如果不能解决,那我们也不可能做出真正去中心化的大型 APP。
我们与区块链交互和构建区块链的方式与传统技术堆栈中的数据库存在很多差异。使用区块链,数据不会以可以直接从其他应用程序或前端有效或轻松使用的格式存储。
区块链针对写入操作进行了优化。您经常听到围绕每秒交易、区块时间和交易成本发生的创新。区块链数据随着时间的推移以块的形式写入,使得除了基本读取操作之外的任何操作都是不可能的。
在大多数应用程序中,您需要关心数据、排序、过滤、全文搜索、分页和许多其他类型的查询功能等功能。为此,需要对数据进行索引和组织以进行有效检索。
传统上,这是数据库在集中式技术堆栈中所做的工作,但在 web3 堆栈中缺少索引层。
Graph是一种用于索引和查询区块链数据的协议,它使这个过程变得更加容易,并为此提供了一个去中心化的解决方案。任何人都可以构建和发布开放的 GraphQL API,称为子图,使区块链数据易于查询。
要了解有关 The Graph 的更多信息,请查看此处的文档或此处的教程。
身份识别也是 web3 和 web2 重要的区别之一。web2 的身份识别是基于个人信息,比如你让用户提供用户名和密码。web3 的身份识别则完全基于“钱包”和公钥加密。
作为一个开发者,我们需要知道如何获取用户的钱包公钥并进行交互。我们至少需要能够链接这些加密钱包。在浏览器内或移动客户端,我们可以借助于类似于 WalletConnect 和 Solana’s Wallet Adapter 这样的工具。我们也可自己去处理身份识别,在这里就不做赘述了,详细可以看看这两个例子:EVM 或 Solana。
那我们如何管理用户资料呢?Ceramic Network 提供了一套非常健全的协议和工具来帮助我们用去中心化的方法管理用户资料。ethers.js 库则为我们提供了获取 ENS 相关信息的工具。SpruceID 也同样值得一试。Ceramic 和 Spruce 都是基于 W3C DID 规范。
就 JavaScript 来说,我们可以用任何 JS 前端框架来搭建客户端。大部分区块链的 JS SDK 都不限制 JS 框架。懂得 React 仍然还是有一定的好处,毕竟大部分例子还是都基于 React。也有很多类似 Solana Wallet Adapter 的库直接支持了 React。
对于以太坊开发的 SDK,web3.js 和 ethers.js 都不错。Ethers.js 可能相对更容易上手。对于 Solana,@solana/web3.js 和 Anchor 都是很好的选择。如果你用了 Anchor 框架,那自然你的前端用 Anchor 也就更容易了。
区块链预言机让开发人员在智能合约中使用区块链以外的数据。对于 DeFi 应用,区块链预言机已经有很大的作用,这些金融智能合约需要知道外部世界的很多信息,比如油价。
Chainlink 是一个区块链预言机。它让智能合约能够获取外部世界数据的同时,确保了安全和可靠性。Flux 是一个跨链的预言机。
Radicle:去中心化的 GitHub。
Livepeer:去中心化的视频平台。这个平台已经相当成熟,链上已经有超过 7万个 GPU。
如果有问题交流,可以关注并私信我:微信(jingwentian)、Twitter(@0xDaotian)、微信公众号(北极之野)、Substack邮件订阅(文叔白话WEB3)。