在成为传统的全栈开发人员大约10年后,我于2021年4月过渡到web3。在深入研究所有这些新技术和想法时,我想知道的第一件事是"什么是web3堆栈?

在构建传统的Web或移动应用程序时,我经常依靠少数构建块来完成工作。

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

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

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

  1. 范式在很多方面都是完全不同的
  2. web3 工具、技术和生态系统不如 web2 成熟

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

在过去的8个月左右的工作,研究,实验和构建之后,我想分享我所学到的东西。

什么是 web3?

在定义 web3 堆栈之前,让我们尝试定义 web3。根据你问谁,有无数的定义,但对我来说,我发现这个定义是:

Web3 是支持完全分散的应用程序的协议堆栈。

有了这个分散的技术堆栈,我们可以开始构建分散的应用程序,这些应用程序具有自己的固定含义和特征。

web3 支持的一些特征包括:

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

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

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

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

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

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

   The web3 stack

区块链

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

在学习新东西时,对我来说通常很重要的一件事是将帕累托原理应用于我正在学习的东西的想法。也就是说,什么是充分利用这些时间和精力的最有效方法。遵循这个想法,我可以获得最大的牵引力和动力,同时在最短的时间内学习新的东西。

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

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

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

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

区块链开发环境

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

  • 安全帽(JavaScript)是一个较新的选择,但越来越受欢迎。他们的文档很棒,工具和开发人员的体验都得到了完善,这是我个人用来构建dapps的东西。

  • Truffle(JavaScript)是一套用于在EVM上构建和开发应用程序的工具。它成熟,经过战斗测试,并有据可查。它已经存在了一段时间,许多开发人员都使用它。

  • Foundry是Paradigm的一个新的Solidity开发环境,显示出很多希望。关键突出的是能够在 Solidity 中编写测试、对模糊测试的支持和速度(它是用 Rust 编写的)。我在这里写了一个单独的介绍。

  • Brownie是一个基于Python的开发和测试框架,用于Solidity / EVM开发的智能合约。

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

文件存储

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

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

  • IPFS - 对等文件系统协议
    • 优点:它可靠,有据可查的大型生态系统
    • 缺点:如果数据未固定,则可能会丢失
  • Arweave - 允许您永久存储数据,支付单笔交易费用。我是Arweave的粉丝,并在这里写了一篇关于它的博客文章。
  • Filecoin - 来自协议实验室,与构建IPFS的团队相同,它是一种旨在提供持久数据存储系统的协议。开发人员有几种方法可以在Filecoin上构建,包括web3.storage,这非常好。
  • 天网 - 我还没有在生产中使用过它,但已经尝试过了,它似乎工作得很好。这里的API看起来很棒。我有一些问题,比如数据持续了多长时间,以及天网与其他协议的互操作性。

链下数据协议

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

有几个选项是:

  • 陶瓷网络 - 一个分散的开源平台,用于创建,托管和共享数据。陶瓷还有一个很好的身份协议,我稍后会谈到。可能是我目前最喜欢的链下存储解决方案。这是一个非常好的演示。

  • Textile ThreadDB - 一个建立在IPFS和Libp2p上的多方数据库。如果我理解正确,它目前可能正在经历一次重大的API更改。我已经尝试过了,它显示出一些希望,但是文档和DX需要一些改进。

  • GunDB - 一个分散的,点对点的数据库。Gun已经存在了很长一段时间,并且已经用它构建了一些非常有趣的应用程序

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

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

API(索引和查询)

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

区块链针对写入操作进行了优化。您经常听到围绕每秒交易量、区块时间和交易成本的创新。区块链数据在一段时间内以块的形式写入,使得基本读取操作以外的任何事情都是不可能的。

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

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

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

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

身份

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

在web3中,身份完全围绕着钱包和公钥加密的概念。

虽然"钱包"这个名字达到了它的目的,但我发现web3新手发现这个术语令人困惑,因为它与身份验证和身份有关。我希望将来我们能想出一些其他方法来传达钱包是什么,因为它结合了金融的各个方面,但也结合了身份和声誉。

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

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

例如,如果他们有一个以太坊钱包可用,您将能够访问window.ethereum。Solana(window.solana),Arweave(window.arweaveWallet)和其他一些也是如此。WalletConnect适用于移动网络和React Native,因为它允许用户直接从设备使用移动钱包进行授权。

如果要自己处理身份验证,可以允许用户对事务进行签名,然后在某个位置对其进行解码以对用户进行身份验证,但这通常需要服务器。以下是使用EVM钱包的示例,以下是如何使用Solana / Phantom执行此操作的示例。

以分散的方式管理用户配置文件怎么样?陶瓷网络为管理分散身份提供了最强大的协议和工具套件。他们最近发布了一篇博客文章,概述了他们最近的一些更新,并就所有工具如何协同工作提供了一些指南。我会从那里开始,然后浏览他们的文档,以了解如何开始构建,并考虑查看我在这里使用陶瓷 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以太.js。对我来说,Ethers更平易近人,并且有更好的文档,尽管web3.js已经存在了更长的时间。

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

其他协议

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

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

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

结束语

这篇文章将是一个活的文档,当我学习,实验和收集在web3中构建的开发人员的反馈时,我会跟上它。

如果您对我在这里缺少的内容有任何反馈或想法,请与我联系并分享您的想法。看到围绕web3发生的所有活动令人兴奋,因为开发人员正在加入并参与其中。虽然基础设施仍在不断发展,但构建真正分散的协议和应用程序的愿景是,允许人们进行协调,而不必将权力和控制交给大公司,这是一个重要的愿景,我们即将实现这一愿景。