
このブログでは、分散型ネットワークとスマートコントラクトによってweb3がどのように開発を変えるかを探り、Ethereumを始めるための重要な知識とツールを提供します。

オンラインのやり取りが、透明性・セキュリティ・ユーザーコントロールを保証する分散型ネットワークによって動く世界を想像してみてください。これが、ブロックチェーン技術を基盤とするweb3が約束する世界です。本記事では、Ethereumブロックチェーン上での開発を理解するために必要な基本概念とツールを解説します。
web2におけるクライアント・サーバーアーキテクチャの仕組みを説明する際、「キッチンのアナロジー」がよく使われます。このアナロジーでは、サーバーはキッチンのようなもので、クライアント(ユーザー)は料理を注文するように、リクエストを送ります。サーバーはそのリクエストを処理し、調理済みの料理を提供するようにデータを返します。APIはウェイターの役割を果たし、注文をキッチンに届け、料理を持ち帰ることで、クライアントとサーバーが共通言語を持たなくても、両者のコミュニケーションを仲介します。
このキッチンのアナロジーをweb3の説明にも応用できますが、いくつかの重要な違いがあります。たとえば、複数の同一キッチン(ノード)が存在し、そのうちの1つがランダムに選ばれること、そして料理を受け取る前に調理費用を前払いしなければならないことが挙げられます。
これらのアナロジーを使って、ユーザーがdappと対話する際に裏側で何が起きているかを理解しましょう。アナロジーは完全ではありませんが、Ethereumでの開発を始めるためのメンタルモデルを構築するのに役立ちます。
分散型の世界には、従来の「サーバー」は存在しません。代わりに、分散型ノードが世界中に広がり、協力して驚くべき成果を実現しています。これらのノードは共同で、ブロックチェーンと呼ばれる共有された改ざん不可能な台帳を維持し、すべてのトランザクションのセキュリティと透明性を確保します。どのノードでも、あなたのトランザクションを処理したり、スマートコントラクトのコードを実行したりすることができます。
ブロックチェーンノードとは、ブロックチェーンプロトコルのソフトウェアを実行し、そのネットワークに接続するコンピューターのことです。これらのノードは分散型ネットワークの根幹をなし、ブロックチェーンのインフラを維持する重要な担い手として機能します。ノードはストレージポイントとして機能するため、ユーザーがブロックチェーン上のデータにアクセスする際は、必ずノードとやり取りすることになります。ノードは透明性が高く、ネットワーク上の誰でもアクセスできます。
ブロックチェーンは中央機関なしで運営されるため、制御はノードのネットワーク全体に分散されており、トランザクションの検証やガバナンスプロトコルの実行といったタスクをノードが共同で処理します。ブロックチェーン上のすべてのトークンとスマートコントラクトはノード内に存在するため、ノードはブロックチェーンの機能にとって不可欠な存在です。ノードがなければ、ブロックチェーンの基盤となる構造は成り立ちません。
スマートコントラクトとは、ブロックチェーン上で動作する自己実行型のプログラムで、合意の条件がコード内に直接記述されています。特定の条件が満たされると、コントラクトは合意された条件を自動的に執行・実行し、仲介者を必要としません。
しかし、この分散型ネットワークにおける大きな課題は、中央集権的な機関が存在しない中で、ノードが誠実に行動し、ユーザーのリクエストを正しく処理することを保証することです。ここで「コンセンサス」という概念が重要になります。
コンセンサスメカニズムは、すべてのトランザクションがノードによって検証・合意されることを保証し、不正行為や二重支払いを防ぎながら、ブロックチェーンの整合性を維持します。キッチンのアナロジーで言えば、選ばれたキッチンが注文を準備した後、完成した料理とレシピを他のキッチンと共有します。他のキッチンは同じレシピに従い、結果を比較し、注文が正しく準備されたことを共同で確認することで、ネットワーク全体の一貫性と正確性を確保します。
web2ではサーバーのデプロイのためにインフラを管理する必要がありましたが、web3ではバックエンドのロジックの多くがブロックチェーン上のスマートコントラクトに移行します。以下は、スマートコントラクト開発のライフサイクル全体を効率化する開発環境です:
Hardhat: スマートコントラクトとアプリの編集・コンパイル・デバッグ・デプロイのためのコンポーネントを含む包括的な開発環境です。JavaScriptに精通しており、Webテクノロジーとの広範な統合が必要な場合に最適です。
Foundry: Solidityエコシステム内ですべてを完結させる高速で効率的な選択肢で、そのスピードとSolidityのネイティブサポートによって生産性を向上させます。
HardhatとFoundryの詳細な比較については、ガイドChoosing the Right Ethereum Development Toolをご覧ください。
Remix: 必須オペレーション用のプラグインがプリロードされたオンラインIDEで、ローカルに何もインストールせずにコードを素早くテストするのに最適です。
開発者はさまざまな高水準プログラミング言語を使用してスマートコントラクトを記述でき、それらは低水準のバイトコードにコンパイルされます。最もよく使われる2つの言語は:
Solidity: JavaScriptに似た構文で知られており、多くの開発者にとって親しみやすい言語です。
Vyper: セキュリティと可読性を重視して設計されており、Pythonに似た構文を持ちます。
その他の言語にはYul、Cairo、Rustがあり、開発ニーズに応じた追加の選択肢を提供しています。
料理の注文はどのようにしてテーブルからキッチンへ届き、完成した料理はどのようにしてテーブルに戻ってくるのでしょうか?もちろん、ウェイターを通じてです!
web2では、REST APIが「ウェイター」の役割を果たし、アプリケーションとビジネスロジックが存在するバックエンドサーバーとの通信を仲介します。このバックエンドとやり取りするには、URLとさまざまな操作のための特定のエンドポイントが必要です。
web3では、ブロックチェーンノードとのやり取りはJSON-RPC APIを介して行われます。このAPIは、JSON-RPC呼び出しのボディ内にビジネスロジックを含むコントラクトを指定することで、複数のdappが同じURLとやり取りできるようにします。JSON-RPC APIはあまり馴染みがないかもしれませんが、以下に示すように、一般的なHTTPリクエストと同様に機能します:
リクエストのボディにあるdataオブジェクトの内容をよく見てみましょう:
{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":1}JSON-RPCのバージョン、目的のアクションのメソッド(例:最新のブロック番号の取得)、オプションのパラメーター、そしてリクエストを追跡するためのIDが含まれています。このフォーマットは、データの取得やブロックチェーンアクションの実行など、Ethereumノードとの通信を標準化します。
リクエスト内のURLはInfuraを指しており、これは自分でEthereumノードを設定・維持する複雑さとリソースの負担を省いてくれるノードプロバイダーです。このURLはブロックチェーンへのゲートウェイとして機能します。
先ほど調理費用を前払いするという点に触れましたが、web3ではトランザクションの実行に「Gas fee」と呼ばれるコストが発生します。このコストはトランザクションの複雑さと、その時点でのネットワークの混雑状況によって異なります。ただし、ブロックチェーンからのデータ読み取りは無料です。
トランザクションが正しく理解・実行されるためには、標準化された記述方法が必要です。ここでABI(Application Binary Interface)の出番です。ABIはメニューのような役割を果たし、スマートコントラクトの関数とのやり取り方法を定義し、必要なパラメーターと関数の実行方法を指定します。
では、dappはデプロイされたスマートコントラクトとどのように通信するのでしょうか?これまで説明したように、JSON-RPC APIを使用する必要がありますが、このプロセスを簡略化するためにいくつかのライブラリが役立ちます。JavaScriptではEthers.jsやViemが選択肢として挙げられ、Reactベースのフロントエンドには、EthereumのためのReact HooksライブラリであるWagmiが特に有用です。これらのライブラリはJSON-RPC呼び出しをラップし、ブロックチェーンやデプロイされたコントラクトとのやり取りをより管理しやすくします。
Viem、そしてその拡張であるWagmi(内部でviemを使用)は、強力な型付きAPIを提供し、オートコンプリート・型推論・静的バリデーションによって開発者体験を向上させます。ABIを提供することで、viemはオートコンプリートを提供し、型エラーがユーザーに影響を与える前に検出します。
ethers.jsとviemのどちらを選ぶか迷っていますか?Web3開発者向け詳細比較はこちらをご覧ください。
スマートコントラクトとやり取りする方法は複数ありますが、最もポピュラーな方法を探ってみましょう。それは、ブロックチェーンとやり取りするために設計された分散型のWebまたはモバイルアプリであるdappを通じた方法です。
では、dappは一般的なWebアプリと何が違うのでしょうか?見た目には大きな違いがないことが多いです。開発者はweb2で使い慣れたWebフレームワーク(React、Next.js、バニラJavaScriptなど)をweb3でも使用でき、dappのデプロイ方法もほぼ同じです。ただし、web3ではIPFS(InterPlanetary File System)やSWARMといった分散型ストレージソリューションが一般的に使用されます。
ほとんどのweb3アプリに共通する特徴的な機能が「Connect Wallet」です。dappで「Connect Wallet」をクリックすると、アプリケーションがあなたのウォレットとやり取りすることを承認し、公開アドレスの読み取りやあなたの代わりにトランザクションをリクエストすることを許可します。トランザクションは、ユーザーがそのアクションを実行する権限を持つことを確認するために認証される必要があります。これは署名というプロセスによって実現され、ウォレットに安全に保存されたEthereumアカウントの所有権を証明する固有の識別子である秘密鍵を使用します。
ウォレットについてさらに詳しく見てみましょう。ウォレットにはブラウザ拡張機能、モバイルアプリ、物理デバイスなどさまざまな形態があり、MetaMaskはその中でも最もポピュラーなものの一つです。現実世界のレストランが複数の支払い方法に対応しているように、dappでも複数のウォレットをサポートする必要があるかもしれません。
Connect Wallet機能を簡単に実装し、さまざまなウォレットタイプをサポートするには、以下のツールの使用を検討してください:
これらのツールは統合プロセスを効率化し、dappとユーザーのウォレット間のシームレスな接続を実現します。
web3開発は、ブロックチェーン上のスマートコントラクトを活用することでアプリの仕組みを変え、永続性を持たせ、バックエンドのタスクを中央集権的なサーバーから移行させます。この変化により、開発者はトランザクション署名、Gas feeの処理、JSON-RPC APIの使用といった事柄に慣れ親しむ必要があり、従来のweb2開発とは一線を画しています。これは難しい挑戦でもありますが、同時に新しくエキサイティングな可能性を切り開くものでもあります。
web3開発についてさらに学び、最新のツールやベストプラクティスの情報を得るには、開発者向けのインサイトやガイドを提供するMetaMaskブログをご覧ください。
AIによる翻訳です。エラーが含まれている可能性があります。常に情報を確認してください。