origin:Defining the web3 stack
在构建传统的 Web2 应用程序时,我经常依赖一些构建块来完成工作。
使用这些核心组件,我可以构建出我想要的大多数类型的应用程序,或者至少可以实现大部分目标。那么这在 web3 中是什么样子的呢?
事实证明,这个问题的答案并不那么简单,因为:
我也更难理解如何启动和运行以及构建 web3 应用程序,因为我处理问题的方式与我在 web2 世界中的方式相同。
简单来说web3可以定义为:
Web3 是支持完全去中心化应用程序的协议栈。
有了这个去中心化的技术栈,我们可以开始构建去中心化的应用程序,这些应用程序具有自己的集合含义和特征。
web3 启用的一些特性是:
虽然一些建立在去中心化技术栈上的应用程序将取代它们的前辈,但区块链支持的新原语也使一种新的应用程序范式成为可能。
原生数字支付和公共后端基础设施——如机器学习、移动设备、虚拟现实和其他技术原语、平台和构建块——能够构建全新类型的应用程序,其中一些应用程序尚未被想象。
这是否意味着一切都将被 web3 取代?不必要。虽然我确实认为对于某些类型的应用程序来说,在分散的技术栈上构建是一个更好的选择——就像几乎任何技术决策一样,这取决于你正在构建什么。
现在让我们开始深入研究 web3 栈,分为这组类别:
您可以选择在无数的区块链上进行构建。没有一个是“最好的”,相反,您应该考虑它们之间的各种权衡。
在区块链世界中,学习 Solidity 和EVM(或以太坊虚拟机)可能是作为区块链开发人员入门的最佳选择。使用此技能集(和技术栈),您不仅可以构建以太坊,还可以构建其他以太坊第 2 层、侧链,甚至其他区块链,如 Avalanche、Fantom 和 Celo。
话虽如此,Rust 在区块链世界中开始变得越来越流行,Solana、NEAR、Polkadot 和其他拥有一流的 Rust 支持。你也可能真的不会出错,但对于初学者来说Solidity 仍然是更好的选择。
除了这个建议之外,这里还有一个不完整的区块链样本,它们结合了技术、实用性、社区、动力和未来的可行性:
与网络交互时,您需要使用 RPC 端点。
有几种方法可以做到这一点:
公共 RPC 端点通常由网络提供,但对于大多数生产 dapp,您需要利用自己的端点,因为它们不稳定或不推荐用于生产。
有一些 RPC 服务提供商,这里有一些:
还有一个 web3 / 去中心化的解决方案,Pocket Network,似乎正在获得关注。
这些选项中的任何一个都可能是直接与您的网络交互的好选择。
对于 EVM 开发,有一些很好的开发环境可用:
对于 Solana 开发,Anchor正迅速成为新开发人员的切入点。它提供了一个用于搭建、构建和测试 Solana 程序的 CLI,以及可用于构建前端的客户端库。它还包括一个 DSL,它抽象了开发人员在开始使用 Solana 和 Rust 开发时经常遇到的许多复杂性。
我们在 web3 中将图像、视频和其他文件存储在哪里?存储任何大型链上的东西通常都非常昂贵,因此我们可能不想将它们存储在那里。
相反,我们可以使用少数文件存储协议之一:
除了文件存储和链上存储之外,您可能还需要在链下存储数据。您可以使用这些类型的解决方案,就像您在传统技术栈中使用数据库的方式一样,但是它们在分散网络上的 n 个节点上复制,因此更可靠(至少在理论上)。
几个选项是:
就成熟度而言,我的看法是,链下存储解决方案的生态系统还没有达到构建一些开发人员可能想要的更高级用例所需要的位置。这里的一些挑战是实时数据、冲突检测和冲突解决、写入授权、文档和一般开发人员经验。
在我们拥有能够支持任何类型应用程序的完全去中心化协议栈之前,将链下数据解决方案与区块链协议集成是我们需要跨越的最后一大障碍。
我们在区块链上进行交互和构建的方式与传统技术栈中的数据库存在很多差异。使用区块链,数据不会以可以有效或轻松地直接从其他应用程序或前端使用的格式存储。
区块链针对写入操作进行了优化。您经常听到围绕每秒交易量、区块时间和交易成本发生的创新。区块链数据随着时间的推移以块的形式写入,使得除了基本读取操作之外的任何操作都是不可能的。
在大多数应用程序中,您需要关系数据、排序、过滤、全文搜索、分页和许多其他类型的查询功能等功能。为此,需要对数据进行索引和组织以进行有效检索。
传统上,这是数据库在集中式技术栈中所做的工作,但在 web3 栈中缺少索引层。
Graph是一种用于索引和查询区块链数据的协议,它使这个过程变得更加容易,并为此提供了一个去中心化的解决方案。任何人都可以构建和发布开放的 GraphQL API,称为子图,使区块链数据易于查询。
要了解有关 The Graph 的更多信息,请查看此处的文档或此处的教程。
身份是 web3 中完全不同的范式。在 web2 中,身份验证几乎总是基于用户的个人信息。此信息通常通过表单或 OAuth 提供程序收集,该提供程序要求用户交出以换取对应用程序的访问。
在 web3 中,身份完全围绕钱包和公钥密码学的概念展开。
虽然“钱包”这个名称有其用途,但我发现 web3 的新手会发现这个术语令人困惑,因为它与身份验证和身份相关。我希望将来我们能找到其他方式来传达钱包是什么,因为它结合了金融方面,还结合了身份和声誉。
作为开发人员,您需要了解如何以各种方式访问用户的钱包和地址并与之交互。
在一个非常基本的级别(也是一个非常常见的要求),您可能想要请求访问用户的钱包。为此,您通常可以在窗口上下文(Web 浏览器)中访问用户的钱包,或者使用WalletConnect或Solana 的 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.js和ethers.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。