Ether.js和Web3.js的比较

每个可编程区块链都有一组 SDK 或库,可帮助与特定区块链进行连接和通信。今天的大多数区块链都依赖于以太坊网络,使其与 EVM 兼容。这意味着如果创建了一个 ETH 库,它就可以在任何 EVM 兼容的区块链上使用。但是,可以使用 JSON-RPC 协议进行通信。

在本文中,我们将比较两个流行的 ETH 库。您将了解它们之间的区别、优缺点。这也可以帮助您作为首席技术官 (CTO) / 团队负责人决定在未来的项目中使用什么库。

用于区块链的 JavaScript

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

想象一下,你需要解决一个特定的问题,而你唯一知道的语言是 JavaScript。如果可以使用 JavaScript 来解决这个问题而不是学习一门新的高级语言,岂不是更容易?许多开发人员都遇到了这个障碍,并找到了通过构建可以通过提供商连接到区块链的 SDK/库来使用 JavaScript 构建 dApp 的方法。然而,这降低了在区块链空间中构建的入门级别。您无需学习 Rust 和 Solidity 等高级语言即可为Solana以太坊链构建。

此外,降低区块链开发的入门级也是JavaScript的主要作用之一。

什么是 Ethers.js

自ethers.js成立以来,它经历了稳定的增长,并成为以太坊开发人员中最常用的基于 JavaScript 的 web3 开发库之一。
该工具可帮助 Javascript 开发人员与以太坊链和任何以太坊虚拟机 (EVM) 兼容的区块链进行交互。

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

Ethers.js 以轻量级着称。它管理密钥和与区块链交互的方式使其与众不同。在 ethers.js 中,两个实体处理上述内容:

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

    Ethers.js 的优势

  • 库大小:Ethers.js 压缩后为 88KB,未压缩时为 284KB。

  • ENS:ENS 就像区块链中的 DNS。无论在哪里使用以太坊地址,.eth 地址也可以在那里使用。您无需样板代码即可轻松设置域名。

  • 测试用例:Ethers.js 经过充分测试。Richard Moore 自己编写了其中的大部分测试用例,而 Ethers.js 有超过 10,000 个测试用例。

  • 许可证:Ethers.js 在 MIT 许可证下获得许可,允许免费使用和修改。但是,如果您将 Ethers.js 用作库并将其链接到更大的程序,则衍生作品必须在 LGPL-3.0 许可下发布。

  • 性能:考虑到体积小,在前端使用它是个好主意,因为它会大大提高性能。

Ether.js 的缺点

  • Ethers.js 相对较新,如果遇到问题,在 StackOverflow 等地方寻找答案可能还不够。

  • 许多基础公司现在将 Web3.js 用于其核心项目,如果你需要为这些公司工作,你可能需要花一些时间学习 web3.js。

Ethers.js 模块

Ethers.js 有四 (4) 个模块,它们是 Ethers.js API 的核心。

  • Ethers.Provider:要了解模块的作用,了解什么是节点Ethers.Provider 很重要 。要访问区块链网络,您需要在您的机器上运行一个节点来访问它。该节点连接到其他节点以检查人与人之间的交易是否有效,同时它存储有关区块链状态的信息。区块链完全由节点构建或组成。这些节点由世界各地的个人运行,这意味着没有中央服务器或单一事实来源。这就是它去中心化的原因。将节点想象成汽车的汽油;如果为空,它将不会启动。节点可能很难设置;事实上,这可能需要长达一周或更长时间,但像炼金术这样的供应商,infuraQuicknode存在。他们为你设置了节点,他们只需要你建立连接,你就可以访问区块链。

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

  • Ethers.utils:这个模块可以帮助你格式化数据,比如钱包的余额数字,并处理其他用户输入。在下面的代码中,从钱包中获取地址后,我们检索钱包的余额,但由于返回值以 Wei 格式输出,因此我们使用 来.formatEther使其更具可读性。

