草庐IT

库对比:Web3js 与 Ethersjs

Godwin 2023-03-28 原文
每一个可编程的区块链都有一套SDK或库,帮助连接并与特定的区块链通信。今天的大多数区块链都依赖于以太坊网络,使其与EVM兼容。如果创建了ETH库,就有可能在任何与EVM兼容的区块链上使用它。然而,通信是可以使用JSON-RPC协议的。

在这篇文章中,我们将对两个流行的ETH库进行比较。你可以了解到他们之间的差异,他们的优点和缺点。这篇文章也可以帮助你决定在未来的项目中使用什么库。

用于区块链的 JavaScript

自 1995 年 Brendan Eich 发明 JavaScript 以来,它已发展成为互联网上最常用的编程语言,用于构建当今使用的许多工具。据Statista[1]称,软件开发人员中最常用的语言是 JavaScript。

想象一下你需要解决一个特定的问题;你知道的唯一语言是 JavaScript。应该可以使用 JavaScript 来解决这个问题,而不是学习一门新的高级语言来解决问题。许多开发人员都面临着这个障碍,并找到了通过构建可以通过节点提供商连接到区块链的 SDK/库来使用 JavaScript 构建 dApp 的方法。

然而,这种变通降低了在区块链空间中构建的入门级别。您无需学习 Rust 和 Solidity 等高级语言即可为Solana[2]或以太坊链构建dApp[3]。

此外,降低区块链开发的入门水平是JavaScript的众多好处之一。

什么是库

在编写 dApp 时,您可能会发现需要为区块链上的特定交易重复的特定代码。此代码/程序可能很长,您必须为新项目继续编写此代码。无需重复此程序,您可以使用代码片段自动执行该过程。您可以在需要时随时将此库插入到您的项目中。这种方法可以加快开发速度并消除重复。

JavaScript 模块

Javascript 模块是包含 JavaScript 函数或代码簇的典型文件。您可以将它们提取到不同的文件中,而不是让函数遍布您的代码。创建模块使更改变得非常容易,因为您不必开始查看大型代码库来查找特定函数来更新变量或模式。

由于Javascript本身不支持类,所以JavaScript模块模仿了类。类帮助开发人员在单个对象中将方法和字段设为公共和私有。通过这种模式,我们可以使用 export 和 import 关键字在我们的 JavaScript 项目中创建和使用函数。请参见下面的示例:

export function myFunction(value1, value2) {
return value1 * value2;
}
从上面的代码中,我们已经将这个函数公开。为了使用这个函数,我们可以使用如下所示的 import 关键字:

import myFunction from "./value.js"
现在我们了解了 JavaScript 模块。让我们在下一节中讨论 ethers.js 库。

Ethers.js

自 Ethers.js 诞生以来,它经历了稳定的增长,甚至成为以太坊开发人员中最常用的基于 JavaScript 的 web3 库之一。

该工具可帮助 Javascript 开发人员与以太坊链和任何以太坊虚拟机 (EVM) 兼容的区块链进行交互。

一位名叫 Richard Moore 的加拿大软件工程师在 2015 年创建了 ethers.js 作为 web3.js 的替代品。

Ethers.js 以轻量级着称。它的不同之处在于它管理密钥和与区块链交互的方式。在 ethers.js 中,有两个实体处理上述问题:

  1. 1. 使用私钥签署交易的钱包。
  2. 2. 使用 JSON-RPC URL 连接到区块链的提供程序。Ethers.js 检查状态并发送交易。

Ethers.js 的优势

  • 库大小 - Ethers.js 压缩后为 88KB,未压缩时为 284KB。
  • ENS - ENS 就像区块链中的 DNS。无论在哪里使用以太坊地址,也可以在那里使用 .eth 地址。您无需样板代码即可轻松设置域名。
  • 测试 - ethers.js经过广泛测试。其中许多测试用例都是由 Richard Moore 亲自编写的。有超过 10,000 个测试用例。
  • 许可 - 由于 ethers.js 是在 MIT 许可下发布的,任何人都可以免费使用和修改它。尽管如此,只要修改的源代码在 LGPL-3.0 许可下可用,就可以更改库。
* **Performance** - Considering the small size, it will be a good idea to use it on the front end as it will drastically improve performance.


## Drawbacks of Ether.js

* Ethers.js is relatively new. Having bugs in your code is unavoidable, so finding answers in places like StackOverflow might not be enough.

* Many foundational companies actively use web3.js for their core projects, and if you need to work for such companies, you might need to spend some more time learning web3.js.

