# Solana Web3.js 2.x 版本:功能拆分与性能优化Solana Web3.js 作为一个功能丰富的 JavaScript 库,在今年 11 月发布了 2.x 版本。新版本相较于 1.x 有了较大的变化,本文将对其主要变化进行概括。虽然 2.x 版本刚发布不久,使用量还不高,许多广泛使用的库也尚未切换,但了解这些变化对未来的迁移工作很有帮助。## 版本对比旧版本的使用相对简单,只需一个 @solana/web3.js 包就包含了所有内容。它基于类的设计,封装了大量常用操作。例如 Connection 类提供了几十种方法,几乎涵盖了开发者所需的所有功能。然而,这种设计也带来了一些问题。即使开发者只使用其中一小部分功能,整个代码库也会被下载到用户设备上,由于库的代码量较大,可能会导致一定的加载时间。2.x 版本采取了不同的策略。官方团队将原有的代码库拆分为多个小模块,如 @solana/accounts、@solana/codecs、@solana/rpc、@solana/signers、@solana/transactions 等。同时,新版本放弃了基于类的实现,更多地采用单个函数的方式。这种设计有利于 JavaScript 代码构建时的优化,未使用的代码将被删除,不会被下载到用户设备上。据官方文档统计,使用新版的 DApp 通常能实现约 30% 的尺寸优化,如果只使用了很小一部分功能,优化比例可能更高。这种变化也给 Solana 团队的文档工作带来了挑战,如何让开发者迅速找到所需功能成为一个重要问题。目前,包名具有较好的语义性,从名称上就能大致了解它们的用途,这在一定程度上降低了开发者的迁移难度。然而,由于刚发布不久,许多项目还未进行迁移。Solana Cookbook 上关于 2.x 版本的示例也较少。新版本倾向于使用运行时内置功能(如生成密钥对),但文档中对这些部分的描述不足,可能会让开发者感到困惑。2.x 版本的另一个重要特点是零依赖。这一点对许多用户来说可能不那么重要,但从今年 12 月初发生在 @solana/web3.js 1.95.5 和 1.95.6 版本上的供应链攻击来看,更多的外部输入和依赖会大大增加安全事件发生的可能性。随着 2.x 版本的发布,Web3.js 的开发团队决定更多地使用本机功能,取消外部依赖和 Polyfills 的引入。虽然未来可能会有变化,但目前 2.x 版本已经消除了所有外部依赖。## 重要变更点### 连接在 1.x 版本中,Connection 类提供了大量方法。但其主要功能是通过配置 RPC 请求地址创建一个请求发送器,然后通过它发送各种请求。2.x 版本采用了更加函数式的方式实现这一功能。例如,当调用 sendAndConfirmTransaction 来发送交易时,会自动发起 HTTPS 请求,并建立一个 WSS 连接,订阅交易状态,在交易被确认后返回交易 hash。### 密钥对公钥和私钥相关的部分也有较大变化。1.x 版本中常用的 Keypair 和 PublicKey 两个类不再存在,被一些函数所替代。例如,可以使用 await generateKeyPair() 生成密钥对,而不是之前的 Keypair.generate()。值得注意的是,新的 generateKeyPair 返回一个 Promise,而不是直接返回密钥对。这是因为新的实现尽可能利用了 JavaScript 的 Web Crypto API,使用了原生的 Ed25519 实现。Web Crypto API 的许多方法都是异步的。不过,这一变化并非难以接受,在 2024 年即将结束的今天,JavaScript 开发者已经非常熟悉 Promise 了。### 发送交易1.x 版本中的 Transaction 和 VersionedTransaction 两个类在 2.x 中不再存在。旧版本中提供的 System Program 相关方法也不再继续存在,因此 SystemProgram 类上的静态方法都需要从其他地方引入。例如,transfer 指令需要调用 @solana-program/system 中的 getTransferSolInstruction 函数。由于不再提供类,Web3.js 提供了函数式编程中常用的 pipe 形式。开发者可以通过 pipe 函数来实现原本 1.x 版本的转账功能。值得注意的是,交易不再通过 Connection 来发起,而是通过开发者定义的 RPC Provider 生成一个特有的函数,然后调用该函数来发起交易。相对 1.x 版本,代码量有所增加,但可定制性更强了。交易通过 HTTPS RPC 发起,然后通过订阅 WSS RPC 来确认交易结果。可以感受到新的方式非常依赖 WSS,相信未来 WSS 的应用将会越来越广泛,这也对 RPC 供应商的服务稳定性提出了更高的要求。### React值得一提的是,@solana/web3.js 项目中还包含了一个名为 @solana/react 的库,提供了一些 React Hook,内置了诸如 signIn 等功能。## 总结@solana/web3.js 2.x 版本的发布体现了 Solana 团队对不断发展和改进的承诺。它为开发人员提供了一个高效、灵活、可定制的与 Solana 网络交互的方式,有助于推动该平台的采用和发展。
Solana Web3.js 2.x版本重大升级 功能拆分与性能优化
Solana Web3.js 2.x 版本:功能拆分与性能优化
Solana Web3.js 作为一个功能丰富的 JavaScript 库,在今年 11 月发布了 2.x 版本。新版本相较于 1.x 有了较大的变化,本文将对其主要变化进行概括。
虽然 2.x 版本刚发布不久,使用量还不高,许多广泛使用的库也尚未切换,但了解这些变化对未来的迁移工作很有帮助。
版本对比
旧版本的使用相对简单,只需一个 @solana/web3.js 包就包含了所有内容。它基于类的设计,封装了大量常用操作。例如 Connection 类提供了几十种方法,几乎涵盖了开发者所需的所有功能。
然而,这种设计也带来了一些问题。即使开发者只使用其中一小部分功能,整个代码库也会被下载到用户设备上,由于库的代码量较大,可能会导致一定的加载时间。
2.x 版本采取了不同的策略。官方团队将原有的代码库拆分为多个小模块,如 @solana/accounts、@solana/codecs、@solana/rpc、@solana/signers、@solana/transactions 等。同时,新版本放弃了基于类的实现,更多地采用单个函数的方式。这种设计有利于 JavaScript 代码构建时的优化,未使用的代码将被删除,不会被下载到用户设备上。据官方文档统计,使用新版的 DApp 通常能实现约 30% 的尺寸优化,如果只使用了很小一部分功能,优化比例可能更高。
这种变化也给 Solana 团队的文档工作带来了挑战,如何让开发者迅速找到所需功能成为一个重要问题。目前,包名具有较好的语义性,从名称上就能大致了解它们的用途,这在一定程度上降低了开发者的迁移难度。
然而,由于刚发布不久,许多项目还未进行迁移。Solana Cookbook 上关于 2.x 版本的示例也较少。新版本倾向于使用运行时内置功能(如生成密钥对),但文档中对这些部分的描述不足,可能会让开发者感到困惑。
2.x 版本的另一个重要特点是零依赖。这一点对许多用户来说可能不那么重要,但从今年 12 月初发生在 @solana/web3.js 1.95.5 和 1.95.6 版本上的供应链攻击来看,更多的外部输入和依赖会大大增加安全事件发生的可能性。随着 2.x 版本的发布,Web3.js 的开发团队决定更多地使用本机功能,取消外部依赖和 Polyfills 的引入。虽然未来可能会有变化,但目前 2.x 版本已经消除了所有外部依赖。
重要变更点
连接
在 1.x 版本中,Connection 类提供了大量方法。但其主要功能是通过配置 RPC 请求地址创建一个请求发送器,然后通过它发送各种请求。
2.x 版本采用了更加函数式的方式实现这一功能。例如,当调用 sendAndConfirmTransaction 来发送交易时,会自动发起 HTTPS 请求,并建立一个 WSS 连接,订阅交易状态,在交易被确认后返回交易 hash。
密钥对
公钥和私钥相关的部分也有较大变化。1.x 版本中常用的 Keypair 和 PublicKey 两个类不再存在,被一些函数所替代。
例如,可以使用 await generateKeyPair() 生成密钥对,而不是之前的 Keypair.generate()。值得注意的是,新的 generateKeyPair 返回一个 Promise,而不是直接返回密钥对。这是因为新的实现尽可能利用了 JavaScript 的 Web Crypto API,使用了原生的 Ed25519 实现。Web Crypto API 的许多方法都是异步的。不过,这一变化并非难以接受,在 2024 年即将结束的今天,JavaScript 开发者已经非常熟悉 Promise 了。
发送交易
1.x 版本中的 Transaction 和 VersionedTransaction 两个类在 2.x 中不再存在。
旧版本中提供的 System Program 相关方法也不再继续存在,因此 SystemProgram 类上的静态方法都需要从其他地方引入。例如,transfer 指令需要调用 @solana-program/system 中的 getTransferSolInstruction 函数。
由于不再提供类,Web3.js 提供了函数式编程中常用的 pipe 形式。开发者可以通过 pipe 函数来实现原本 1.x 版本的转账功能。
值得注意的是,交易不再通过 Connection 来发起,而是通过开发者定义的 RPC Provider 生成一个特有的函数,然后调用该函数来发起交易。相对 1.x 版本,代码量有所增加,但可定制性更强了。
交易通过 HTTPS RPC 发起,然后通过订阅 WSS RPC 来确认交易结果。可以感受到新的方式非常依赖 WSS,相信未来 WSS 的应用将会越来越广泛,这也对 RPC 供应商的服务稳定性提出了更高的要求。
React
值得一提的是,@solana/web3.js 项目中还包含了一个名为 @solana/react 的库,提供了一些 React Hook,内置了诸如 signIn 等功能。
总结
@solana/web3.js 2.x 版本的发布体现了 Solana 团队对不断发展和改进的承诺。它为开发人员提供了一个高效、灵活、可定制的与 Solana 网络交互的方式,有助于推动该平台的采用和发展。