<span style="color:var(--syntax-text-color)"><span style="color:var(--syntax-text-color)"><code><span style="color:var(--syntax-declaration-color)">const</span> <span style="color:var(--syntax-name-color)">accountChangedHandler</span> <span style="color:var(--syntax-error-color)">=</span> <span style="color:var(--syntax-declaration-color)">async</span> <span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-name-color)">newAccount</span><span style="color:var(--syntax-text-color)">)</span> <span style="color:var(--syntax-error-color)">=></span> <span style="color:var(--syntax-text-color)">{</span>
        <span style="color:var(--syntax-declaration-color)">const</span> <span style="color:var(--syntax-name-color)">address</span> <span style="color:var(--syntax-error-color)">=</span> <span style="color:var(--syntax-declaration-color)">await</span> <span style="color:var(--syntax-name-color)">newAccount</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-name-color)">getAddress</span><span style="color:var(--syntax-text-color)">();</span>
        <span style="color:var(--syntax-name-color)">setDefaultAccount</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-name-color)">address</span><span style="color:var(--syntax-text-color)">);</span>
        <span style="color:var(--syntax-declaration-color)">const</span> <span style="color:var(--syntax-name-color)">balance</span> <span style="color:var(--syntax-error-color)">=</span> <span style="color:var(--syntax-declaration-color)">await</span> <span style="color:var(--syntax-name-color)">newAccount</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-name-color)">getBalance</span><span style="color:var(--syntax-text-color)">()</span>
        <span style="color:var(--syntax-name-color)">setUserBalance</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-name-color)">ethers</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-name-color)">utils</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-name-color)">formatEther</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-name-color)">balance</span><span style="color:var(--syntax-text-color)">));</span>
        <span style="color:var(--syntax-declaration-color)">await</span> <span style="color:var(--syntax-name-color)">getuserBalance</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-name-color)">address</span><span style="color:var(--syntax-text-color)">)</span>
    <span style="color:var(--syntax-text-color)">}</span>
</code></span></span>
  • Ethers.Wallet:此模块允许您连接到现有地址。但是,您可以无缝地签署和创建新钱包。

开发者会话回放

使用OpenReplay(一个面向开发人员的开源会话重播套件) 以前所未有的方式发现挫折、了解错误和修复减速。它可以在几分钟内自行托管,让您完全控制您的客户数据


调试愉快!立即尝试使用 OpenReplay。

什么是 Web3.js

Web3.js是一个流行的基于 JavaScript 的库,将客户端连接到区块链。该库使用 HTTP、IPC 或 Websockets 运行本地或远程以太坊节点并与之交互。
Web3.js 于 2015 年发布;它是由以太坊基金会创建的开源库。这意味着它拥有最大的社区,与一年后发布的 Ethers.js 不同。Web3.js 库是比任何其他库都多的项目和包的一部分。

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

web3.js 的优势

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

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

Web3.js 的缺点

  • 大小:Web3.js 比 Ethers.js 相对较大,这使得在前端使用它是不可取的,因为它会降低网站的性能。
  • 灵活性:由于 Ethers.js 中的密钥是通过关注点分离来处理的,这允许开发人员以不同的方式处理密钥的存储和管理,因此 web3.js 在这方面存在不足。
  • 许可证:Web3.js 在更严格的许可证下工作,如果不首先公开发布,则不允许修改。

Web3.js 模块

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

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

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

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

  • Web3.bzz :此模块允许您与Swarm 网络进行交互

Web3.js 和 Ethers.js 的比较

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

  • 按代码比较
  • 开发者经验
  • 人气
  • 文档
  • 使用方便
  • 表现
  • 维护

按代码比较

为了完成这一部分,我们需要编写一个程序,使用这两个库在区块链网络上发送交易。
要运行此项目,您必须具备以下条件

  • 节点 16 及以上。
  • metasMask 扩展(创建一个帐户)。
  • 像 infura 这样的节点提供商(创建一个帐户)。

  • 使用 Ethers.js 发送交易:要使用 ethers.js 通过以太坊区块链发送交易,请将以下代码复制到您的index.js文件中:

