比较 ethers.js 和 web,Web 重新流行
原文链接
随着 Web3 重新流行,比较 ethers.js 和 web3.js
随着 Web3 重新获得关注,人们对 ethers.js 和 web3.js(用于基于以太坊的 DApp(去中心化应用程序)开发的主要 JavaScript 库)的兴趣也在增加。虽然这两个库都可以与以太坊区块链交互,但它们存在一些关键差异,特别是在开发方法方面。本文档对这两个库进行了比较,探讨了它们的特点、优点、缺点以及开发风格的差异。
web3.js
web3.js 是一个较旧的库,出现在以太坊生态系统的早期。它提供了广泛的功能,提供了从单个 web3 对象与区块链交互的所有方法。它主要使用基于回调函数的 API 风格。
优点:
- 它有着悠久的历史,并在许多遗留项目中使用。
- 与 ethers.js 相比,提供更广泛的功能。
缺点:
- 相对较大且较重,这会影响性能。
- API 有点复杂,导致学习曲线更陡。
- 与 ethers.js 相比,更新速度较慢。
- 基于回调的 API 会让异步代码编写变得有些复杂。
以太坊.js
ethers.js 是一个相对较新的库,它遵循现代 JavaScript 标准,并专注于提供更好的开发人员体验。它简洁、轻量级,提供模块化的API。特别是,它通过明确分离提供者和签名者来提高开发灵活性和安全性。它使用基于 Promise 的 API,允许简洁的异步代码。
优点:
- 简洁轻量,提供更快的性能。
- 具有清晰的 API 结构,分为签名者和提供者。
- 签名者:管理私钥并处理交易签名(增强安全性)。
- 提供商:管理区块链网络连接(轻松支持各种网络)。
- 提供增强的安全功能,更加注重私钥管理。
- 积极开发维护,快速反映最新功能。
- 提供优秀的文档。
- 基于 Promise 的 API 使异步代码简洁易读。
缺点:
- 作为一个相对较新的库,它在遗留项目中的使用并不像 web3.js 那么多。
提供者和签名者:ethers.js 和 web3.js 的核心概念
在区块链,尤其是以太坊生态中,Provider和Signer是至关重要的概念。它们定义了 DApp 如何与区块链交互。 ethers.js 和 web3.js 对这两个概念的处理方式不同,导致开发方法存在显着差异。
提供者:与区块链的只读连接
提供商提供对区块链网络的只读访问。它就像一个图书管理员。您可以阅读书籍(区块链数据)并获取信息,但不能添加或修改书籍中的内容。
主要功能:
- 检索区块信息(区块高度、时间戳等)
- 检索交易信息
- 查看账户余额
- 调用智能合约的只读函数(视图函数)
- 检查网络状态
签名者:交易签名和执行
签名者提供使用私钥签署交易并将其提交到区块链的能力。就好像有人带着印章一样。正如文件(交易)只有在盖章后才生效一样,签名者对交易进行签名,以便将其记录在区块链上。
主要功能:
- 私钥管理(安全存储和访问)
- 交易创建和签名
- 调用智能合约的状态改变函数
- 发送以太币
ethers.js 中的提供者和签名者
ethers.js 通过明确分离 Provider 和 Signer 来构建其 API。这大大增强了开发灵活性和安全性。
Provider:通过ethers.providers模块提供各种Provider。您可以使用 Infura、Alchemy、Etherscan 等服务进行连接,或直接使用 RPC URL。
- 示例:const provider = new ethers.providers.InfuraProvider("mainnet", "YOUR_INFURA_PROJECT_ID");
签名者:您可以使用 ethers.Wallet 类管理私钥或与 MetaMask 等钱包连接。
- 示例(使用私钥): const wallet = new ethers.Wallet("YOUR_PRIVATE_KEY",provider);
- 示例(连接 MetaMask): const provider = new ethers.providers.Web3Provider(window.ethereum); const 签名者=provider.getSigner();
通过在ethers.js中分离Provider和Signer,你可以获得以下优势:
- 增强安全性:私钥可以通过钱包安全管理,无需直接管理。
- 增加灵活性:可以轻松切换和使用各种提供程序。
- 轻松测试:您可以在测试环境中使用模拟签名者执行测试。
web3.js 中的提供者和签名者
web3.js 没有明确区分 Provider 和 Signer。虽然它通过 web3.eth.accounts 来管理账户和签署交易,但它并没有像 ethers.js 那样清晰分离。
Provider: 使用 web3.setProvider() 设置 Provider。
- 示例: const web3 = new Web3(new Web3.providers.HttpProvider('YOUR_RPC_URL'));
签名者: 使用 web3.eth.accounts.signTransaction() 签署交易。在此过程中,您通常必须直接使用私钥,这可能会产生安全漏洞。您还可以使用 MetaMask 等钱包,但集成不像 ethers.js 那样干净。
总结比较
Feature | ethers.js | web3.js |
---|---|---|
Provider | Clearly separated, supports various Providers (Infura, Alchemy, etc.) | Set with web3.setProvider() |
Signer | Clearly separated, Wallet class, easy wallet integration | Managed through web3.eth.accounts, may require direct private key management |
Security | Secure private key management, enhanced security | Risk of private key exposure |
Flexibility | High flexibility, supports various Providers and wallets | Relatively low flexibility |
ethers.js 通过明确分离 Provider 和 Signer,极大地提高了开发灵活性、安全性和便捷性。另一方面,web3.js 没有这种明确的分离,这可能会使开发变得有些复杂并产生安全漏洞。因此,在开始一个新的Web3项目时,一般建议使用ethers.js。
开发方式差异
Feature | web3.js | ethers.js |
---|---|---|
API Style | Single web3 object, callback-based | Signer and Provider separated, Promise-based |
Asynchronous Processing | Handles asynchronous code using callback functions, which can reduce code readability | Can write asynchronous code concisely and clearly using Promises (easy to use async/await) |
Private Key Management | Requires direct private key management (potential security vulnerabilities) | Abstracted private key management through Signer (enhanced security) |
Network Connection | Connection setup using web3.setProvider() | Supports various networks and connection methods through Provider (Infura, Alchemy, etc.) |
结论
开始新的Web3项目时,建议使用ethers.js。它提供更好的开发体验、性能、安全性和最新功能。尤其是Provider和Signer的分离以及基于Promise的API,符合现代开发实践,提高了代码的可读性和可维护性。然而,对于维护现有的 web3.js 项目或在特定情况下,web3.js 可能仍然是一个不错的选择。
参考
- ethers.js 官方文档
- web3.js 官方文档
- 如何使用两个大型以太坊库 web3.js 和 ethers.js
以上是比较 ethers.js 和 web,Web 重新流行的详细内容。更多信息请关注PHP中文网其他相关文章!

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

