Ethereum JavaScript Libraries: web3.js vs. ethers.js (Part I)[邦訳]

*本記事はInfura公式ブログに投稿されたweb3.jsとethers.jsの比較記事を日本語に翻訳したものです。*
*原文: [Ethereum JavaScript Libraries: Web3.js vs Ethers.js: An Update(Part I)](https://blog.infura.io/ethereum-javascript-libraries-web3-js-vs-ethers-js-part-i/)*

10,000字超とあまりに長いので、読みやすいようにZennのブック形式を利用した適宜分割した形式でも投稿しました。
[Zenn版](https://zenn.dev/nft/books/410be300912936}


# Ethereum JavaScript Libraries: web3.js vs. ethers.js (Part I)

Web3.jsとethers.jsは、開発者がEthereumブロックチェーンと対話できるようにするJavaScriptライブラリです。どちらも素晴らしいライブラリで、どちらのライブラリもほとんどのEthereum開発者のニーズを満たしてくれるでしょう。この記事では、web3.jsとethers.jsを比較し、その類似点と相違点に焦点を当て、ライブラリのニュアンスをより良く理解できるようにします。この記事は、開発者が2つのライブラリのトレードオフを理解し、特定のユースケースにどちらのライブラリを使用するかを決定できるように教育することを意図して書かれています。この記事には、ブロックチェーン開発やプログラミング全般が初めての方に役立つと思われるリソースが含まれています。

TL;DR: 両方のライブラリが動作します。あなたの用途によっては、どちらかのライブラリの方がよいかもしれません。

**Web3.js**には、Ethereum Foundationに関連するユーザーとメンテナーのコミュニティがあります。APIリファレンスが充実している。2015年から存在しており、多くのプロジェクトで幅広く使用されている。この事実により、このライブラリは多くの「Build Your First dApp」チュートリアルで「御用達」になっています。

**Ethers.js**は、小さくコンパクトなライブラリでありながら、テストケースが豊富に用意されている点が優れています。また、「Getting Started」ドキュメントも充実しており、新規ユーザーにも親しみやすいものとなっています。「Ethers.jsは、過去2年間でダウンロード数が増加し、プロジェクトで使用されるようになりました。

## What is web3.js? / web3.jsとは？

![](https://storage.googleapis.com/zenn-user-upload/edf709427cf6-20220130.png)

web3.jsライブラリは、イーサリアム財団が構築したオープンソースのJavaScriptライブラリ（GNU Lesser General Public License version 3）で、JavaScript Object Notation - Remote Procedure Call（JSON-RPC）プロトコルによりイーサリアムノードと通信するための機能が搭載されています。つまり、開発者がEthereumブロックチェーンと対話するためのJavaScriptライブラリです。Web3.jsは現在バージョン1.2.9で、この記事で参照しているのはこのバージョンである。Web3.jsは4つのモジュールから構成されています。

### What is a module? / モジュールとは何か？

JavaScriptでは、モジュールは、より大きなプログラムの中で特定の機能を持つコードです。モジュールは自己完結している必要があり、ライブラリやプログラム、アプリケーションからモジュールを削除しても、ライブラリやプログラム、アプリケーション全体が動かなくなるようなことがあってはなりません。PythonやJavaに慣れている人は、モジュールに類似した「クラス」に慣れているかもしれません。JavaScriptを初めて使う人のために、FreeCodeCampがJavaScriptのモジュールについて素晴らしい説明をしています。

### What modules make up web3.js?/ web3.jsを構成するモジュールにはどのようなものがあるか？

web3.jsにはweb3というメインクラスがあり、ライブラリの機能の大部分はこのクラスで実現されています。web3jsを構成する5つの追加モジュールは以下の通りです。

- `web3-eth`
- `web3-shh`
- `web3-bzz`
- `web3-net`
- `web3-utils`

### What does `web3-eth` do?/ `web3-eth`は何をするのか？

`web3-eth`モジュールは、web3.jsのユーザーがEthereumブロックチェーンと対話するための関数を含んでいます。具体的には、スマートコントラクト、外部所有のアカウント、ノード、採掘されたブロック、およびトランザクションと対話することができる関数です。以下に3つの例を示します。

- `web3.eth.getBalance`は、あるブロックでのアドレスのETH残高を取得することができます。
- `web3.eth.signTransaction` は、トランザクションに署名することができます。
- `web3.eth.sendSignedTransaction` は、署名されたトランザクションをイーサリアムブロックチェーンに送信することができる。

### What does `web3-shh` do? / `web3-sh`は何をするのか？

`web3-shh`モジュールを使うと、Whisperプロトコルと対話することができます。Whisperはメッセージングプロトコルで、簡単にメッセージをブロードキャストしたり、低レベルの非同期通信を行うために設計されています。以下に2つの例を示します。

- `web3.shh.post` はネットワークにWhisperメッセージを投稿します。
- `web3.shh.subscribe` は、受信するWhisperメッセージのサブスクライブを作成します。

### What does `web3-bzz` do? / `web3-bzz`は何をするのか？

`web3-bzz`モジュールは、Swarmと対話するためのモジュールです。[Swarm](https://ethersphere.github.io/swarm-home/)は分散型ストレージプラットフォームであり、コンテンツ配信サービスです。分散型アプリケーション（dapp）用の画像や動画などのファイルを保存する場所として利用できます。以下に2つの例を示します。

- `web3.bzz.upload` はファイルやフォルダをSwarmにアップロードするためのものです。
- `web3.bzz.download` は、Swarmからファイルやフォルダをダウンロードします。

### What does `web3-net` do?. / `web3-net`は何をするのか？

`web3-net` モジュールは、Ethereum ノードのネットワークプロパティを操作するためのモジュールです。`web3-net` を使用すると、情報を取得することに関心のあるプロトコルに続く `.net` で、ノードに関する情報を見つけることができます（ここでは、`web.eth.net`、`web3.shh.net`、または `web3.bzz.net` の選択を表す `*` が指定されています）。以下に、2つの例を示します。

- `web3.*.net.getID` はネットワーク ID を返します。
- `web3.* .net.getPeerCount` は、そのノードが接続しているピアの数を返します。

### What does `web3-utils` do? / `web3-utils`は何をするのか？

`web3-utils`モジュールは、Ethereum dappや他のweb3.jsモジュールで使用できるユーティリティ関数を提供します。ユーティリティ関数とは、コードを書きやすくするための再利用可能な関数で、JavaScriptや他のプログラミング言語では一般的なものです（JavaScriptを参照。JavaScriptのJQueryライブラリに存在するユーティリティ関数については、Dave Flanaganによる「JavaScript: The Definitive Guide, 6th Edition」を参照してください）。`web3-utils`には、数値の変換、ある条件を満たすかどうかの検証、データセットの検索を行うユーティリティ関数が含まれています。以下に3つの例を示します。

- `web3.utils.toWei`は`Ether`を`Wei`に変換します。
- `web3.utils.hexToNumberString` は16進数の値を `stringweb3.utils.isAddress` に変換し、与えられた文字列が有効なイーサリアムアドレスかどうかをチェックします。

## What is ethers.js? / ethers.js?とは

![](https://storage.googleapis.com/zenn-user-upload/986c485fa020-20220130.png)

ethers.jsは、開発者がEthereumブロックチェーンと対話できるようにするJavaScriptライブラリです。このライブラリにはJavaScriptとTypeScriptのユーティリティ関数が含まれており、イーサリアムのウォレットのすべての機能を備えています。ethers.jsは現在バージョン5.0.3です。ethers.jsは[Ethers](https://ethers.io/)社によって作成され、MITライセンスによってオープンソース化されています。

web3.jsと同様に、ethers.jsにはアプリケーションプログラミングインターフェース（API）を構成する4つのモジュールがあります。

- `ethers.provider`
- `ethers.contract`
- `ethers.utils`
- `ethers.wallets`

### What does `ethers.provider` do? / `ethers.provider`は何をするのか？

`ethers.provider` を使用すると、Ethereum ブロックチェーンへの接続を抽象化することができます。これは、ブロックチェーンの状態を変更するクエリの発行や署名付きトランザクションの送信に使用することができます。以下に3つの例示を示します。

- `ethers.providers.InfuraProvider` により、Infura がホストする Ethereum ノードのネットワークに接続することができます。
- `ethers.provider.getBalance` はブロックチェーン上のアドレスまたはブロックのETH残高を取得します。
- `ethers.provider.resolve` は渡された Ethereum Name Service (ENS) 名を Ethereum アドレスに解決します（Promise 経由-JavaScript が初めての方は、将来のある時点でデータを計算し返せる [Promise](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise) についてもっと読んでみることをお勧めします）。

:::message
注意：web3.jsにも`web3 base`モジュール内にこの目的のためのプロバイダがあります。ethers.jsとweb3.jsの構成は全く異なるため、両ライブラリの機能が非常に似ていたとしてもモジュール間のマッピングが必ずしも明確ではありません。
:::

### What does `ethers.contract` do? / `ethers.contract`は何をするのか？

`ethers.contract` は、スマートコントラクトを導入し、操作することができます。具体的には、このモジュールの関数によって、スマートコントラクトから発信されるイベントのリスニング、スマートコントラクトが提供する関数の呼び出し、スマートコントラクトに関する情報の取得、そしてスマートコントラクトのデプロイを行うことができます。以下に2つの例を示します。

- `ethers.ContractFactory.fromSolidity` は、Solidity コンパイラの出力、または Truffle で生成された JSON ファイルからスマート・コントラクトをデプロイするための 「ファクトリー」 を作成します。
- `ethers.Contract` は、一度デプロイされたスマートコントラクトを操作することができます。

### What does `ethers.utils` do? / `ethers.utils`は何をするのか？

`ethers.utils`は、データのフォーマットやユーザ入力を処理するためのユーティリティ関数を提供します。`ethers.utils` は `web3-utils` のように動作し、分散型アプリケーションをより簡単に構築することができます。以下に3つの例を示します。

- `ethers.utils.getContractAddress` は、スマートコントラクトをデプロイするために使用したトランザクションからスマートコントラクトのアドレスを取得します。
- `ethers.utils.computeAddress` は、アドレスに関連付けられた公開鍵または秘密鍵を関数に渡すことによって、アドレスを計算する。
- `ethers.utils.formatEther` は、渡された `Wei` の額を 10 進数で`string`型の `Ether` に変換します。

### What does `ethers.wallet` do? / `ethers.wallet`は何をするのか？

`ethers.wallet`は、ここまで説明してきた他のモジュールとは異なる機能を提供します。`ethers.wallet`では、既存のウォレット（Ethereumアドレス）への接続、新しいウォレットの作成、トランザクションへの署名が可能です。3つの例を挙げます。

- `ethers.wallet.createRandom` はランダムに新しいアカウントを作成します。
- `ethers.wallet.sign` は取引に署名し、署名された取引を16進数の`string`型として返します（Promiseを介して-もしあなたがJavaScriptに慣れていないなら、[Promise](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise)についてもっと読むことをお勧めします。Promiseは、将来のある時点で計算されたデータを返すことができます。）。
- `ethers.wallet.getBalance` は、ウォレットアドレスのETH残高を提供します。

web3.jsには、`web3.eth`モジュール内に`web3.eth.accounts`という同様のパッケージがあります。しかし、このパッケージのドキュメントでは、こう呼びかけられています。
>「このパッケージは監査されておらず、潜在的に安全でない可能性があります。実運用で使用する前に、適切にメモリをクリアし、秘密鍵を安全に保管し、トランザクションの受信と送信機能を適切にテストするための予防策を講じてください!"

## How should I determine whether to use web3.js or ethers.js in my decentralized application? What is the difference between the two? / 分散型アプリケーションでweb3.jsとethers.jsのどちらを使うかどのように判断すればよいか？両者の違いは？

まず、定型的なアプリケーションを作成する場合やチュートリアルを完了する場合、その定型文やチュートリアルが推奨するもの、それが web3.js であろうが ethers.js であろうが、それを使用します。web3.jsであろうとethers.jsであろうと、その定型文やチュートリアルが推奨するものを使います。チュートリアルで指定されているweb3.jsまたはethers.jsのバージョンを必ず使用してください。チュートリアルの中には更新されていないものもたくさんあるので、チュートリアルに明記されていない限り、ライブラリの最新版を使えるとは思わないでください。

アプリケーションをゼロから作り、どのライブラリを使うかを決める場合、Andres Canalが「[Using Quill,js to Build WYSIWYG Editor for your Website](https://www.scalablepath.com/blog/using-quill-js-build-wysiwyg-editor-website/)」という記事で使ったソフトウェアの評価プロセスを応用して、どのテキストエディターを使うかを評価することにしています。

## The following is a series of nine questions that you, the reader, should ask yourself as part of determining which library might be best for you, with some context and information to help you answer it. / 以下は、読者の皆様がどのライブラリが最適かを判断するために必要な9つの質問と、それに答えるための背景や情報をまとめたものです。

### 1)How important is the popularity of the library? / ライブラリの人気はどの程度重要か？

Andres Canalの定義で言えば
>「Githubで人気のあるプロジェクトは、まさに期待通りの意味を持っています。つまり、多くの人が疑問を持ち、貢献し、サポートしているということです。このような活動によって、より信頼性の高いソフトウェアが生まれる傾向があります。どのプロジェクトでも、スターの数、開かれた課題の数、保留中のプルリクエストの数、プロジェクトに携わったコントリビューターの数を見れば、その人気度を確認することができます。"

このブログを書いている時点でweb3.jsのスター数は約8,800個、ethers.jsは約1,500個です。GitHubの51,300のリポジトリで利用されているweb3.jsに対し、ethers.jsは18,500です。web3.jsの方が歴史が長いことも、web3.jsがより人気のあるライブラリである理由の一つです。

### 2)How important is the maintenance of the library? / ライブラリーのメンテナンスはどの程度重要か？

バグを潰し、新しい機能を追加するために、頻繁に更新されるライブラリを使いたいものです。完璧ではありませんが、1ヶ月（または2ヶ月）のコミット数、クローズされた課題、アクティブな課題、そしてその期間のメンテナの数を見れば、オープンソースプロジェクトの長所と短所を知ることができます。これはまた、メンテナンスのパターンを明らかにし、一般的にアップデートやバグフィックスがいつ対処されるのか、ライブラリのユーザに対して何らかの洞察を与え、ライブラリのメンテナンスの代理指標として使用することができます。GitHubにあるライブラリ（[web3.js](https://github.com/ethereum/web3.js/pulse/monthly) / [ethers.js](https://github.com/ethers-io/ethers.js/pulse/monthly)）の月別パルスを見て、統計情報を確認してみてください。

![](https://storage.googleapis.com/zenn-user-upload/b1f6567a71ae-20220130.png)

ethers.jsのたった一人のメンテナー、Richard Mooreが完了させたコミット数とクローズされた課題の数は見事で、彼は賞賛されるべきです。web3.jsには12人のメンテナーがいますが、そのうちの3人がほぼすべてのコミットを完了させています。ここでは明確な勝者はいませんが、ライブラリを選択する際に、これらの統計を意識することで、メンテナンスに関して何が最も重要かを判断し、ニーズに合ったライブラリの優先順位を決めることができます。

### 3) Who is responsible for the development of the library and how many projects use it? / ライブラリーの開発責任者は誰で、どれくらいのプロジェクトが利用しているのか？ 

web3.jsは、プロトコルレベルの開発の研究・組織化を行う非営利団体である[イーサリアム財団](https://ethereum.org/en/)のプロジェクトです。ethers.jsは、「[完全で、シンプルで、小さなライブラリ - それはweb3とethereum.jsの代わりとなるもの](https://www.youtube.com/watch?v=P-UzQTDfdXY)」を作るために作られたものです。Richard Mooreによって開発されたethers.jsは、彼のライブラリの作成とメンテナンスの仕事によって支えられています。

どちらのライブラリを使用しているか公表しているプロジェクトもありますが、データを示すことで、どちらも非常に人気のあるライブラリであることを示すことができると考えています。[web3.js](https://github.com/ethereum/web3.js/network/dependents)と[ethers.js](https://github.com/ethers-io/ethers.js/network/dependents?package_id=UGFja2FnZS0xNjEzMjI4Ng%3D%3D)の依存関係グラフを見て、あなたが信頼しているプロジェクトがどちらのライブラリを使用しているか、または両方のライブラリを使用しているか/サポートしているかどうかを調べてみてください。

![](https://storage.googleapis.com/zenn-user-upload/ab20a43631b9-20220130.png)

### 4)How important is it that the library has tests? / ライブラリにテストがあることは、どの程度重要か？

もし、あなたのプロジェクトにとって、あらかじめ書かれたテストがあることが重要であれば、歴史的にethers.jsが勝者でした。執筆時点では、ethers.jsは以前、バージョン3.0のリリース時にはテストについての明確なドキュメントをGithub上に保持していましたが、そのドキュメントはバージョン5.0のリリースにおいてまだ更新されていません。web3.jsは同等のテストドキュメントを欠いています。もし今後数週間のうちにテストのドキュメントが更新されれば、ethers.jsはより優れたテストとテストのドキュメントを持つライブラリとしてその地位を維持することでしょう。現時点では、ethers.jsのテストスイートはまだ更新されていないようなので、審査は終了しています。

### 5)How important is the number of downloads of the library? / ライブラリーのダウンロード数はどの程度重要か？/ 

web3.jsの方が歴史が長いため、ダウンロード数はethers.js（5月20日現在[8,500,336件](https://npm-stat.com/charts.html?package=ethers&from=2015-01-01&to=2020-05-20)）よりも多い（[14,703,432件](https://npm-stat.com/charts.html?package=web3&from=2015-01-01&to=2020-05-20)）ですが、週間ダウンロード数で見ると、ethers.js（5月20日現在[184,798件](https://npm-stat.com/charts.html?package=ethers&from=2015-01-01&to=2020-05-20)）がweb3.js (5/20 現在 [175,661件](https://www.npmjs.com/package/web3)) に勝り、現在はより頻繁にダウンロードされるライブラリになっています。直近の時間軸ではEthers.jsの方がダウンロード数が多いですが、全体ではweb3.jsの方がダウンロード数が多くなっています。

### 6)How important is web performance? / ウェブパフォーマンスはどの程度重要か？

ウェブパフォーマンスを重視するのであれば、前提としてethers.jsの方がよりパフォーマンスの高いライブラリです。[ethers.jsのライブラリは非圧縮で284kb](https://docs.ethers.io/v5/)とされていますが、NPMでは[3.5MB](3.5 MB unpacked)と記載されています。一方、Web3.jsは[10.6MB](https://www.npmjs.com/package/web3)と、少なくとも一桁以上大きいです。ethers.jsはweb3.jsより小さいので、ethers.jsを使ったアプリケーションはweb3.jsを使ったアプリケーションよりロード時間が短くなるという考え方があります。これは、どちらのライブラリを使用するにしても、Webアプリケーションの他のアセットと一緒にロードされているためです。web3.jsとethers.jsを使用する以外は全く同じアプリケーションのロード時間をテストしたことはありませんので、この点については懐疑的な見方をしてください。もし、これらの余分なMBがあなたのアプリケーションに違いをもたらすのであれば、ethers.jsはより小さなライブラリです。

### 7)How important is the quality of the documentation? / ドキュメントの質はどの程度重要か？

ドキュメントの質は主観的なものですが、ドキュメントの質を測る一つの方法として、ドキュメントを読んでみて、どれだけ分かりやすいドキュメントになっているかを確認することができます。理想は、新規ユーザーがライブラリの使い方を把握できるように書かれていることです。また、熟練したユーザーが探しているものをすぐに見つけられるように、ドキュメントが整理されていることも必要です。

web3.jsは[APIリファレンス](https://web3js.readthedocs.io/en/v1.2.9/web3.html)が充実しており、非常に便利です。これは、ドキュメントの中で最も強力な部分です。入門編」の資料は短いです。経験豊富なユーザーなら楽しめるでしょうが、web3.jsの新しいユーザーには資料が不足しています。

ethers.jsには「Getting Started」セクションと、豊富なAPIリファレンスがあります。これらは非常に有用であり、特にEthereumエコシステムの新しい開発者に関しては、web3.jsと比較してethers.jsに優位性をもたらします。ethers.jsのドキュメントには不完全な部分があり、ユーザーフレンドリーではありません（[Ethereum Basics section](https://docs.ethers.io/v5/concepts/events/)の一部と、開発者が使用する一般的なコードサンプルの歴史的に素晴らしい「Cookbook」は5.0ではまだ最新ではありません - この非常に有用なセクションを見つけるにはバージョン4.0のドキュメントに戻る必要があります）。また、Ethers.jsを使用する利点についても明確な情報を提供しています。

どちらのライブラリも完璧なドキュメントを持っていないので、もしドキュメントを重要視するのであれば、あなたが作ろうと思っている機能を実装するのに十分な情報があるかどうかを判断するために、時間をかけて調べてみてください。

### 8)How important is the overall usage of the library? /  ライブラリの全体的な利用状況はどの程度重要か？ 

web3.jsの方が歴史が長いためダウンロード数やGitHubのスター数が多いのですが、ethers.jsは人気上昇中です。最終的に、それぞれのライブラリのどの部分があなたのユースケースに最も重要であるかを判断するのはあなた次第です。

### 9.)How important is the license? / ライセンスはどの程度重要か？

特定のユースケースによっては、オープンソースソフトウェアのライセンスが重要になる場合があります。web3.jsはLGPLv3ライセンス（[NPM](https://www.npmjs.com/package/web3)に記載されていますが、GitHubリポジトリには記載されていません）、ethers.jsはMITライセンスです（GitHubリポジトリに記載されています）。ライセンスの詳細については、このテーマに関する法律の専門家に問い合わせることで確認できます。しかし、Slava Todavchichは "「Understanding open-source and free software licensing](https://medium.com/@moqod_development/understanding-open-source-and-free-software-licensing-c0fa600106c9)" という記事で、このテーマについて面白い読み物を提供しています。

## Conclusion / 結論

冒頭で述べたように、どちらのライブラリも有用です。ethers.jsは過去2年間で人気を博し、ダウンロード数やプロジェクトでの利用が増加しています。web3.jsは歴史的に標準であり、今でも多くの開発者シェアを誇っています。

後編では、[Infura API](https://infura.io/dashboard?&utm_source=infurablog&utm_medium=referral&utm_campaign=tutorials&utm_content=tutorial:_js_libraries)に接続し、web3.jsとethers.jsを使用して翻訳を送信する方法を紹介します。

このガイドに多大な貢献をしてくれたThomas Hay、Akua Nti、Sean Brennanに感謝します。Web3チュートリアルについては、[Infura Blog](https://blog.infura.io/?&utm_source=infurablog&utm_medium=referral&utm_campaign=tutorials&utm_content=tutorial:_js_libraries)と[ConsenSys Academy](http://learn.consensys.net/)をご覧ください。









【参考文献】
<a href="//af.moshimo.com/af/c/click?a_id=1875799&amp;p_id=170&amp;pc_id=185&amp;pl_id=4062&amp;url=https%3A%2F%2Fwww.amazon.co.jp%2Fdp%2F4873119340" rel="nofollow" referrerpolicy="no-referrer-when-downgrade">SolidityとEthereumによる実践スマートコントラクト開発 ―Truffle Suiteを用いた開発の基礎からデプロイまで</a><img src="//i.moshimo.com/af/i/impression?a_id=1875799&amp;p_id=170&amp;pc_id=185&amp;pl_id=4062" alt="" width="1" height="1" style="border: none;">
<a href="//af.moshimo.com/af/c/click?a_id=1875799&amp;p_id=170&amp;pc_id=185&amp;pl_id=4062&amp;url=https%3A%2F%2Fwww.amazon.co.jp%2Fdp%2F4502462217" rel="nofollow" referrerpolicy="no-referrer-when-downgrade">スマートコントラクトの仕組みと法律</a><img src="//i.moshimo.com/af/i/impression?a_id=1875799&amp;p_id=170&amp;pc_id=185&amp;pl_id=4062" alt="" width="1" height="1" style="border: none;">
<a href="//af.moshimo.com/af/c/click?a_id=1875799&amp;p_id=170&amp;pc_id=185&amp;pl_id=4062&amp;url=https%3A%2F%2Fwww.amazon.co.jp%2Fdp%2F429712307X" rel="nofollow" referrerpolicy="no-referrer-when-downgrade">図解即戦力 暗号と認証のしくみと理論がこれ1冊でしっかりわかる教科書</a><img src="//i.moshimo.com/af/i/impression?a_id=1875799&amp;p_id=170&amp;pc_id=185&amp;pl_id=4062" alt="" width="1" height="1" style="border: none;">