<span style="color:var(--syntax-text-color)"><span style="color:var(--syntax-text-color)"><code>
<span style="color:var(--syntax-declaration-color)">const</span> <span style="color:var(--syntax-name-color)">ethers</span> <span style="color:var(--syntax-error-color)">=</span> <span style="color:var(--syntax-name-color)">require</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-string-color)">'</span><span style="color:var(--syntax-string-color)">ethers</span><span style="color:var(--syntax-string-color)">'</span><span style="color:var(--syntax-text-color)">);</span>
<span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-declaration-color)">async</span><span style="color:var(--syntax-text-color)">()</span><span style="color:var(--syntax-error-color)">=></span><span style="color:var(--syntax-text-color)">{</span>
    <span style="color:var(--syntax-declaration-color)">const</span> <span style="color:var(--syntax-name-color)">provider</span> <span style="color:var(--syntax-error-color)">=</span> <span style="color:var(--syntax-declaration-color)">new</span> <span style="color:var(--syntax-name-color)">ethers</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-name-color)">providers</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-name-color)">JsonRpcProvider</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-string-color)">"</span><span style="color:var(--syntax-string-color)">https://goerli.infura.io/v3/private key</span><span style="color:var(--syntax-string-color)">"</span><span style="color:var(--syntax-text-color)">);</span>
    <span style="color:var(--syntax-declaration-color)">const</span> <span style="color:var(--syntax-name-color)">gasPrice</span> <span style="color:var(--syntax-error-color)">=</span> <span style="color:var(--syntax-name-color)">provider</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-name-color)">getGasPrice</span><span style="color:var(--syntax-text-color)">()</span>
    <span style="color:var(--syntax-declaration-color)">const</span> <span style="color:var(--syntax-name-color)">wallet</span> <span style="color:var(--syntax-error-color)">=</span> <span style="color:var(--syntax-name-color)">ethers</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-name-color)">Wallet</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-name-color)">fromMnemonic</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-string-color)">'</span><span style="color:var(--syntax-string-color)">your Mnemonics</span><span style="color:var(--syntax-string-color)">'</span><span style="color:var(--syntax-text-color)">);</span>
    <span style="color:var(--syntax-declaration-color)">const</span> <span style="color:var(--syntax-name-color)">signer</span> <span style="color:var(--syntax-error-color)">=</span> <span style="color:var(--syntax-name-color)">wallet</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-name-color)">connect</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-name-color)">provider</span><span style="color:var(--syntax-text-color)">);</span>

    <span style="color:var(--syntax-declaration-color)">const</span> <span style="color:var(--syntax-name-color)">receiver</span> <span style="color:var(--syntax-error-color)">=</span> <span style="color:var(--syntax-string-color)">"</span><span style="color:var(--syntax-string-color)">0x8dC847Af872947Ac18d5d63fA646EB65d4D99560</span><span style="color:var(--syntax-string-color)">"</span>
    <span style="color:var(--syntax-declaration-color)">const</span> <span style="color:var(--syntax-name-color)">trt</span> <span style="color:var(--syntax-error-color)">=</span> <span style="color:var(--syntax-text-color)">{</span>
        <span style="color:var(--syntax-name-color)">from</span><span style="color:var(--syntax-text-color)">:</span> <span style="color:var(--syntax-name-color)">wallet</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-name-color)">address</span><span style="color:var(--syntax-text-color)">,</span>
        <span style="color:var(--syntax-name-color)">to</span><span style="color:var(--syntax-text-color)">:</span> <span style="color:var(--syntax-name-color)">receiver</span><span style="color:var(--syntax-text-color)">,</span>
        <span style="color:var(--syntax-name-color)">value</span><span style="color:var(--syntax-text-color)">:</span>  <span style="color:var(--syntax-name-color)">ethers</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-name-color)">utils</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-name-color)">parseUnits</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-string-color)">'</span><span style="color:var(--syntax-string-color)">0.001</span><span style="color:var(--syntax-string-color)">'</span><span style="color:var(--syntax-text-color)">,</span> <span style="color:var(--syntax-string-color)">'</span><span style="color:var(--syntax-string-color)">ether</span><span style="color:var(--syntax-string-color)">'</span><span style="color:var(--syntax-text-color)">),</span>
        <span style="color:var(--syntax-name-color)">gasPrice</span><span style="color:var(--syntax-text-color)">:</span> <span style="color:var(--syntax-name-color)">gasPrice</span>
    <span style="color:var(--syntax-text-color)">}</span> 
    <span style="color:var(--syntax-declaration-color)">const</span> <span style="color:var(--syntax-name-color)">sendTransaction</span> <span style="color:var(--syntax-error-color)">=</span> <span style="color:var(--syntax-declaration-color)">await</span> <span style="color:var(--syntax-name-color)">signer</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-name-color)">sendTransaction</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-name-color)">trt</span><span style="color:var(--syntax-text-color)">);</span>
    <span style="color:var(--syntax-name-color)">console</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-name-color)">log</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-name-color)">sendTransaction</span><span style="color:var(--syntax-text-color)">);</span>
