定义 web3 栈

origin:Defining the web3 stack

在构建传统的 Web2 应用程序时,我经常依赖一些构建块来完成工作。

  1. API / 应用服务器(REST 或 GraphQL)
  2. 身份验证层(托管或手动)
  3. 数据库
  4. 客户端框架、平台和库
  5. 文件存储

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

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

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

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

什么是 web3?

简单来说web3可以定义为:

Web3 是支持完全去中心化应用程序的协议栈。

有了这个去中心化的技术栈,我们可以开始构建去中心化的应用程序,这些应用程序具有自己的集合含义和特征。

web3 启用的一些特性是:

  • 去中心化的网络基础设施
  • 所有权(数据、内容和平台)
  • 原生数字支付
  • 自我主权身份
  • 分布式、无信任且健壮的基础架构
  • 开放、公开、可组合的后端

虽然一些建立在去中心化技术栈上的应用程序将取代它们的前辈,但区块链支持的新原语也使一种新的应用程序范式成为可能。

原生数字支付和公共后端基础设施——如机器学习、移动设备、虚拟现实和其他技术原语、平台和构建块——能够构建全新类型的应用程序,其中一些应用程序尚未被想象。

这是否意味着一切都将被 web3 取代?不必要。虽然我确实认为对于某些类型的应用程序来说,在分散的技术栈上构建是一个更好的选择——就像几乎任何技术决策一样,这取决于你正在构建什么。

现在让我们开始深入研究 web3 栈,分为这组类别:

  • 区块链
  • 区块链开发环境
  • 文件存储
  • 链下数据协议
  • API(索引和查询)
  • 身份
  • 客户端(框架和库)
  • 预言机
  • 其他协议
web3 栈
web3 栈

区块链

您可以选择在无数的区块链上进行构建。没有一个是“最好的”,相反,您应该考虑它们之间的各种权衡。

在区块链世界中,学习 Solidity 和EVM(或以太坊虚拟机)可能是作为区块链开发人员入门的最佳选择。使用此技能集(和技术栈),您不仅可以构建以太坊,还可以构建其他以太坊第 2 层、侧链,甚至其他区块链,如 Avalanche、Fantom 和 Celo。

话虽如此,Rust 在区块链世界中开始变得越来越流行,Solana、NEAR、Polkadot 和其他拥有一流的 Rust 支持。你也可能真的不会出错,但对于初学者来说Solidity 仍然是更好的选择。

除了这个建议之外,这里还有一个不完整的区块链样本,它们结合了技术、实用性、社区、动力和未来的可行性:

  • 以太坊——原创智能合约平台
  • ZK 汇总:ZKSyncStarknetHermez - 高吞吐量以太坊第 2 层,但与原生 EVM 不兼容
  • 乐观汇总:Arbitrum & Optimism - 以太坊第 2 层,EVM 兼容(在此处了解有关乐观汇总和 ZK 汇总之间差异的更多信息)
  • Polygon - 以太坊侧链
  • Solana - 高吞吐量、廉价交易、快速出块时间,但比 EVM (Rust) 更难学习
  • NEAR - 第 1 层区块链,可以用 Rust 或 Assemblyscript 编写智能合约
  • Cosmos——互操作区块链的生态系统
  • Polkadot - 基于区块链的计算平台,使构建在其之上的区块链能够在它们之间执行交易,创建一个互连的区块链互联网
  • Fantom - EVM 兼容层 1
  • Avalanche - EVM 兼容的第 1 层
  • Celo - EVM 兼容的第 1 层,旨在让任何拥有智能手机的人都可以轻松发送、接收和存储加密货币
  • Tezos - 不兼容 EVM 的第 1 层,很多 NFT 项目都在使用它

与网络交互时,您需要使用 RPC 端点。

有几种方法可以做到这一点:

  1. 访问公共 RPC 端点
  2. 运行自己的节点
  3. 将节点提供者作为服务访问
  4. 访问去中心化节点提供者作为服务

公共 RPC 端点通常由网络提供,但对于大多数生产 dapp,您需要利用自己的端点,因为它们不稳定或不推荐用于生产。

有一些 RPC 服务提供商,这里有一些:

还有一个 web3 / 去中心化的解决方案,Pocket Network,似乎正在获得关注。

这些选项中的任何一个都可能是直接与您的网络交互的好选择。

区块链开发环境

对于 EVM 开发,有一些很好的开发环境可用:

  • Hardhat (JavaScript) 是一种较新的选择,但它越来越受欢迎。他们的文档很棒,工具和开发人员的体验也很完善,这是我个人用来构建 dapps 的东西。
  • Truffle (JavaScript) 是一套用于在 EVM 上构建和开发应用程序的工具。它成熟,经过实战考验,并且有据可查。它已经存在了一段时间,许多开发人员都在使用它。
  • Foundry是来自 Paradigm 的一个新的 Solidity 开发环境,它显示了很多希望。关键的突出之处在于使用 Solidity 编写测试的能力、对模糊测试的支持和速度(它是用 Rust 编写的)。我在这里单独写了一篇介绍。
  • Brownie是一个基于 Python 的开发和测试框架,用于 Solidity / EVM 开发的智能合约。

对于 Solana 开发,Anchor正迅速成为新开发人员的切入点。它提供了一个用于搭建、构建和测试 Solana 程序的 CLI,以及可用于构建前端的客户端库。它还包括一个 DSL,它抽象了开发人员在开始使用 Solana 和 Rust 开发时经常遇到的许多复杂性。

