本文给出当下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,也可以作为备选。