<span style="color:var(--syntax-text-color)">})();</span>
</code></span></span>
  • 使用 Web3.js 发送交易:要使用 Web3.js 通过以太坊区块链发送交易,请将以下代码复制到您的index.js文件中:
<span style="color:var(--syntax-text-color)"><span style="color:var(--syntax-text-color)"><code><span style="color:var(--syntax-declaration-color)">var</span> <span style="color:var(--syntax-name-color)">Web3</span> <span style="color:var(--syntax-error-color)">=</span> <span style="color:var(--syntax-name-color)">require</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-string-color)">'</span><span style="color:var(--syntax-string-color)">web3</span><span style="color:var(--syntax-string-color)">'</span><span style="color:var(--syntax-text-color)">);</span>
<span style="color:var(--syntax-declaration-color)">async</span> <span style="color:var(--syntax-declaration-color)">function</span> <span style="color:var(--syntax-name-color)">main</span><span style="color:var(--syntax-text-color)">()</span> <span style="color:var(--syntax-text-color)">{</span>
    <span style="color:var(--syntax-declaration-color)">const</span> <span style="color:var(--syntax-name-color)">private_key</span> <span style="color:var(--syntax-error-color)">=</span> <span style="color:var(--syntax-string-color)">'</span><span style="color:var(--syntax-string-color)">private_key</span><span style="color:var(--syntax-string-color)">'</span><span style="color:var(--syntax-text-color)">;</span>
    <span style="color:var(--syntax-declaration-color)">var</span> <span style="color:var(--syntax-name-color)">web3</span> <span style="color:var(--syntax-error-color)">=</span> <span style="color:var(--syntax-declaration-color)">new</span> <span style="color:var(--syntax-name-color)">Web3</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-string-color)">'</span><span style="color:var(--syntax-string-color)">https://goerli.infura.io/v3/secret key</span><span style="color:var(--syntax-string-color)">'</span><span style="color:var(--syntax-text-color)">);</span>
    <span style="color:var(--syntax-declaration-color)">const</span> <span style="color:var(--syntax-name-color)">fromAdress</span> <span style="color:var(--syntax-error-color)">=</span> <span style="color:var(--syntax-string-color)">'</span><span style="color:var(--syntax-string-color)">0xF63576c9369a87D74d84C49895581a6B1E412D31</span><span style="color:var(--syntax-string-color)">'</span><span style="color:var(--syntax-text-color)">;</span> 
    <span style="color:var(--syntax-declaration-color)">const</span> <span style="color:var(--syntax-name-color)">nonce</span> <span style="color:var(--syntax-error-color)">=</span> <span style="color:var(--syntax-declaration-color)">await</span> <span style="color:var(--syntax-name-color)">web3</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-name-color)">eth</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-name-color)">getTransactionCount</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-name-color)">fromAdress</span><span style="color:var(--syntax-text-color)">,</span> <span style="color:var(--syntax-string-color)">'</span><span style="color:var(--syntax-string-color)">latest</span><span style="color:var(--syntax-string-color)">'</span><span style="color:var(--syntax-text-color)">);</span> 
    <span style="color:var(--syntax-declaration-color)">const</span> <span style="color:var(--syntax-name-color)">transaction</span> <span style="color:var(--syntax-error-color)">=</span> <span style="color:var(--syntax-text-color)">{</span>
     <span style="color:var(--syntax-string-color)">'</span><span style="color:var(--syntax-string-color)">to</span><span style="color:var(--syntax-string-color)">'</span><span style="color:var(--syntax-text-color)">:</span> <span style="color:var(--syntax-string-color)">'</span><span style="color:var(--syntax-string-color)">0xc419E0B31A46d3071e336E062676352637428500</span><span style="color:var(--syntax-string-color)">'</span><span style="color:var(--syntax-text-color)">,</span> 
     <span style="color:var(--syntax-string-color)">'</span><span style="color:var(--syntax-string-color)">value</span><span style="color:var(--syntax-string-color)">'</span><span style="color:var(--syntax-text-color)">:</span><span style="color:var(--syntax-name-color)">web3</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-name-color)">utils</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-name-color)">toWei</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-string-color)">'</span><span style="color:var(--syntax-string-color)">0.01</span><span style="color:var(--syntax-string-color)">'</span><span style="color:var(--syntax-text-color)">,</span> <span style="color:var(--syntax-string-color)">'</span><span style="color:var(--syntax-string-color)">ether</span><span style="color:var(--syntax-string-color)">'</span><span style="color:var(--syntax-text-color)">),</span>
     <span style="color:var(--syntax-string-color)">'</span><span style="color:var(--syntax-string-color)">gas</span><span style="color:var(--syntax-string-color)">'</span><span style="color:var(--syntax-text-color)">:</span> <span style="color:var(--syntax-literal-color)">30000</span><span style="color:var(--syntax-text-color)">,</span>
     <span style="color:var(--syntax-string-color)">'</span><span style="color:var(--syntax-string-color)">nonce</span><span style="color:var(--syntax-string-color)">'</span><span style="color:var(--syntax-text-color)">:</span> <span style="color:var(--syntax-name-color)">nonce</span><span style="color:var(--syntax-text-color)">,</span>
    <span style="color:var(--syntax-text-color)">};</span>
    <span style="color:var(--syntax-declaration-color)">const</span> <span style="color:var(--syntax-name-color)">signedTrans</span> <span style="color:var(--syntax-error-color)">=</span> <span style="color:var(--syntax-declaration-color)">await</span> <span style="color:var(--syntax-name-color)">web3</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-name-color)">eth</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-name-color)">accounts</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-name-color)">signTransaction</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-name-color)">transaction</span><span style="color:var(--syntax-text-color)">,</span> <span style="color:var(--syntax-name-color)">private_key</span><span style="color:var(--syntax-text-color)">);</span>
 <span style="color:var(--syntax-name-color)">web3</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-name-color)">eth</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-name-color)">sendSignedTransaction</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-name-color)">signedTrans</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-name-color)">rawTransaction</span><span style="color:var(--syntax-text-color)">,</span> <span style="color:var(--syntax-declaration-color)">function</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-name-color)">error</span><span style="color:var(--syntax-text-color)">,</span> <span style="color:var(--syntax-name-color)">hash</span><span style="color:var(--syntax-text-color)">)</span> <span style="color:var(--syntax-text-color)">{</span>
    <span style="color:var(--syntax-declaration-color)">if</span> <span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-error-color)">!</span><span style="color:var(--syntax-name-color)">error</span><span style="color:var(--syntax-text-color)">)</span> <span style="color:var(--syntax-text-color)">{</span>
      <span style="color:var(--syntax-name-color)">console</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-name-color)">log</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-string-color)">"</span><span style="color:var(--syntax-string-color)">The hash of your transaction is: </span><span style="color:var(--syntax-string-color)">"</span><span style="color:var(--syntax-text-color)">,</span> <span style="color:var(--syntax-name-color)">hash</span><span style="color:var(--syntax-text-color)">);</span>
    <span style="color:var(--syntax-text-color)">}</span> <span style="color:var(--syntax-declaration-color)">else</span> <span style="color:var(--syntax-text-color)">{</span>
      <span style="color:var(--syntax-name-color)">console</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-name-color)">log</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-string-color)">"</span><span style="color:var(--syntax-string-color)">❗Something went wrong while submitting your transaction:</span><span style="color:var(--syntax-string-color)">"</span><span style="color:var(--syntax-text-color)">,</span> <span style="color:var(--syntax-name-color)">error</span><span style="color:var(--syntax-text-color)">)</span>
    <span style="color:var(--syntax-text-color)">}</span>
   <span style="color:var(--syntax-text-color)">});</span>
   <span style="color:var(--syntax-name-color)">console</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-name-color)">log</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-name-color)">signedTrans</span><span style="color:var(--syntax-text-color)">);</span>
