# 了解了这些 去做个Web3.0的开发者吧

By [Untitled](https://paragraph.com/@0xec2b995a20ebc576f588f3207d06f066b2297c2e) · 2022-01-08

---

**想在 web3 上进行构建？Nader Dabit 在一份介绍性指南中指出了 web3 技术堆栈的构建模块**

在「web3 上构建」的下一章节中，Edge & Node 开发者关系工程师 Nader Dabit 阐述了 web3 堆栈，以及开发者如何将在 web3 上构建的各个层面概念化。

我在 2021 年 4 月过渡到 web3，此前我做了大约 10 年的传统全栈开发者。在潜心研究所有这些新技术和想法时，我想知道的第一件事是 "什么是 web3 堆栈？"。

当构建一个传统的网络或移动应用程序时，我经常依赖某几个构建模块来完成工作：

*   API/应用服务器（REST 或 GraphQL）
    
*   验证层（托管或手动）
    
*   数据库
    
*   客户端框架、平台和库
    
*   文件存储
    

使用这些核心组件，我可以建立我想要的大多数类型的应用程序，或者至少可以达到大部分的目的。那么，这在 web3 中是什么样子的呢？

事实证明，这个问题的答案并不那么直截了当，因为：

*   此范式在很多方面都完全不同
    
*   web3 的工具、技术和生态系统都没有 web2 那么成熟
    

对我来说，也更难理解如何启动、运行和建立 web3 应用程序，因为我是以与 web2 世界相同的方式来处理问题的。

在过去 8 个月左右的时间里，经过工作、研究、实验和建设，我想和大家分享一下我的心得。

**什么是 web3？**

在我们定义 web3 堆栈之前，让我们试着定义一下 web3：

**Web3 是实现完全去中心化的应用的协议栈。**

有了这个去中心化的技术栈，我们就可以开始构建去中心化的应用，这些应用有其自身的意义和特点。

web3 的一些特点是：

*   去中心化的网络基础设施
    
*   所有权（数据、内容和平台）
    
*   本地数字支付
    
*   自主的身份
    
*   分布式的、无需信任的、强大的基础设施
    
*   开放、公共、可组合的后端
    

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

原生的数字支付和公共后端基础设施--如机器学习、移动设备、虚拟现实和其他技术源语、平台和构建模块--使全新类型的应用程序得以建立，有些是尚未想象到的。

这是否意味着一切都将被 web3 取代？不一定。虽然我认为对于某些类型的应用程序来说，建立在去中心化的技术堆栈上是一个更好的选择--就像几乎任何技术决定一样，这取决于你要建立什么。

现在让我们开始深入了解 web3 的堆栈，分成以下几类：

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

### 区块链

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

在学习新东西时，有一件事对我来说常常很重要，那就是将帕累托原则应用到我所学的东西上。也就是说，什么是最有效的方式来获得该数量的时间和努力的结果。遵循这个想法，我可以在最短的时间内学习新东西的同时获得最大的牵引力和动力。

在区块链领域，学习 Solidity 和 EVM（或 Ethereum 虚拟机）可能是作为区块链开发者入门时的最佳选择。使用这种技能（和技术栈），你不仅可以为以太坊，而且可以为其他以太坊第二层、侧链，甚至其他区块链（如 Avalanche、Fantom 和 Celo）构建。

也就是说，Rust 在区块链领域开始变得越来越流行，Solana、NEAR、Polkadot 等都有一流的 Rust 支持。你学习这两种语言可能都不会出错，但对于初学者来说，如果今天有人问我，我会说 Solidity 仍将是更好的选择。

除了这些建议，这里有一个不全面的区块链样本，它在技术、实用性、社区、势头和未来可行性方面有一个坚实的组合：

*   以太坊--原创智能合约平台
    
*   ZKrollups:ZKSync, Starknet, Hermez - 高吞吐量的以太坊第 2 层，但不与 EVM 原生兼容
    
*   Optimistic rollups: Arbitrum & Optimism - 以太坊第 2 层，与 EVM 兼容（在此了解更多关于 Optimistic rollups 和 ZKrollups 的区别）。
    
*   Polygon - 以太坊侧链
    
*   Solana - 吞吐量高，交易成本低，区块时间快，但比 EVM（Rust）更难学习
    
*   NEAR - 底层区块链，可以用 Rust 或 Assemblyscript 编写智能合约
    
*   Cosmos - 一个互操作的区块链的生态系统
    
*   Polkadot - 基于区块链的计算平台，使建立在其上的区块链能够在它们之间执行交易，创建一个互连的区块链互联网
    
*   Fantom - EVM 兼容的底层区块链
    
*   Avalanche - EVM 兼容的底层区块链
    
*   Celo - EVM 兼容的底层区块链，旨在使任何拥有智能手机的人都能轻松发送、接收和存储加密货币
    
*   Tezos - 非 EVM 兼容的底层区块链，很多 NFT 项目正在使用它
    

### 区块链开发环境

对于 EVM 开发，有几个好的开发环境可以使用：

Hardhat（JavaScript）是一个较新的选择，但它正在获得越来越多的青睐。他们的文档很好，工具和开发人员的体验很好，我个人一直在用它来构建去中心化应用。

Truffle（JavaScript）是一套在 EVM 上构建和开发应用程序的工具。它很成熟，经过实战考验，并且有很好的文档。它已经存在了一段时间，许多开发者都在使用它。

Foundry 是一个来自 Paradigm 的新的 Solidity 开发环境，显示出很大的前景。它的主要特点是能够在 Solidity 中编写测试，支持模糊测试，以及速度（它是用 Rust 编写的）。我在这里写了一个关于它的单独介绍。

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

对于 Solana 的开发，Anchor 正在迅速成为新的开发者的入门点。它提供了一个 CLI，用于构建和测试 Solana 程序的脚手架，以及你可以用来构建前端的客户端库。它还包括一个 DSL，可以抽象出开发人员在开始使用 Solana 和 Rust 开发时经常遇到的许多复杂问题。

### 文件存储

我们在 web3 中把图片、视频和其他文件存储在哪里？在链上存储这么大的文件通常是非常昂贵的，所以我们可能不想把它们存储在那里。

相反，我们可以使用少数几个文件存储协议中的一个：

IPFS--点对点文件系统协议

优点：它很可靠，有很好的文档，有一个庞大的生态系统

缺点：如果数据没有固定，就会丢失。

Arweave - 允许你永久地存储数据，只需支付一笔交易费。我是 Arweave 的粉丝，在这里写了一篇关于它的博文。

Filecoin - 来自 Protocol Labs，也是建立 IPFS 的团队，它是一个协议，旨在提供一个持久的数据存储系统。有一些方法可以让开发者建立在 Filecoin 上，包括 web3.storage，这很不错。

Skynet - 我还没有在生产中使用它，但已经试过了，它似乎工作得很好。这里的 API 看起来很棒。我有一些问题，比如数据的持久性有多长，以及 Skynet 与其他协议的互操作性。

### P2P 数据库

除了文件存储和链上存储外，你可能还需要在链外存储数据。你可以使用这些类型的解决方案，类似于你在传统技术堆栈中使用数据库的方式，但它们是在去中心化的网络上的 N 个节点上复制的，因此更可靠（至少在理论上）。

几个选择是：

Ceramic Network - 一个去中心化的开源平台，用于创建、托管和分享数据。Ceramic 也有一个很好的身份协议，我将在后面谈及。可能是我目前最喜欢的链外存储解决方案。这里有一个相当不错的演示。

Textile ThreadDB - 一个建立在 IPFS 和 Libp2p 上的多方数据库。如果我理解正确的话，它目前可能正在经历一个大的 API 变化。我试过了，它显示了一些前景，但文档和 DX 需要一些改进。

GunDB - 一个去中心化的、点对点的数据库。Gun 已经存在了相当长的时间，一些相当有趣的应用已经用它建立。

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

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

### API（索引和查询）

我们与区块链互动和在区块链之上构建的方式与传统技术栈中的数据库有很多不同。对于区块链，数据不是以一种可以有效或容易地直接从其他应用程序或前端消费的格式存储的。

区块链是为写操作而优化的。你经常听到以每秒交易量、区块时间和交易成本为中心的创新发生。区块链数据在一段时间内以区块形式写入，使得除了基本的读取操作外，其他的都不可能。

在大多数应用中，你需要像关系型数据、排序、过滤、全文搜索、分页和许多其他类型的查询功能。为了做到这一点，需要对数据进行索引和组织，以便有效地进行检索。

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

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

要了解更多关于 The Graph 的信息，请查看这里（[https://thegraph.com/docs/）的文档或我在这里的教程（https://dev.to/dabit3/building-graphql-apis-on-ethereum-4poa）。](https://thegraph.com/docs/%EF%BC%89%E7%9A%84%E6%96%87%E6%A1%A3%E6%88%96%E6%88%91%E5%9C%A8%E8%BF%99%E9%87%8C%E7%9A%84%E6%95%99%E7%A8%8B%EF%BC%88https://dev.to/dabit3/building-graphql-apis-on-ethereum-4poa%EF%BC%89%E3%80%82)

### 身份认证

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

在 web3 中，身份识别完全围绕着钱包和公钥密码学的概念。

虽然 "钱包 "这个名字有它的作用，但我发现刚接触 web3 的人觉得这个术语很混乱，因为它与认证和身份有关。我希望将来我们能想出一些其他的方法来表达钱包是什么，因为它不仅结合了金融的各个方面，也结合了身份和信誉。

作为一个开发者，你将需要了解如何以各种方式访问用户的钱包和地址并与之互动。

在一个非常基本的层面上（也是一个非常常见的要求），你可能想请求访问用户的钱包。要做到这一点，你通常能够在窗口环境（网络浏览器）中访问用户的钱包，或者使用像 WalletConnect 或 Solana 的钱包适配器。

例如，如果他们有一个可用的 Ethereum 钱包，你将能够访问 window.ethereum。对于 Solana（window.solana）、Arweave（window.arweaveWallet）和其他少数的钱包也是如此。WalletConnect 很适合移动网络和 React Native，因为它允许用户直接从设备上使用他们的移动钱包进行授权。 

如果你想自己处理认证，你可以让用户签署交易，然后在某处解码以认证用户，但这通常需要一个服务器。这里是一个使用 EVM 钱包的例子，这里是一个使用 Solana / Phantom 的例子。

以去中心化的方式管理用户资料呢？Ceramic Network 为管理去中心化的身份提供了最强大的协议和工具套件。他们最近发布了一篇博文，概述了他们最近的一些更新，并给出了一些关于所有工具如何协同工作的指南。我想从那里开始，然后探索他们的文档，以获得对如何开始构建的理解，并考虑查看我在这里使用 Ceramic self.id 的例子项目。

如果你想获取一个用户的 ENS 文本记录，ensjs 库提供了一个很好的 API 来获取用户数据：

    1、const ens = new ENS({ provider, ensAddress: getEnsAddress('1') })2、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 更容易理解。

### 其他协议

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

Livepeer 是一个去中心化的视频流媒体网络。它已经很成熟，并被广泛使用，网络上有超过 7 万个 GPU 的直播。

Chainlink 是一个预言机，能够访问真实世界的数据和链外计算，同时保持区块链技术固有的安全性和可靠性保证。

### 总结

这篇文章将是我在学习、试验和收集 web3 开发人员的反馈时跟上的动态文档。

如果你有任何反馈意见或关于我在这里遗漏的想法，请与我分享你的想法。看到围绕 web3 发生的所有活动，让人兴奋不已，因为开发者们正在跃跃欲试地参与进来。虽然基础设施仍在不断发展，但建立真正的去中心化协议和应用程序的愿景是非常重要的，它允许人们协调，而不必将权力和控制权交给大公司，我们正在接近实现这一愿景。

---

*Originally published on [Untitled](https://paragraph.com/@0xec2b995a20ebc576f588f3207d06f066b2297c2e/web3-0)*
