工业级web3应用开发技术选型

本文给出当下web3产品级应用的技术栈推荐,可供置身于去中心事业的科技从业人员参考。

预备知识

有关于本文的内容,默认读者已经具备基本的去中心相关的知识点,下面系列文章可供大家提前预习:

《从web 1.0到web 3.0》
《DApp一日通——web3.js、Truffle与Dfinity篇》
《智能合约一日通——Solidity篇》
《NFT一日通——Azuki的ERC721A》
《数字货币一日通——OpenZeppelin的ERC20》

架构摘要

EVM兼容架构选型推荐

编程语言:
  • 前端:TypeScript/JavaScript
  • 跨平台:ReactNative
  • 后端:TypeScript/JavaScript
  • 合约端:Solidity
  • 链端:Go
框架或工作流:
  • 前端:React + Next.js + Wagmi + dotenv
  • 后端:Node.js生态 (与前端均用JS系,一体成型)
  • Provider/Signer: web3.js/ether.js
  • Relay Network: Infura
  • Oracle: Chainlink
  • L2/侧链: Polygon
  • 数据端:IPFS
  • 合约端:Hardhat
  • 中间件:Java生态(如果需要)

非EVM兼容或其它备选架构选型

编程语言:
  • 前端:WASM生态
  • 跨平台:Flutter, Swift + web3.swift, Java + Web3j
  • 后端:Rust, Java, Scala, Python, Go
  • 合约端:Cairo (StarkNet), Rust(Solana, Dfinity), Motoko (Dfinity), Vyper
  • 链端:Rust, C++, Haskell, OCaml
框架或工作流:
  • 前端:Vue.js
  • 后端:Spring, Actix Web(Actor Framework), Flask
  • Provider/Signer: Web3j, ether-rs/rust-web3
  • Relay Network: Alchemy, Moralis
  • Oracle: 无额外备选
  • L2/侧链: StarkNet (非EVM兼容,需要切换到Cairo/Python生态)
  • 数据端:Arweave, Filecoin
  • 合约端:Foundry (EVM),Truffle
  • 中间件:无额外备选

推荐解构

前端

React生态可以很方便结合ReactNative跨平台,外加其本身坐拥JS生态的资源,有非常丰富的三方库和框架来辅助我们开发。在EVM兼容的链内,不少Provider/Signer也是支持JS体系的,所以这里推荐这个框架。编程语言的话,既然是JavaScript体系,那当然可以选择TypeScript这款更好的JS,无论是React还是Next.js都有TS模板。TS有一个现代的类型系统,支持ADT和一些很强大的高阶类型,强类型可以帮助我们避免很多的错误,把危险即时扼杀在摇篮里,相信你会喜欢上这款微软出品的JS语言的。

使用React再配合Wagmi和dotenv,是一套已经可以构建工业级产品的选择。

后端

Node.js可以让我们用JS写后端,这样可以将维护成本降低,与前端一体成型,这是一个低成本的方案。当然如果可以追求安全性的话,Rust也是一个热门的选择,尤其是区款链生态当中。传统的方案就是Java/Scala生态,如果你的后端很复杂,或者干脆只是一个传统个web2链改项目,那么用传统的方外加丰富的中间件确实是一个好选择。

合约端

如果是EVM生态,没什么好说的,就是Hardhat + Solidity的工作流。选择新型的Cairo也不错,Solana/Dfinity则提供了Rust这个选项,Dfinity甚至还有自己的Motoko编程语言。作为推荐,还是优先考虑资产更丰富的以太坊,优先支持Solidity吧。

Provider/Signer

这个没什么好推荐,目前主流的能用哪个算哪个,一般我们可以不需要裸写Provider的逻辑。选用了React框架后,Hardhat集成了ether.js,React可以选用Wagmi,其它的方案也大同小异。

Relay

结点服务自然首选Infura,a16z投资的Alchemy也可以纳入考虑。

Oracle

以太坊区块链是完全确定性(deterministic)的。也就是说,当我们拿到整个网络的历史,并且在我们自己的电脑上重放,我们总能在一个正确的状态结束。但是互联网是非确定性的,每次重放所有的网络上面的事务,总是会遇到一个不同的结果。也因此,以太坊上面实现随机数和像普通的网路一样调用API获取结果变得困难,这一点和纯函数的编程语言(Haskell)有类似之处,状态和过程分离了。但是获取一些数据是很重要的能力,至少我们可以更加方便,比如创建一个去中心的数字货币交易所,数字货币的价格是需要通过外部获取的,这就要借助Oracle的能力(不是那个数据库公司)。这里推荐Chainlink。

数据端

如果要发布NFT,或者要做一个去中心的Gmail,类似的这种需要存储方案的,目前推荐IPFS,你可以用Pinata的服务,Infura支持IPFS。Mirror.xyz使用了Arweave,也可以作为备选。