<span style="color:var(--syntax-text-color)">}</span>
<span style="color:var(--syntax-name-color)">main</span><span style="color:var(--syntax-text-color)">();</span>
</code></span></span>

上面提供的两个代码片段是如何使用两个不同的库在以太坊区块链上执行交易的示例:Ethers.js 和 web3.js。
下面详细对比一下两者的主要区别:

  • 语法:Ethers.js 使用更面向对象的语法,而 web3.js 使用更函数式的语法。这意味着在 Ethers.js 中,您将创建类的实例并在其上调用方法,而在 web3.js 中,您将在 web3 对象上调用函数。

  • Provider:Ethers.js 使用JsonRpcProvider类连接到以太坊节点,而 web3.js 使用Web3类。

  • 钱包:Ethers.js 使用该类Wallet创建新钱包或导入现有钱包,而 web3.js 使用该eth.accounts对象创建新钱包或导入现有钱包。

  • 签署交易:在 Ethers.js 中,signer对象用于签署交易,而在 web3.js 中,eth.accounts.signTransaction函数用于签署交易。

  • 发送交易:在Ethers.js中,调用对象的send transactionsigner方法发送交易,而在web3.js中,web3.eth.sendSignedTransaction使用函数发送交易。

  • 错误处理:在 Ethers.js 中,您可以使用 try-catch 块来处理错误,而在 web3.js 中,您可以使用回调函数来处理错误。

  • Gas Price:在 Ethers.js 中,gas price 是通过调用getGasPriceprovider 对象上的方法获得的,而在 web3.js 中,它是在 transaction 对象中定义的。

  • 单位类型:Ethers.js 有自己的实用程序来处理不同类型的单位,例如ethers.utils.parseUnits,而 web3.js 使用自己的实用程序,例如web3.utils.toWei.

  • 助记词:Ethers.js 允许从助记词创建钱包,而 web3.js 没有这个功能。

