构建 Web3 应用需要使用到哪些技术栈?
想在web3上进行构建应用吗?Nader Dabit 在一份介绍性指南中定义了web3技术栈的构建基础模块,一起来看看。
我在2021年4月过渡到web3,此前我做了大约10年的传统全栈开发者。在潜心研究所有这些新技术和想法时,我想知道的第一件事是 "什么是web3技术栈?"。
当创建一个传统的网络或移动应用程序时,我经常依赖于少数几个构建模块来完成工作:
API/应用程序服务器(REST或GraphQL)
认证层
数据库
客户端框架、平台和库
文件存储
使用这些核心组件,我可以建立我想建立的大多数类型的应用程序,或者至少可以达到大部分的目的。那么,在web3中是什么样子的呢?
事实证明,这个问题的答案并不那么简单,因为:
开发范式在很多方面都完全不同
web3的工具、技术和生态系统都没有web2那么成熟
对我来说,要理解如何启动和运行web3应用程序并建立起来也比较困难,因为我是以与web2世界相同的方式来处理问题的。
在过去8个月左右的时间里,经过工作、研究、实验和建设,我想分享我所学到的东西。
在我们定义web3栈之前,让我们先尝试定义web3。有无数的定义,这取决于你问谁,但对我来说,我发现这个定义很准确:Web3是实现完全去中心化应用的协议栈。
有了这个去中心化的技术栈,我们就可以开始建立去中心化的应用,这些应用有其自身的影响和特点。
web3实现的一些特点是:
去中心化的网络基础设施
拥有(数据、内容和平台)的所有权
原生数字支付
自主的身份
分布式的、无信任的、强大的基础设施
开放、公共、可组合的后端
虽然一些建立在去中心化技术堆栈上的应用程序将取代它们的前身,但区块链所带来的新基元也使新的应用程序范式成为可能。
原生的数字支付和公共后端基础设施--如机器学习、移动设备、虚拟现实和其他技术基元、平台和构建模块--使全新类型的应用程序得以建立,有些是尚未想象到的。
这是否意味着一切都将被web3取代?不一定。虽然我认为对于某些类型的应用来说,建立在分散的技术堆栈上是一个更好的选择--就像几乎所有的技术选择一样,这取决于你在建立什么。
现在让我们开始深入研究web3堆栈,他们分类为:
区块链
区块链开发环境
文件存储
P2P数据库
API(索引和查询)
身份识别
客户端(框架和库)
其他协议
以太坊 -- 原创智能合约平台
ZK rollups: ZKSync, Starknet, Hermez - 高吞吐量的以太坊第2层,但不兼容EVM
Optimistic rollups: Arbitrum & Optimism - 以太坊第2层,与EVM兼容(了解更多关于optimistic 和ZK Rollups的区别这里)
Polygon - 以太坊侧链
Solana - 吞吐量高,交易成本低,区块时间快,但比EVM更难学习(Rust)
NEAR - 第一层区块链,可以用Rust或Assemblyscript编写智能合约
Cosmos - 一个互操作的区块链的生态系统
Polkadot - 基于区块链的计算平台,使建立在其上的区块链能够在它们之间执行交易,创建一个互连的区块链互联网。
Fantom - EVM兼容的第1层
Avalanche - EVM兼容的第1层
Celo - EVM兼容的第1层,旨在使任何拥有智能手机的人都能轻松发送、接收和存储加密货币
Tezos - 非EVM兼容的第1层,很多NFT项目正在使用它
对于EVM的开发,有几个好的开发环境可以使用:
Hardhat (JavaScript)是一个较新的选择,但它正获得越来越多的青睐。他们的文档很好,工具和开发人员的体验也很好,我个人一直在用它来构建dapp。
Truffle (JavaScript) 是一套用于在EVM上构建和开发应用程序的工具。它很成熟,经过测试,并且有很好的文档。它已经存在了一段时间,许多开发者都在使用它。
Foundry是Paradigm公司的一个新的Solidity开发环境,显示出很大的前景。它的主要特点是能够在Solidity中编写测试,支持模糊测试,以及速度快(它是用Rust编写的)。在这里我写了一份关于它的单独介绍。
Brownie是一个基于Python的智能合约开发和测试框架,用于Solidity/EVM开发。
对于Solana的开发,Anchor正迅速成为新开发者的入口。它提供了一个CLI,用于构建和测试Solana程序的脚手架,以及你可以用来构建前端的客户端库。它还包括一个DSL,可以抽象出开发人员在开始使用Solana和Rust开发时经常遇到的许多复杂问题。
除了文件存储和链上存储之外,你可能还需要在链外存储数据。你可能会使用这些类型的解决方案,类似于你在传统技术堆栈中使用数据库的方式,但相反,它们是在分布的网络上的N个节点上复制的,因此更可靠(至少在理论上)。
几个选择是:
Ceramic Network - 一个去中心化的开源平台,用于创建、托管和分享数据。Ceramic也有一个很好的身份协议,我将在后面谈及。可能是我目前最喜欢的链外存储解决方案。这里有一个相当不错的演示。
Textile ThreadDB - 一个建立在IPFS和Libp2p的多方数据库。如果我理解正确的话,它目前可能正在经历一个大的API变化。我试过了,它显示了一些前景,但文档和DX需要一些改进。
GunDB - 一个去中心化的、点对点的数据库。Gun已经存在了相当长的时间,一些相当有趣的应用已经用它建立。
就成熟度而言,我的看法是,链外存储解决方案的生态系统还没有达到建立一些开发者可能想要的更高级用例所需要的程度。这里的一些挑战是实时数据、冲突检测和冲突解决、写入授权、文档和一般开发者经验。
将链外数据解决方案与区块链协议相结合,是我们在拥有能够支持任何类型应用的完全去中心化协议栈之前需要跨越的最后一个大障碍之一。
如果你想获取用户的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的中心化实现都违背了规范所要实现的理念。