文件存储

我们在 web3 中将图像、视频和其他文件存储在哪里?存储任何大型链上的东西通常都非常昂贵,因此我们可能不想将它们存储在那里。

相反,我们可以使用少数文件存储协议之一:

  • IPFS - 点对点文件系统协议
    • 优点:它是可靠的,在大型生态系统中记录良好
    • 缺点:如果数据没有固定,它可能会丢失
  • Arweave - 允许您永久存储数据,支付单笔交易费用。
  • Filecoin - 来自构建 IPFS 的同一团队 Protocol Labs,它是一种旨在提供持久数据存储系统的协议。开发人员可以通过多种方式在 Filecoin 上进行构建,包括非常不错的web3.storage 。
  • Skynet - 我还没有在生产中使用它,但是已经尝试过了,它似乎工作得很好。这里的 API看起来很棒。我有一些问题,比如数据保留了多长时间,以及 Skynet 与其他协议的互操作性。

链下数据协议

除了文件存储和链上存储之外,您可能还需要在链下存储数据。您可以使用这些类型的解决方案,就像您在传统技术栈中使用数据库的方式一样,但是它们在分散网络上的 n 个节点上复制,因此更可靠(至少在理论上)。

几个选项是:

  • Ceramic Network - 一个去中心化的开源平台,用于创建、托管和共享数据。Ceramic 还有一个很好的身份协议,我稍后会谈到。可能是我目前最喜欢的链下存储解决方案。这是一个非常不错的演示。
  • Textile ThreadDB - 基于 IPFS 和 Libp2p 构建的多方数据库。如果我理解正确的话,它目前可能正在经历一次大的 API 更改。我已经尝试过了,它显示出一些希望,但是文档和 DX 需要一些改进。
  • GunDB - 一个去中心化的点对点数据库。Gun 已经存在了很长一段时间,并且已经用它构建了一些非常有趣的应用程序。

就成熟度而言,我的看法是,链下存储解决方案的生态系统还没有达到构建一些开发人员可能想要的更高级用例所需要的位置。这里的一些挑战是实时数据、冲突检测和冲突解决、写入授权、文档和一般开发人员经验。

在我们拥有能够支持任何类型应用程序的完全去中心化协议栈之前,将链下数据解决方案与区块链协议集成是我们需要跨越的最后一大障碍。

API(索引和查询)

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

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

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

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

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

要了解有关 The Graph 的更多信息,请查看此处的文档此处的教程。

身份

身份是 web3 中完全不同的范式。在 web2 中,身份验证几乎总是基于用户的个人信息。此信息通常通过表单或 OAuth 提供程序收集,该提供程序要求用户交出以换取对应用程序的访问。

在 web3 中,身份完全围绕钱包和公钥密码学的概念展开。

虽然“钱包”这个名称有其用途,但我发现 web3 的新手会发现这个术语令人困惑,因为它与身份验证和身份相关。我希望将来我们能找到其他方式来传达钱包是什么,因为它结合了金融方面,还结合了身份和声誉。

作为开发人员,您需要了解如何以各种方式访问​​用户的钱包和地址并与之交互。

在一个非常基本的级别(也是一个非常常见的要求),您可能想要请求访问用户的钱包。为此,您通常可以在窗口上下文(Web 浏览器)中访问用户的钱包,或者使用WalletConnectSolana 的 Wallet Adapter 之类的东西。

例如,如果他们有可用的以太坊钱包,你就可以访问 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规范,它本身也是我认为是 web3 的构建块的东西。话虽如此,任何 DID 的集中实现都违背了规范试图实现的目标。

客户端

就 JavaScript 框架而言,你真的可以用你想要的任何东西来构建,因为客户端区块链 SDK 大多与框架无关。话虽如此,绝大多数项目和示例都是用 React 构建的。还有一些像Solana Wallet Adapter这样的库为 React 提供了额外的实用程序,所以我想说学习或熟悉 React 可能是一个明智的举措。

对于以太坊中的客户端 SDK,有web3.jsethers.js。对我来说,Ethers 更平易近人,并且有更好的文档,尽管 web3.js 已经存在了更长的时间。

在 Solana 中,您可能会使用@solana/web3.js和/或Anchor。我发现 Anchor 客户端库是我构建 Solana 程序的首选,因为无论如何我都在使用 Anchor 框架,而且我发现它更容易理解@solana/web3.js

预言机

预言机允许开发人员从智能合约中读取真实世界的数据和外部系统。

例如,大多数金融应用程序都需要了解链下发生的真实数据和事件,因此预言机在 DeFi 中尤为重要。

Chainlink是一个 Oracle,它可以访问真实世界的数据和链下计算,同时保持区块链技术固有的安全性和可靠性保证。

Flux是一个跨链预言机,它为智能合约提供经济安全的数据馈送访问权限。

其他协议

Radicle是一个基于 Git 的去中心化代码协作协议。它可以被认为是 GitHub 的去中心化版本。

Livepeer是一个去中心化的视频流网络。它已经成熟并被广泛使用,网络上有超过 70,000 个 GPU。

Subscribe to web3hooks
Receive the latest updates directly to your inbox.
Verification
This entry has been permanently stored onchain and signed by its creator.