总体而言,这两个库在功能方面非常相似,但它们具有不同的语法和实用程序。两个库之间的选择将取决于个人偏好、熟悉程度和具体用例。

开发者经验

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

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

人气

  • GitHub:GitHub 上的一个热门项目,和你想象的一模一样地道。
    Web3.js 作为最流行的以太坊 JavaScript 库位居榜首,在 GitHub 上有超过 16000 个启动,但在我看来,GitHub stars 只能证明先发优势。另一方面,ethers.js 在 Git Hub 上拥有超过 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 的资助,用于使用现代 Typescript 重写 web3.js。
随着这一发展,Chainsafe 致力于带来改变,以缓解使用 Web3.js 的痛点。
根据 Chainsafe 的说法,他们计划修复的领域是:

  • 在任何项目中高效地过渡到 Typescript。
  • 完全拥有 Typescript 中的库。
  • 创建灵活统一的库版本。
  • 支持 eth2 的各种功能。

总之,Chainsafe 似乎致力于做好维护 web3.js 的工作。

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

下一步是什么

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

结论

Web3.js 和 Ethers.js 都有强大的生态系统,可用于创建极快的 dApp。
令人惊奇的是,在我对这篇文章的研究过程中,这些库已经扩展了多少并且仍在使用。我希望这能让您有所了解,并让您更清楚地选择适合工作的工具。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值