以太坊 JavaScript 库:web3.js 与 ethers.js 比较(第一部分)

Web3.js和ethers.js都是JavaScript库,其作用是使开发者可以与以太坊区块链交互。这两个库都很实用,都能满足大多数以太坊开发者的需求。本文将重点围绕web3.js和ethers.js的相同点和不同点来对它们进行比较,以便你能更好地理解它们的细微区别。本文的目的是帮助开发者理解两个库的优缺点,以便能够决定哪个库适合其具体用例。本文中提供了一些资源,可能对刚接触区块链开发的用户有用。

一言以蔽之:两个库都有用,针对你的使用场景不同,总有一个库更加适合你(编者注:登链社区对2个文案均有翻译,web3.js中文文档地址:https://learnblockchain.cn/docs/web3.js/),ethers.js中文文档地址:https://learnblockchain.cn/docs/ethers.js/。

Web3.js拥有一个与以太坊基金会相关的用户和维护者社区。它提供实用的API参考。从大约2015年开始,它在许多项目中被广泛使用。因此,该库已经成为许多“构建去中心化应用新手入门”教程的“必备资源”。

Ethers.js的优势之处在于紧凑小巧,同时又包含大量测试案例。它提供实用的“新手入门”文档,因此新用户也可使用。许多开发者评价ethers.js使用起来“简单”、“直观”,并且该库在近两年越来越受欢迎,下载量和在项目中的使用量也不断增加。

什么是web3.js?

web3.js库是由以太坊基金会构建的开源JavaScript库,包括通过JavaScript对象表示法-RemoteProcedureCall(JSON-RPC)协议与以太坊节点进行通信的函数。也就是说,它是一个支持开发者与以太坊区块链进行交互的JavaScript库。Web3.js最新版本为1.2.9,在本文中将引用该版本。Web3.js由四个模块组成。

什么是模块?

在JavaScript中,模块是在更大的程序中具有特定功能的代码。模块应该具有独立性,即如果将某个模块从库、程序或应用中移除,整个库、程序或应用应该不会停止运行。熟悉python或java的用户可能也熟悉“类”,它与模块类似。FreeCodeCamp对JavaScript模块进行了详细解释,应该对于刚接触JavaScript的用户有用。

web3.js由哪些模块组成?

Web3.js有一个主类,称为web3。在该类中可以找到该库的大多数功能。组成web3js的另外5个模块分别是:

web3-eth

web3-shh

web3-bzz

web3-net

以太坊客户端Nethermind推迟V1.18版本更新,以维持上海升级时的稳定性:3月31日消息,以太坊核心开发者?ukasz Rozmej在推特上表示:“我们把以太坊客户端Nethermind V1.18版本推迟到上海之后,只是为了在分叉上有最好的稳定性。V1.18版本将会很大,有很多非常重要的改进和修复。”[2023/3/31 13:37:30]

web3-utils

web3-eth有什么作用?

web3-eth模块中包含函数,其作用是使web3.js的用户可以与以太坊区块链进行交互。具体来说,这些函数能够与智能合约、归外部所有的账户、节点、挖出的区块以及交易进行交互。下面是三个说明示例:

_web3.eth.getBalance_的作用是获得指定区块的某个地址的以太坊余额

_web3.eth.signTransaction_的作用是对交易签名

_web3.eth.sendSignedTransaction_的作用是将签名的交易发送到以太坊区块链。

web3-shh有什么作用?

web3-shh模块的作用是使你可以与Whisper协议进行交互。Whisper是一个消息传输协议,其目的是轻松广播消息以及进行低层异步通信。下面显示了两个说明性示例:

_web3.shh.post_将whisper消息发布到网络

_web3.shh.subscribe_创建传入的whisper消息订阅

web3-bzz有什么作用?

web3-bzz模块的作用是使你可以与Swarm交互。Swarm是一个去中心化存储平台和内容分发服务,它可以用来为去中心化应用存储图片或视频等文件。下面显示了两个说明性示例:

_web3.bzz.upload_的作用是使你可以将文件和文件夹上传到Swarm

_Web3.bzz.download_的作用是使你可以从Swarm下载文件和文件夹

web3-net有什么作用?

web3-net模块的作用是使你可以与以太坊节点的网络属性进行交互。通过web3-net,你可以采用你需要获得的信息所关联的协议后加.net来查找该节点的相关信息。下面显示了两个说明性示例:

web3.*.net.getID返回网络ID

web3.*.net.getPeerCount返回连接到节点的对等点数

web3-utils有什么作用?

web3-utils模块为你提供实用程序函数,这些函数可在以太坊去中心化应用以及其他web3.js模块中使用。实用程序函数可以重复使用,使代码编写更轻松,在JavaScript和其他编程语言中很常见。Web3-utils包含实用程序函数,这些函数用于转换数字、验证值是否满足特定条件以及搜索数据集。下面显示了三个说明性示例:

以太坊链上NFT销售总额突破270亿美元 创历史新高:金色财经报道,据最新数据显示,以太坊链上NFT销售总额突破270亿美元,创下历史新高,本文撰写时为27,017,730,980 美元,链上交易数量为10,064,355笔。 据历史数据显示,以太坊链上NFT销售总额在2022年1月7日突破130亿美元,这意味着在四个月时间里,以太坊链上NFT总销售额增长超过140亿美元,涨幅超过100%。[2022/5/19 3:27:13]

_web3.utils.toWei_将以太转换为Wei

_web3.utils.hexToNumberString_将十六进制值转换为字符串

web3.utils.isAddress,校验特定字符串是否为有效的以太坊地址。

什么是ethers.js?

Ethers.js是一个JavaScript库,其作用是使开发者可以与以太坊区块链进行交互。该库包含JavaScript和TypeScript中的实用程序函数,以及以太坊钱包的所有功能。Ethers.js的最新版本为5.0.3。Ethers.js是通过Ethers创建的,是采用MIT许可证的开放源。

与web3.js相似,ethers.js有四个模块,构成应用程序编程界面(API)。

Ethers.provider

Ethers.contract

Ethers.utils

Ethers.wallets

ethers.provider有什么作用?

Ethers.provider的作用是封装与以太坊区块链的连接。它可以用于签发查询和发送已签名的交易,这将改变区块链的状态。下面显示了三个说明性示例:

_ethers.providers.InfuraProvider_的作用是使你可以与Infura托管的以太坊节点网络建立连接

_ethers.provider.getBalance_将为你获取区块链中某个地址或区块的以太坊余额

_ethers.provider.resolve_将解析传递到以太坊地址的以太坊名称服务(ENS)名称。

注:_web3.js_也有服务于此目的的提供商,位于_web3_基础模块中。_Ethers.js_和_web3.js_的组织方式截然不同,因此尽管两个库的功能非常相似,但模块间并非总是能清晰对应。

ethers.contract有什么作用?

Ethers.contract的作用是部署智能合约并与它交互。具体来说,该模块中的函数用于侦听从智能合约发射的事件、调用智能合约提供的函数、获取有关智能合约的信息,以及部署智能合约。下面显示了两个说明性示例:

以太坊未确认交易为157,961笔:金色财经消息,据OKLink数据显示,以太坊未确认交易157,961笔,当前全网算力为509.23TH/s,全网难度为6.87P,当前持币地址为61,286,655个,同比增加52,850个,24h链上交易量为2,109,061.12ETH,当前平均出块时间为13s。[2021/7/26 1:16:34]

_ethers.ContractFactory.fromSolidity_从Solidity编译器的编译器输出或从Truffle生成的JSON文件创建一个用于部署智能合约的“工厂”。_ethers.Contract_使你可以与已部署的智能合约进行交互。ethers.utils有什么作用?

Ethers.utils提供用于格式化数据和处理用户输入的实用程序函数。Ethers.utils的作用方式与web3-utils相似,能够简化去中心化应用的构建流程。下面提供了三个示例:

_ethers.utils.getContractAddress_从用于部署智能合约的交易中提取智能合约地址

_ethers.utils.computeAddress_通过传递与地址相关的公钥或私钥的函数来计算地址_ethers.utils.formatEther_将所传递的Wei金额转换为Ether十进制字符串格式

ethers.wallet有什么作用?

Ethers.wallet提供的功能与我们目前讨论过的其他模块截然不同。Ethers.wallet的作用是使你可以与现有钱包建立连接、创建新钱包以及对交易签名。下面提供了三个示例:

_ethers.wallet.createRandom_将创建随机新账户。

_ethers.wallet.sign_将对交易签名并将已签名的交易返回为十六进制字符串的形式。

_ethers.wallet.getBalance_将为我们提供钱包地址的以太坊余额。

Web3.js在web3.eth模块中有一个类似的包,称为web3.eth.accounts。但是,在该包的文档中有如下说明:“该包未经审核,可能不安全。在用于生产环境之前,请注意妥善清除内存,安全存储私钥,并适当测试交易接收和发送功能!”

web3.js还是ethers.js?

我如何确定在去中心化应用中到底应该使用web3.js还是ethers.js呢?两者有何区别?

首先,如果你要基于样板应用或教程开发,则使用该样板或教程建议你使用的库,不管是web3.js还是ethers.js。这将为你省去不少麻烦,让你可以更好地跟着教程操作。请务必使用教程指定的web3.js或ethers.js版本。有许多教程没有更新,不要想当然地认为你可以使用最新版本的库,除非教程中具体说明。

以太坊ZK Rollup扩容方案Hermez上线USDT:Hermez Network上线USDT稳定币。通过在Hermez上推出USDT,以太坊上的Gas费压力有望减轻。此前消息,以太坊ZK Rollup扩容方案Hermez Network正式上线。这意味着Hermez的主网已经启动,用户现在可以以更低的Gas成本转账。(Cointelegraph)[2021/4/19 20:36:52]

如果你要从零开始构建应用并确定需要使用的库,我们有一个使用评估流程,下面列出了9个问题。在确定哪个库适合你时应该思考这些问题。此外还提供了一些上下文和信息以帮助你回答这些问题。

库的受欢迎程度有多重要?“在Github上受欢迎的项目正如你所料。也就是说,有许多人提问、参与和支持。这些活动能让软件更加可靠。通过查看任何一个项目的加星数、已发布的问题数量、处理中的拉取请求以及项目的参与者数量,可以确定它的受欢迎程度。”

截止到撰写本博客时,Web3.js获得了近8,800颗星,而ethers.js获得了近1,500颗星。在GitHub上使用web3.js的资源库有51,300个,而使用ethers.js的有18,500个。Web3.js存在的时间更长,这也是web3.js更受欢迎的原因之一。

库的维护有多重要?我们希望自己使用的库能够频繁更新,以修复错误和添加新功能。尽管不完美,但通过查看一两个月期间的提交数、已解决的问题数、正在处理的问题数以及维护者数,可了解开源项目的优势和弱点。用户从中也能看到库的维护模式,了解库一般有哪些更新并修复了哪些错误,并以此作为判断库维护情况的代理指标。我们来查看两个库在GitHub上的每月动态,以了解它们的统计数据。

ethers.js的维护者只有一人—RichardMoore,他完成的提交数和已解决的问题数相当惊人,值得称赞。Web3.js有12位维护者,绝大多数提交数都是由其中三人完成的。在这方面没有明显的胜负差异,但在选择库时应注意,这些统计数据可以帮助你确定,在维护性方面你最看重哪些,并根据你的需求确定库的优先性。

库的开发负责人是谁?使用库的项目有多少个?Web3.js是以太坊基金会的一个项目。以太坊基金会是一个非营利性组织,致力于协议层开发的研究和组织。Ethers.js的目的是建立“一个完整、简单、小巧的库,取代web3和ethereum.js”。Ethers.js的开发者是RichardMoore,并由他来创建和维护库。

有些项目公开声明了他们使用的是哪个库,我们认为从这些数据中可以看出两个库受欢迎的程度都很高。查看web3.js和ethers.js依赖图,以了解你信任的项目使用的是哪个库,或者他们是否同时使用/支持两个库。

以太坊钱包Argent高危漏洞已被修复:6月20日消息,针对以太坊钱包Argent出现高危漏洞一事,安全审计公司OpenZeppelin表示,Argent很快修复了该漏洞并更新了易受攻击的智能合约,其用户资金现在很安全。(Decrypt)[2020/6/21]

库具有测试有多重要?如果预编写的测试对你的项目来说很重要,那么从历史数据来看,ethers.js胜。截至撰写本文时止,Ethers.js已经在Github上发布了3.0发行版的清晰测试文档,但还没有为5.0发行版更新该文档。Web3.js在测试文档方面稍逊一筹。如果ethers.js在接下来几周更新测试文档,那么在测试和测试文档方面将继续保持优胜地位。到目前为止尚无定论,因为ethers.js它测试套件至今似乎还未更新。

库的下载量有多重要?由于web3.js存在的时间更长,因此它的下载量超过了ethers.js的下载量,但是如果查看周下载量,ethers.js超过了web3.js,因此目前的下载次数更加频繁。Ethers.js的近期下载量更高,而web3.js的总下载量更高。

Web性能有多重要?如果web性能对你来说非常重要,则我们认为ethers.js库的性能更加优越。ethers.js库声称未压缩大小为284kb,而在NPM上列出的解压缩大小为3.5MB。Web3.js至少大一个数量级,解压缩大小为10.6MB。考虑到ethers.js比web3.js更加小巧,因此推测使用ethers.js的应用程序比使用web3.js的相同应用程序加载速度更快。这是因为不管使用什么库,它都会和构成web应用程序的其他资源一起加载。我们没有使用web3.js和ethers.js分别对完全相同的应用程序测试加载速度,因此在这一点上应该持保留态度。如果数据量大小对应用程序会有影响,则数据量较小的ethers.js库会有优势。

文档质量有多重要?文档质量是一个主观性指标,但评估文档质量的其中一种方式是阅读文档,看它的阅读难易程度如何。最理想的情况是,编写的文档能够让新用户理解如何使用库。文档在结构安排上也应该能够让资深用户快速找到他们需要查找的内容。

Web3.js具有广泛而相当实用的API参考。这是文档最重要的部分。“新手入门”材料较为简单,这可能会深受资深用户的欢迎,但适合web3.js新用户使用的材料很少。

Ethers.js包括“新手入门”部分以及拓展性API参考。这些材料非常实用,使得ethers.js相对于web3.js具有优势,尤其是对以太坊生态系统中的入门级开发者而言。针对ethers.js的文档中有一些不完整的部分,这对用户来说很不方便。Ethers.js还清晰地介绍了使用ethers.js的优势。

两个库的文档都存在不足之处,因此如果文档对你来说很重要,请花一些时间来了解并确定哪个库提供了充分的信息来帮助你实现你需要构建的特性。

库的总使用量有多重要?由于web3.js存在的时间更长,因此具有更高的下载量和GitHub加星数,而ethers.js在受欢迎程度上有所上升。最终应该由你自己来决定库的哪些方面对你的用例最重要。

许可证有多重要?根据你的具体用例,开源软件许可证对你来说可能很重要。Web3.js有LGPLv3许可证,ethers.js有MIT许可证。联系关于该主题的法律专家可以获取有关许可证的更多详细信息。但是,SlavaTodavchich在文章“了解开源和免费软件许可”中针对该主题进行了生动有趣的阐述。

结论

正如我们开篇就已指出,两个库都能够完成任务。Ethers.js在近两年来越来越受欢迎,下载量和项目使用量都不断增加。Web3.js一直以来都作为标杆存在,并且仍然拥有许多开发者共享资源。

请关注第二部分。我们将发布一份跟进教程,介绍如何连接到_InfuraAPI_并使用_web3.js_和_ethers.js_发送交易。

参考资料

web3.js中文文档:https://learnblockchain.cn/docs/web3.js/

ethers.js中文文档:https://learnblockchain.cn/docs/ethers.js/

对JavaScript模块进行了详细解释:https://www.freecodecamp.org/news/javascript-modules-a-beginner-s-guide-783f7d7a5fcc/

Whisper:https://geth.ethereum.org/docs/whisper/whisper-overview

Swarm:https://ethersphere.github.io/swarm-home/

Ethers:https://ethers.io/

承诺:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise

承诺:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise

web3.js:https://github.com/ethereum/web3.js/pulse/monthly

ethers.js:https://github.com/ethers-io/ethers.js/pulse/monthly

以太坊基金会:https://ethereum.org/en/

“一个完整、简单、小巧的库,取代web3和ethereum.js”:https://www.youtube.com/watch?v=P-UzQTDfdXY

web3.js:https://github.com/ethereum/web3.js/network/dependents

ethers.js:https://github.com/ethers-io/ethers.js/network/dependents?package_id=UGFja2FnZS0xNjEzMjI4Ng==

在Github上发布了3.0发行版的清晰测试文档:https://github.com/ethers-io/ethers.js/tree/master/docs

截至5月20日止为14,703,432次:https://npm-stat.com/charts.html?package=web3&from;=2015-01-01&to;=2020-05-20

截至5月20日止为8,500,336次:https://npm-stat.com/charts.html?package=ethers&from;=2015-01-01&to;=2020-05-20

184,798:https://www.npmjs.com/package/ethers

175,661:https://www.npmjs.com/package/web3

ethers.js库声称未压缩大小为284kb:https://docs.ethers.io/v5/

解压缩大小为3.5MB:https://www.npmjs.com/package/ethers

解压缩大小为10.6MB:https://www.npmjs.com/package/web3

API参考:https://web3js.readthedocs.io/en/v1.2.9/web3.html

“以太坊基本介绍”部分:https://docs.ethers.io/v5/concepts/events/

NPM:https://www.npmjs.com/package/web3

了解开源和免费软件许可:https://medium.com/@moqod_development/understanding-open-source-and-free-software-licensing-c0fa600106c9

InfuraAPI:https://infura.io/dashboard

本文来源于非小号媒体平台:

登链社区

现已在非小号资讯平台发布105篇作品,

非小号开放平台欢迎币圈作者入驻

入驻指南:

/apply_guide/

本文网址:

/news/9558543.html

免责声明:

1.资讯内容不构成投资建议,投资者应独立决策并自行承担风险

2.本文版权归属原作所有,仅代表作者本人观点,不代表非小号的观点或立场

上一篇:

币安为何推出第三条链?这对BNB意味着什么?

郑重声明: 本文版权归原作者所有, 转载文章仅为传播更多信息之目的, 如作者信息标记有误, 请第一时间联系我们修改或删除, 多谢。

银河链

[0:124ms0-1:501ms