
Web3アプリケーションのセキュリティ開発におけるベストプラクティス:信頼できるDAppsの構築
TechFlow厳選深潮セレクト

Web3アプリケーションのセキュリティ開発におけるベストプラクティス:信頼できるDAppsの構築
包括的な設計、テスト、および実装を通じて、DAppがブロックチェーン環境において信頼性と信憑性を確保できるようにする。
執筆:Salus
DAppの信頼性を確保することは、ユーザーの信頼を得るうえで不可欠であり、セキュリティの確保、優れたユーザーエクスペリエンスの提供、そしてブロックチェーン技術の普及にとって極めて重要です。 信頼できるDAppは、安全で透明かつ非中央集権的なインタラクション環境を提供し、ブロックチェーン技術の持続可能な発展と広範な応用に堅固な基盤を築きます。本稿では、以下の5つの観点からDApp構築の技術スタックについて説明します。
-
スマートコントラクト開発:スマートコントラクト設計がベストプラクティスおよびセキュリティ原則に準拠していることを確認し、モジュール化・拡張可能なアーキテクチャを採用することで、将来的なアップグレードや修正に対応できるようにする。
-
スマートコントラクトテスト:単体テスト、統合テスト、システムテストを徹底的に行い、コントラクトの正確性と安定性を保証する。また、さまざまなシナリオや攻撃を模擬して、コントラクトの堅牢性とセキュリティを検証する。
-
フロントエンド開発:ユーザーインターフェースが使いやすく直感的であるとともに、スマートコントラクトとの安全なやり取りを実現する。必要な検証および認可メカニズムを実装し、ユーザーのプライバシーと資産を保護する。
-
ミドルウェア開発:ミドルウェア自体の安全性と信頼性を確保し、適切な暗号化および認証機構を通じて、ユーザーのデータと取引を保護する。同時に、ミドルウェアは効率的なAPIおよび機能を提供し、フロントエンドとスマートコントラクト間のシームレスな連携を可能にする。
-
スマートコントラクトのデプロイ:デプロイプロセスにおける正しさと完全性を保証し、必要に応じたデータ移行や転送を行う。適切なデプロイツールおよびネットワークを選択し、ベストプラクティスとセキュリティガイドラインに従う。
1 スマートコントラクト開発
1.1 スマートコントラクトの特徴
スマートコントラクトはDAppの中心的構成要素であり、DAppのロジックと機能を定義する。スマートコントラクトには独自のプログラミング言語が存在し、Solidity、Vyper、Move、Rustなどが代表的である。DApp開発においては、スマートコントラクトの特性を理解することが極めて重要である。以下に主要な特性を示す。
-
トランザクション性:スマートコントラクトの実行中は、すべて成功するか、すべて未変更状態へロールバックされる。このため、関数APIの設計時には、パラメータのオーバーロードを避けるとともに、エラー処理を慎重に行う必要がある。
-
エラー処理:一般的なエラー処理方法として、「require」文によるエラーメッセージの提示や「revert」文によるカスタムエラー型の使用がある。これらの方法はいずれもトランザクション失敗を引き起こすため、フロントエンド側でカスタムエラー型を捕捉する仕組みが必要となる。
-
実行コスト:スマートコントラクトの状態保存にはGas手数料が発生するため、ストレージ設計では宣言されたメモリ領域を適切に活用し、過剰なメモリ消費を避けるべきである。また、データ構造の宣言位置によって費用が異なり、状態を変更する関数はGasを消費する。
-
不変性:一度デプロイされたスマートコントラクトは、動的に置き換えたりアップグレードしたりできない。したがって、デプロイ前に、アップグレード可能なアーキテクチャへの依存を考慮し、コントラクトのアップグレード可能性を確実にすべきである。
-
権限と可視性:コントラクトはネットワーク上のすべての者に対して透明であるため、コントラクト内に機密データを保存すべきではなく、ブロック内の状態に依存してコアビジネスロジックを判断することも避けるべきである。OwnableやAccessControlなどの権限制御メカニズムの利用を推奨する。
-
セキュリティ:コントラクトのセキュリティは極めて重要であり、コードセキュリティガイドラインに従い、十分なテストケースを実施するなど、セキュリティに関するベストプラクティスを遵守すべきである。未検証のコントラクトコードを安易に信用したり、正常に動作すると主観的に期待したりしてはならない。
1.2 セキュリティ実践
DApp開発において、スマートコントラクトのセキュリティおよび監査の容易さを確保することは極めて重要である。以下に、スマートコントラクトのセキュリティを担保するためのベストプラクティスと提案を示す。
-
標準化された開発フレームワークの利用:標準化された開発フレームワークを利用することで、スマートコントラクトの信頼性を高めることができる。標準化されたフレームワークは通常、経験豊富な開発者およびセキュリティ専門家によって作成・保守されており、検証済みかつ最適化されたコードやパターンが含まれている。こうしたフレームワークを活用することで、一般的なセキュリティ問題を回避でき、テストおよび監査済みのコードを使用することでコントラクトの安全性を向上させられる。例えば、OpenZeppelinは広く使われており、検証済みのスマートコントラクト開発フレームワークであり、標準的なコントラクトテンプレートやライブラリを提供し、安全で信頼性の高いコントラクト構築を支援する。
-
イベントによるログ記録:イベントを利用してスマートコントラクトの実行情報を記録することで、コントラクトの機能や操作をよりよく追跡できる。イベントはコントラクト内で定義・発火され、呼び出し元アドレス、タイムスタンプ、関数引数などの詳細情報を記録できる。こうしたログ情報は、コントラクトの監査や潜在的な脆弱性の特定に非常に価値がある。例えば、クラウドファンディングコントラクトでは、寄付ごとの詳細(寄付者のアドレスと金額)を記録するイベントを定義できる。これにより、コントラクトのすべての操作や変更が記録され、監査担当者がチェック・分析しやすくなる。
-
アクセス制御の実装:アクセス制御とは、誰がどのリソースにアクセスできるか、またはどの操作を実行できるかを制御し、アクセスや実行前に認証を行う仕組みである。スマートコントラクトでは、修飾子(modifier)を使ってアクセス制御を実現でき、関数の実行前に特定条件を満たしているかをチェックできる。アクセス制御を実装することで、承認された主体だけが特定の操作を実行したり、機密データにアクセスしたりできるようになる。例えば、投票コントラクトでは、特定のアドレスのみが投票操作できるかを検証する修飾子を定義し、承認されたユーザーのみが投票プロセスに参加できるようにする。
-
最小権限原則の遵守:最小権限原則とは、各ユーザーにその業務遂行に必要な最小限のアクセス権しか与えないという考え方である。スマートコントラクトでは、アクセス制御機構によってこれを実現できる。アクセス制御を実装し、最小権限原則に従うことで、各主体に付与される権限を制限し、必要な操作のみを許可できる。例えば、マルチユーザー向けコントラクトでは、ユーザーごとに異なる権限レベルを定義し、身分やニーズに基づいて必要な権限のみを与えることで、権限の乱用や不要な操作を防止できる。これにより、アカウントが侵害されても攻撃者が限定的な操作しか実行できないため、コントラクトが攻撃されるリスクを低減できる。
-
マルチシグネチャ:重要な取引に対してマルチシグネチャ(複数署名)を導入することは、スマートコントラクトのセキュリティ実践において重要な対策である。マルチシグネチャでは、重要な取引を完了させるために複数の署名が必要となる。この仕組みにより、追加のセキュリティが提供され、リプレイ攻撃やトランザクション延長性といった潜在的なリスクを軽減できる。
-
タイマーとタイムアウトの説明:ブロックチェーンネットワークにおけるトランザクション実行時間は不確定であるため、スマートコントラクトは時間に関する問題を悪用する攻撃(例:乱数予測攻撃、フロントランニング攻撃、サンドイッチアタックなど)を受けやすい。こうした時間関連攻撃を緩和するために、タイマーおよびタイムアウト機構を用いることは有効な手段である。タイマーは、特定時刻にコントラクト内の機能を実行するようにスケジュールするのに使用され、ブロックチェーンネットワークの実行時間に依存しないようにできる。タイムアウト機構は、コントラクト内の特定関数の実行時間を制限し、無期限に実行され続けることを防ぐ。
1.3 スマートコントラクトのアップグレード
スマートコントラクトのアップグレードとは、既にブロックチェーン上にデプロイされたスマートコントラクトを更新または変更するプロセスを指す。スマートコントラクトのアップグレードでは、コントラクトのビジネスロジックを変更しつつ、コントラクトの状態を保持する。スマートコントラクトのアップグレードにより、開発者はコントラクトのロジック、機能、セキュリティを改善し、新たな要件に応じたり、既存コントラクトの問題を修正したりできる。ただし、スマートコントラクトのアップグレードは複雑な作業であり、脆弱性を導入しないよう極めて慎重に進める必要がある。
スマートコントラクトのアップグレードには通常、以下のステップが必要である。
-
新しいコントラクトコードの作成:開発者は必要に応じて、既存コントラクトの改良部分を含む新しいコントラクトコードを作成する。新コードは厳格なテストを経て、その正確性と安全性が保証されている必要がある。
-
新しいコントラクトのデプロイ:新しいコントラクトコードは、既存コントラクトとは異なるアドレスでデプロイする必要がある。新コントラクトをデプロイする前に、アップグレードプロセス中にデータの移行や転送が適切に処理されることを確認しなければならない。
-
データの移行または転送:スマートコントラクトのアップグレードがデータの移行または転送を伴う場合、開発者はデータが新コントラクトに正しく移行または転送されるよう、適切な仕組みを設計する必要がある。これは通常、旧コントラクトとのデータやり取りおよび変換プロセスを含む。
-
コントラクトアドレスまたはインターフェースの更新:新コントラクトのデプロイが成功したら、開発者はコントラクトと相互作用するアプリケーションまたはユーザーインターフェースを更新し、新コントラクトのアドレスまたはインターフェースに対応できるようにする。
2 スマートコントラクトテスト
スマートコントラクトテストとは、スマートコントラクトの機能、セキュリティ、パフォーマンス、正確性を検証するために、さまざまなテスト手法および技術を適用することを指す。スマートコントラクトテストの目的は、コントラクトに潜む潜在的問題、脆弱性、エラーを発見し、あらゆる状況下での挙動が想定通りであることを保証することにある。
2.1 テストの必要性
スマートコントラクトのテストは、スマートコントラクト開発における重要な実践であり、以下の理由から極めて重要である。
-
コントラクト機能の検証:スマートコントラクトは、送金、状態更新などの特定機能を実行するコードである。単体テストを行うことで、コントラクトの各機能が想定通りに動作するかを検証できる。これにより、潜在的なエラーを発見・修正し、コントラクトの挙動およびロジックが正しいことを保証できる。
-
コントラクトのセキュリティ確保:スマートコントラクトは通常、暗号資産などの資産の処理・管理を扱う。したがって、コントラクトのセキュリティは極めて重要である。単体テストにより、再入攻撃、整数オーバーフローなど、一般的な脆弱性や攻撃の脅威に対してコントラクトが耐性を持っているかを検査できる。これにより、潜在的なセキュリティホールを発見・修正し、コントラクトの安全性を確保できる。
-
コード品質の向上:単体テストは、開発者が高品質なコードを書くのを助ける。テストケースおよびアサーションを書くことで、コードの正しさを検証し、あらゆる状況で正常に動作することを保証できる。これにより、コードの堅牢性、信頼性、保守性が向上し、将来のメンテナンスコストを削減できる。
-
リファクタリングおよび拡張の支援:スマートコントラクト開発プロセスにおいて、要件の変化に伴い、コントラクトのリファクタリングや拡張が必要になることがある。包括的な単体テストスイートがあれば、リファクタリングや拡張の過程で既存の機能やロジックを破壊しないことを保証できる。これにより、コードの安定性が維持され、後続の開発およびメンテナンス作業が簡素化される。
-
継続的インテグレーションおよびデプロイ:CI/CD(継続的インテグレーション/継続的デプロイ)環境において、単体テストは重要な要素である。単体テストを自動実行することで、コードの問題を早期に発見・解決し、コードの品質および信頼性を保証できる。これにより、開発チームの作業効率が向上し、製品のリリース速度が加速する。
2.2 テスト対象
スマートコントラクトをテストする際には、主に以下の点を検証する。
-
コントラクトの機能および挙動:スマートコントラクトテストの主目的は、コントラクトの機能および挙動が想定通りに動作するかを検証することである。これには、コントラクトの各機能およびメソッドが正しく実行され、期待される結果と一致するかをテストする。例えば、送金コントラクトであれば、資金移転機能が正しく実行できるかをテストできる。
-
コントラクトの境界値:コントラクトがさまざまな境界条件下での挙動もテストする必要がある。これには、最小値、最大値、空値などの入力パラメータの境界値のテスト、および無効な入力や未承認操作などの異常状況に対する処理能力のテストが含まれる。境界値をテストすることで、コントラクトに潜む潜在的な問題や脆弱性を発見できる。
-
コントラクトのセキュリティ:セキュリティはスマートコントラクトテストの重要な側面である。再入攻撃、整数オーバーフロー、未承認のアクセスなど、潜在的なセキュリティ脆弱性が存在しないかをテストする必要がある。セキュリティ監査および特定の脆弱性タイプに対するテストにより、コントラクトのセキュリティ問題を発見・修正し、ユーザー資産の安全を確保できる。
-
コントラクトのパフォーマンスおよび拡張性:スマートコントラクトは多数の取引およびユーザーを処理できるよう、良好なパフォーマンスおよび拡張性を持つ必要がある。したがって、パフォーマンステストおよび負荷テストを行い、高負荷および並列ユーザー状況下でのコントラクトのパフォーマンスおよび安定性を検証する。パフォーマンスおよび拡張性をテストすることで、コントラクトの設計および実装を最適化し、スループットおよび応答時間を向上できる。
-
コントラクトの統合および互換性:スマートコントラクトが他のコンポーネントまたはサービスと統合される必要がある場合、それらとの連携が正常であるかを検証する統合テストが必要である。これには、フロントエンドアプリとの統合、他のコントラクトとのインタラクションなどが含まれる。また、異なるEthereumクライアントおよびネットワーク環境下でのコントラクトの互換性もテストし、さまざまな環境下で一貫性および信頼性が保たれるようにする。
2.3 テスト手法
-
単体テスト:単体テストは、スマートコントラクト内の各機能およびメソッドを個別にテストする手法である。テストスクリプトを記述し、コントラクトの入力および環境を模擬し、出力に対してアサーションを行うことで、コントラクトの挙動が想定通りであるかを検証する。
-
統合テスト:統合テストは、異なるコンポーネント間の相互作用が正常であるかを検証する手法である。スマートコントラクト開発では、コントラクトとフロントエンドアプリケーションまたは他のサービス(ブロックチェーンノードやデータベースなど)の統合をテストする統合テストを記述できる。統合テストにより、コントラクトと他のコンポーネントの協働が正常であり、全体システムの機能および性能が検証できる。
-
プロパティベーステスト:プロパティベーステストは、コントラクトの挙動が事前に定義されたプロパティを満たしているかに注目する。これらのプロパティは、コントラクトの挙動に関するアサーションであり、さまざまなシナリオ下でも常に真であるべきことを表す。静的解析および動的解析は、プロパティベーステストを実行するための2つの一般的な技術である。静的解析器はスマートコントラクトのソースコードを入力として受け取り、コントラクトが特定のプロパティを満たしているかを出力する。動的解析は、シンボル入力または具体的な入力を生成し、特定のプロパティに違反する実行トレースが存在しないかを検査する。
-
セキュリティ監査:セキュリティ監査も人手によるテストである。コントラクトコードおよびロジックを注意深くレビューし、専門的な監査ツールおよび技術を活用することで、潜在的な脆弱性およびセキュリティリスクを発見できる。コントラクト内の資産およびユーザーの安全を守るために、セキュリティ監査は極めて重要である。スマートコントラクト監査をご希望の方はSalusまでお問い合わせください。高品質なサービスを提供いたします。
2.4 テストツール
FoundryおよびHardhatは、スマートコントラクトのテストに使用される人気の開発ツールである。
FoundryはTypeScriptベースのスマートコントラクト開発フレームワークであり、Ethereumスマートコントラクトの作成およびテストのための強力なツールおよびライブラリ群を提供する。
-
FoundryはMochaおよびChaiという2つの有名なJavaScriptテストフレームワークを使用し、さまざまなテストケースを記述・実行できる。
-
Foundryは、スマートコントラクトの想定される挙動を検証するための組み込みアサーション関数をいくつか提供する。
-
Foundryは、実際のEthereumネットワーク上でリソースおよび費用を消費しないよう、シミュレータを使ったテストもサポートする。
Hardhatは、スマートコントラクトの作成、デプロイ、テストを行うための強力なEthereum開発環境である。
-
HardhatはMochaおよびChaiテストフレームワークに加え、Ethers.jsやWaffleなど、他の便利なツールも統合している。
-
Hardhatは、スマートコントラクトの挙動および状態を検証するための組み込みアサーション関数を提供する。
-
Hardhatは、仮想マシンを使用したテストをサポートしており、実際のEthereumネットワーク上で操作を行う必要がない。
FoundryまたはHardhatを使用してスマートコントラクトをテストする際には、以下の内容をテストできる。
-
スマートコントラクトの機能およびロジックが想定通りに動作しているか。
-
コントラクト間の相互作用が正しく行われているか。
-
さまざまな状況下での例外処理が正しく行われているか。
-
コントラクトの状態変化が正しく反映されているか。
-
異なるネットワーク環境下でのデプロイおよび使用が正しく行われているか。
これらのツールは、コードカバレッジ分析やパフォーマンステストなど、他の機能も提供しており、開発者がスマートコントラクトの品質およびパフォーマンスをより適切に評価・改善するのを支援する。
3 フロントエンド開発
3.1 フロントエンドフレームワークの選定
DApp開発において、適切なフロントエンドフレームワークを選定することは、安全かつ信頼できるフロントエンドアプリの開発にとって非常に重要である。
3.1.1 ethers.js
ethers.jsは、DAppのフロントエンドを構築するためのJavaScriptライブラリである。多くの開発者がDAppのフロントエンド構築にethers.jsを採用している。多くの有名なDAppプロジェクトも、Ethereumネットワークとのやり取りやスマートコントラクト操作にethers.jsを使用している。
主な機能は以下の通りである。
-
Ethereumアカウント管理:ethers.jsにより、Ethereumアカウントの公開鍵、秘密鍵、アドレスの生成および管理が可能になる。これらのアカウントを使用して、取引の実行やスマートコントラクトメソッドの呼び出しなどを行える。
-
スマートコントラクトとのインタラクション:ethers.jsは、Ethereum上のスマートコントラクトと簡単にやり取りするための一連のシンプルなAPIを提供する。ethers.jsを使ってスマートコントラクトをデプロイしたり、コントラクトメソッドを呼び出したり、コントラクトの状態を取得したりできる。また、ethers.jsは型強化されたスマートコントラクトのエンコード・デコード機能も提供しており、スマートコントラクトとのインタラクションをより簡単かつ信頼性高く行える。
-
取引の作成および署名:ethers.jsを使えば、Ethereum取引の作成および送信が可能である。ethers.jsは、取引オブジェクトを構築するためのシンプルなインターフェースを提供し、取引の署名もサポートしている。これにより、安全な方法でイーサを送金したり、コントラクト操作を実行したりできる。
-
その他の機能:ethers.jsは、イーサ単位の変換(WeiからEtherへの変換など)、Ethereumイベントの処理(コントラクトイベントのリッスンなど)、ブロックチェーンイベントの購読など、他にも多くの便利な機能を提供している。これにより、DAppのフロントエンド構築がより迅速かつ効率的になる。
DAppのフロントエンド構築におけるethers.jsの利点:
-
使いやすさ:ethers.jsは直感的なAPIを提供しており、Ethereumブロックチェーンとのやり取りが簡単かつ容易になる。
-
セキュリティ:ethers.jsは、秘密鍵の取り扱いや取引の署名を安全に行う方法を提供し、ユーザー資産の安全を確保する。
-
機能の豊富さ:ethers.jsは、イーサ単位の変換、Ethereumイベントの処理など、多くの便利な機能を提供しており、開発プロセスを簡素化する。
DAppのフロントエンド構築におけるethers.jsの欠点:
-
学習曲線:初心者にとっては、Ethereumの概念および仕組みを理解するのにある程度の時間と努力が必要かもしれない。
-
Ethereumネットワークへの依存:ethers.jsの機能は、Ethereumネットワークの可用性および安定性に依存している。ネットワークに問題が発生すれば、DAppの正常な動作に影響が出る可能性がある。
3.1.2 React
Reactは、ユーザーインターフェースを構築するための人気フロントエンドフレームワークである。React自体は直接的にブロックチェーンとのやり取りを行う機能を持たないが、以下のような方法でReactとブロックチェーンを統合し、ブロックチェーンとのインタラクションを実現できる。
-
Web3.jsの利用:Web3.jsは、Ethereumネットワークと通信するためのJavaScriptライブラリである。ReactプロジェクトにWeb3.jsを導入し、Ethereumネットワークへの接続、スマートコントラクトのデプロイおよび呼び出し、取引の送信などを実行できる。Web3.jsにより、Ethereumノードと通信し、ブロックチェーンとのやり取りに関わる操作を実行できる。
-
ethers.jsの利用:ethers.jsは、Ethereumネットワークと通信するためのもう一つの人気ライブラリである。Ethereumアカウントの管理、スマートコントラクトのデプロイおよび呼び出し、取引の送信などを行うための一連のシンプルなAPIを提供する。Reactプロジェクトでethers.jsを使用して、ブロックチェーンとのインタラクションを実現できる。
-
ブロックチェーンブラウザAPIの利用:EtherscanやInfuraなどの一部のブロックチェーンブラウザは、RESTful APIを提供しており、開発者がEthereumネットワークと通信できるようにしている。ReactプロジェクトでこれらのAPIを使用し、ブロックチェーンデータの取得、取引の照会、コントラクト情報の取得などを実行できる。
-
ウォレット統合ライブラリの利用:MetaMaskやWalletConnectなどのウォレット統合ライブラリは、Ethereumネットワークとのやり取りを可能にし、使いやすいユーザーインターフェースおよび認証機能を提供する。Reactプロジェクトでこれらのライブラリを使用し、ユーザーのウォレット統合を実現することで、ユーザーが取引を実行したり、スマートコントラクトとやり取りしたりできるようにする。
Reactとブロックチェーンのインタラクションを統合する方法では、Reactのコンポーネント指向開発スタイルを活用できる。ブロックチェーンとのインタラクションのロジックおよびUIを専用のコンポーネントとして作成できる。ブロックチェーンネットワークとのやり取りを通じて、アカウント残高の照会、コントラクトメソッドの実行、ブロックチェーンイベントのリッスンなどの機能を実現できる。
ブロックチェーンとのインタラクションにおいては、セキュリティおよびプライバシーが極めて重要であることに注意が必要である。インタラクション中に秘密鍵の取り扱いや取引の署名、ユーザーの機密操作へのアクセス制限などを適切に行うこと。最新のセキュリティベストプラクティスを採用し、ブロックチェーンネットワークの規約および推奨事項に従うことで、アプリケーションの安全性および信頼性を確保できる。
ethers.jsと比較した場合、Reactがブロックチェーンとのインタラクションで持つ利点:
-
豊かなエコシステム:Reactは巨大な開発者コミュニティおよび豊富なサードパーティライブラリのサポートを持つ。これにより、Reactと統合可能なライブラリおよびツールを容易に見つけられ、ブロックチェーンとのインタラクションを支援できる。Reactエコシステムの幅広いサポートにより、より多くのソリューションおよびリソースを得られる。
-
コンポーネント指向開発:Reactのコンポーネント指向開発スタイルにより、ブロックチェーンとのインタラクション機能の構築がよりモジュール化され、保守しやすくなる。ブロックチェーンとのインタラクションのロジックおよびUIを独立したコンポーネントにカプセル化できるため、コードの整理および再利用が明確かつ容易になる。
-
仮想DOM:Reactは仮想DOM技術を使用し、前後の状態差異を比較してDOM操作を最小限に抑えることで、パフォーマンスおよびレンダリング効率を向上させる。大量のブロックチェーンデータを扱ったり、頻繁にUIを更新したりする場合に非常に有効である。
ethers.jsと比較した場合、Reactがブロックチェーンとのインタラクションで持つ欠点:
-
追加の学習コスト:以前にReactに触れたことがなければ、基本概念および動作方法を習得するのにある程度の学習コストがかかるかもしれない。これにより、ブロックチェーンとのインタラクション機能を実装するまでの時間が延びる可能性がある。
-
統合の複雑さ:Reactの柔軟性および自由度の高さにより、ブロックチェーンとの統合が比較的複雑になる可能性がある。Reactとブロックチェーンライブラリの互換性を確保し、発生しうる統合問題に対処するための追加作業が必要になる。
一方、ethers.jsはEthereumネットワークとのやり取りに特化して設計されたJavaScriptライブラリであり、Ethereumとのインタラクションをより直接的かつ簡潔にする一連のAPIを提供する。Reactと比較すると、ethers.jsはブロックチェーンとのインタラクションにさらに焦点を当てており、ブロックチェーン関連の機能およびツールを多く提供している可能性がある。
TechFlow公式コミュニティへようこそ
Telegram購読グループ:https://t.me/TechFlowDaily
Twitter公式アカウント:https://x.com/TechFlowPost
Twitter英語アカウント:https://x.com/BlockFlow_News