Ethers.js 模块

在最近的部分中,在我们讨论 Ethers.js 之前,我们查看了 JavaScript 模块,ethers.js 有四 (4) 个模块,它们是 ethers.js API 的核心。

Ethers.Provider

要了解Ethers.Provider模块的作用,必须了解什么是节点。

要访问区块链网络,您需要在您的机器上运行一个节点来访问它。该节点连接到其他节点以检查人与人之间的交易是否有效,同时它存储有关区块链状态的信息。

区块链完全由节点构建或组成。这些节点由世界各地的个人运行。这意味着没有中央服务器或单一的事实来源。这就是它去中心化的原因。将节点想象成汽车的汽油,如果它是空的,它就不会启动。

节点的建立可能是一个痛苦的过程,它可能需要一个星期或更长时间。幸运的是,存在 Alchemy、infura 和 Quicknode 等提供商。他们为您设置了节点。他们所需要的只是让您建立连接,并且您可以访问区块链。

Ethers.Contract

该模块用于部署智能合约并与之交互。它提供了监听智能合约事件的能力(打包函数)。但是,您可以使用该模块来调用有关智能合约的信息以及智能合约提供的功能。

Ethers.utils

该模块可以帮助您格式化钱包余额等数据并处理其他用户输入。

const accountChangedHandler = async (newAccount) => {
const address = await newAccount.getAddress();
setDefaultAccount(address);
const balance = await newAccount.getBalance()
setUserBalance(ethers.utils.formatEther(balance));
await getuserBalance(address)
}
从上面的代码中,在从钱包中获取地址后,我们检索钱包的余额,但由于返回值以 Wei 格式输出,我们使用 .formatEther 使其更易于阅读。

Ethers.Wallet

该模块允许您连接到现有地址。但是,您可以无缝地签署和创建新钱包。

Web3.js

Web3.js 也是一种流行的基于 JavaScript 的库,可将客户端连接到区块链。该库使用 HTTP、IPC 或 Websockets 运行本地或远程以太坊节点并与之交互。

Web3.js 于 2015 年发布,它是一个由以太坊基金会自行创建的开源库。这意味着 web3.js 拥有最大的社区,这与一年后发布的 Ethers.js 不同。web3.js 库是比任何其他库都多的项目和包的一部分。

然而,Web3.js 不像 Ethers.js 那样管理密钥。钱包和提供商没有分开,而是假设本地节点连接到处理密钥存储、交易签名和检查区块链状态的应用程序。

web3.js 的优势

支持Ethereum基金会

Web3.js 由以太坊基金会开发。这意味着它有许多开发人员为它做出贡献,而且当问题出现时你肯定比它的对应物 Ethers.js 更快地找到解决方案是最理想的

受欢迎

我们可以用 GitHub star 的数量来衡量它在区块链开发者中的受欢迎程度。根据 Github,web3.js 拥有超过一万七千 (17,000) 颗星,而 ethers.js 拥有七千 (7000) 颗星。它的流行很大程度上是因为先行者的影响,这使它拥有更大的社区。

Web3.js 的缺点

大小

Web3.js 比 Ethers.js 相对更大,这使得在前端使用它是不可取的,因为它会降低 dApps 的性能。

灵活性

由于 ethers.js 通过关注点分离处理密钥的方式,允许开发人员以不同方式处理密钥的存储和管理,因此 web3.js 在这方面存在不足。

许可证

Web3.js 在更严格的许可下工作,如果不公开发布则不允许修改。

Web3.js 模块

Web3.eth:-该模块用于连接以太坊区块链和智能合约。它还允许您订阅区块链上的事件。

Web3.net:-此模块允许您与网络节点属性进行交互。

Web3.shh:-该模块允许与 Whisper(一种 dApp 用于相互通信的通信技术)协议进行通信。

Web3.utils:-该模块为以太坊 dApp 和其他 web3 包提供实用功能。

Web3.bzz:-此模块允许您与Swarm 网络进行交互[4]

Web3.js 和 Ethers.js 的比较

在本次会议中,我们将使用以下标准比较这两个库:

  • 开发者体验
  • 人气
  • 文档
  • 易用性
  • 性能
  • 维护

开发者体验

这两个库都可以用几行代码创建真正强大的区块链应用程序,但 ethers.js 被认为更干净,因为提供者和钱包之间的关注点分离。

然而,许多基金会项目使用 web3.js。这种情况使得大多数可用的教程都是用 web3.js 编写的,这为新开发人员提供了一个非常容易学习的曲线。与 Ethers.js 相比,有更多的资源和解决各种问题的方法。