Python更适合初学者,学习曲线平缓,语法简洁;JavaScript适合前端开发,学习曲线较陡,语法灵活。1.Python语法直观,适用于数据科学和后端开发。2.JavaScript灵活,广泛用于前端和服务器端编程。

从C/C 转向JavaScript需要适应动态类型、垃圾回收和异步编程等特点。1)C/C 是静态类型语言,需手动管理内存,而JavaScript是动态类型,垃圾回收自动处理。2)C/C 需编译成机器码,JavaScript则为解释型语言。3)JavaScript引入闭包、原型链和Promise等概念,增强了灵活性和异步编程能力。

JavaScript在Web开发中的主要用途包括客户端交互、表单验证和异步通信。1)通过DOM操作实现动态内容更新和用户交互;2)在用户提交数据前进行客户端验证,提高用户体验;3)通过AJAX技术实现与服务器的无刷新通信。

JavaScript在现实世界中的应用包括前端和后端开发。1)通过构建TODO列表应用展示前端应用,涉及DOM操作和事件处理。2)通过Node.js和Express构建RESTfulAPI展示后端应用。

理解JavaScript引擎内部工作原理对开发者重要,因为它能帮助编写更高效的代码并理解性能瓶颈和优化策略。1)引擎的工作流程包括解析、编译和执行三个阶段;2)执行过程中,引擎会进行动态优化,如内联缓存和隐藏类;3)最佳实践包括避免全局变量、优化循环、使用const和let,以及避免过度使用闭包。

Python和JavaScript在社区、库和资源方面的对比各有优劣。1)Python社区友好,适合初学者,但前端开发资源不如JavaScript丰富。2)Python在数据科学和机器学习库方面强大,JavaScript则在前端开发库和框架上更胜一筹。3)两者的学习资源都丰富,但Python适合从官方文档开始,JavaScript则以MDNWebDocs为佳。选择应基于项目需求和个人兴趣。

Python和JavaScript在开发环境上的选择都很重要。1)Python的开发环境包括PyCharm、JupyterNotebook和Anaconda,适合数据科学和快速原型开发。2)JavaScript的开发环境包括Node.js、VSCode和Webpack,适用于前端和后端开发。根据项目需求选择合适的工具可以提高开发效率和项目成功率。

C和C 在JavaScript引擎中扮演了至关重要的角色,主要用于实现解释器和JIT编译器。 1)C 用于解析JavaScript源码并生成抽象语法树。 2)C 负责生成和执行字节码。 3)C 实现JIT编译器,在运行时优化和编译热点代码,显着提高JavaScript的执行效率。