人气

GitHub

GitHub 上的一个热门项目,如你所想是真实的。

Web3.js 作为最流行的以太坊 JavaScript 库位居榜首,在 GitHub 上有超过 16000 个启动,但在我看来,GitHub stars 只能证明先发优势。

另一方面,ethers.js 在 GitHub 上拥有超过 6k 星。

NPM 下载量

NPM 下载显示开发人员为他们的项目每周下载库的次数。

Web3.js 每周下载量超过 265000 次,而 ethers.js 每周下载量超过 610 次。

此下载显示从 web3.js 到 ethers.js 发生了变化或转变。

文档

这两个库都有相当详尽的文档。无论哪种方式,ethers.js 都比 web3.js 有优势,这要归功于它的入门和游戏区域。

使用的便利性

Web3 将钱包和供应商的处理变成一个单一的对象,但它的以太坊使读取区块链、修改其状态和管理密钥成为所有单独的操作。

性能表现

在性能方面,Ethers.js 是一个更好的库。由于其紧凑的尺寸,它适合在前端应用程序上使用。以太是 248 kB 未压缩和 77 kB 压缩。

维护

Web3.js 由以太坊基金会维护,但在 2020 年秋季获得了 ChainSafe 的资助[5],用于使用现代 Typescript 重写 web3.js。

随着这一发展,Chainsafe 致力于带来改变,以缓解使用 Web3.js 的痛点。

根据 Chainsafe 的说法,他们计划修复的领域是:

  • 高效地过渡到 Typescript。
  • 完全拥有 Typescript 中的整个库。
  • 创建灵活统一的库版本。
  • 支持 eth2 的各种功能。
总之,Chainsafe 似乎致力于做好维护 web3.js 的工作。

然而,ethers.js 由一位加拿大软件工程师 Richard Moore 维护。在 GitHub 上,只列出了 15 名贡献者。

下一步是什么

使用这些库时要自己判断哪一个最适合您的要求。互联网上有很多教程可以帮助您尽快入门。

结论

Web3.js 和 Ethers.js 都有强大的生态系统,可用于创建极快的 dApp。

令人惊奇的是,在我对这篇文章的研究过程中,这些库已经扩展了多少并且仍在使用。我希望这能让您有所了解,并让您更清楚地选择适合工作的工具。

资源

ethers.js[6]

Web3.js[7]

原文:[Godwin Alexander Ekainu] https://flutterpage.hashnode.dev/comparison-of-libraries-web3js-vs-ethersjs

有关库对比:Web3js 与 Ethersjs的更多相关文章

  1. ruby - 如何配置 Ruby Mechanize 代理以通过 Charles Web 代理工作? - 2

    我正在使用Ruby/Mechanize编写一个“自动填写表格”应用程序。它几乎可以工作。我可以使用精彩CharlesWeb代理以查看服务器和我的Firefox浏览器之间的交换。现在我想使用Charles查看服务器和我的应用程序之间的交换。Charles在端口8888上代理。假设服务器位于https://my.host.com。.一件不起作用的事情是:@agent||=Mechanize.newdo|agent|agent.set_proxy("my.host.com",8888)end这会导致Net::HTTP::Persistent::Error:...lib/net/http/pe

  2. ruby-on-rails - Assets 管道损坏 : Not compiling on the fly css and js files - 2

    我开始了一个新的Rails3.2.5项目,Assets管道不再工作了。CSS和Javascript文件不再编译。这是尝试生成Assets时日志的输出:StartedGET"/assets/application.css?body=1"for127.0.0.1at2012-06-1623:59:11-0700Servedasset/application.css-200OK(0ms)[2012-06-1623:59:11]ERRORNoMethodError:undefinedmethod`each'fornil:NilClass/Users/greg/.rbenv/versions/1

  3. ruby-on-rails - Rails - 理解 application.js 和 application.css - 2

    rails新手。只是想了解\assests目录中的这两个文件。例如,application.js文件有如下行://=requirejquery//=requirejquery_ujs//=require_tree.我理解require_tree。只是将所有JS文件添加到当前目录中。根据上下文,我可以看出requirejquery添加了jQuery库。但是它从哪里得到这些jQuery库呢?我没有在我的Assets文件夹中看到任何jquery.js文件——或者直接在我的整个应用程序中没有看到任何jquery.js文件?同样,我正在按照一些说明安装TwitterBootstrap(http:

  4. node.js - 如何在 Travis CI 上的一个项目中运行 Node.js 和 Ruby 测试 - 2

    我有一个包含多个组件的存储库,其中大部分是用JavaScript(Node.js)编写的,一个是用Ruby(RubyonRails)编写的。我想要一个.travis.yml文件来触发一个运行每个组件的所有测试的构建。根据thisTravisCIGoogleGroupthread,目前还没有官方支持。我的目录结构是这样的:.├──构建服务器├──核心├──扩展├──网络应用├──流浪文件├──package.json├──.travis.yml└──生成文件我希望能够运行特定版本的Ruby(2.2.2)和Node.js(0.12.2)。我已经有了一个make目标,所以maketest在每

  5. STM32的HAL和LL库区别和性能对比 - 2

    LL库和HAL库简介LL:Low-Layer,底层库HAL:HardwareAbstractionLayer,硬件抽象层库LL库和hal库对比,很精简,这实际上是一个精简的库。LL库的配置选择如下:在STM32CUBEMX中,点击菜单的“ProjectManager”–>“AdvancedSettings”,在下面的界面中选择“AdvancedSettings”,然后在每个模块后面选择使用的库总结:1、如果使用的MCU是小容量的,那么STM32CubeLL将是最佳选择;2、如果结合可移植性和优化,使用STM32CubeHAL并使用特定的优化实现替换一些调用,可保持最大的可移植性。另外HAL和L

  6. 适用于Web开发的Python还是Ruby? - 2

    Asitcurrentlystands,thisquestionisnotagoodfitforourQ&Aformat.Weexpectanswerstobesupportedbyfacts,references,orexpertise,butthisquestionwilllikelysolicitdebate,arguments,polling,orextendeddiscussion.Ifyoufeelthatthisquestioncanbeimprovedandpossiblyreopened,visitthehelpcenter提供指导。11年前关闭。我是一位精通HTML

  7. node.js - 从未编写过任何自动化测试,我应该如何开始行为驱动开发? - 2

    按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visitthehelpcenter指导。关闭9年前。多年来,我一直在使用多种语言进行编程,并且认为自己总体上相当擅长。但是,我从未编写过任何自动化测试:没有单元测试,没有TDD,没有BDD,什么都没有。我已经尝试开始为我的项目编写适当的测试套件。我可以看到在进行任何更改后能够自动测试项目中所有代码的理论值(value)。我可以看到像RSpec和Mocha这样的测试框架应该如何使设置和运行所述测试变得相当容易

  8. ruby-on-rails - 将 Angular JS 与 Rails 集成 - 2

    我需要一些指导来了解如何将Angular整合到rails中。选择Rails的原因:我喜欢他们偏执的做事方式。还有迁移,gem真的很酷。使用angular的原因:我正在研究和寻找最适合SPA的框架。Backbone似乎太抽象了。我不得不在Angular和Ember之间做出选择。我首先开始阅读Angular,它对我来说很有意义。所以我从来没有去读过关于ember的文章。使用Angular和Rails的原因:我研究并尝试使用小型框架,例如grape、slim(是的,我也使用php)。但我觉得需要坚持项目的长期范围。我个人喜欢用Rails的方式做事。这就是我需要帮助的地方,我在Rails4中有

  9. ruby-on-rails - Web 应用程序中的 API 版本控制 - 2

    我目前正在为一个新网站设计版本化的API。我了解如何为路由命名空间,但我一直坚持在模型中实现版本化方法的最佳方式。下面的代码示例使用的是rails框架,但是事情的原理在大多数web框架之间应该是一致的。目前的路线看起来像这样:MyApp::Application.routes.drawdonamespace:apidonamespace:v1doresources:products,:only=>[:index,:show]endendend和Controller:classApi::V1::ProductsController很明显,我们只是在此处公开Product上可用的属性,如果

  10. ruby-on-rails - Ruby/Rails 和 Sharepoint Web 服务 - 2

    我正在尝试使用ruby​​来使用Sharepoint网络服务。我基本上已经放弃尝试使用NTLM进行身份验证,并暂时将Sharepoint服务器更改为使用基本身份验证。我已成功使用soap4r获得WSDL,但在尝试使用实际Web服务调用时仍然无法进行身份验证。有没有人有过让ruby​​和Sharepoint对话的经验? 最佳答案 我是个新手。但经过很多时间并在更多经验编码人员的帮助下,我能够让ruby​​与Sharepoint2010一起工作。下面的代码需要“ntlm/mechanize”gem。我已经能够使用列表GUID和ListV

随机推荐