JSON-RPC: Ethereumネットワークへの通信プロトコルの理解


## 1. Ethereumに接続する方法は？

次のような疑問を持った方はいますでしょうか。
「あなたがEthereumを使って何かをするとき、あなたのリクエストはどうやってEthereumネットワークに届けられると思いますか？」
さらに具体的に言い換えると
「あなたがスマートコントラクトを書き、それをデプロイしたいと思ったとき、具体的にはどのようにしてEthereumに接続し、そのスマートコントラクトを実行すると思いますか？」

もし既に何かしらのブロックチェーン開発を経験しているなら、自分がどのようにしてEthereumネットワークとの接続を行っていたか振り返ってみてください。簡単に思い浮かべられるかもしれませんね。しかし、そこに至るまでの一連の流れを具体的に考えたことはあるでしょうか？

「それはAPIを使うんだよね？」という答えが返ってきたら、正解です！でも、それだけでは全貌は語られません。私たちはその背後で動いているもの、つまりJSON-RPCというプロトコルを通じてEthereumネットワークに接続しているのです。

JSON-RPCとは何か、どのように動作するのか、そしてそれがスマートコントラクトとEthereumネットワークとどう関連しているのか。この記事ではこれらについて詳しく掘り下げていきます。


## 2. JSON-RPCとは

さて、それでは次にJSON-RPCについてお話しましょう。JSON-RPCって何かというと、それはクライアントとサーバー間でデータをやり取りする方法の一つです。具体的には、HTTP通信のような形で、JSON形式のメッセージを送受信します。これにより、クライアントはサーバー上の関数を呼び出し、その結果を得ることができるんです。これを日常的な状況に例えると、レストランでウェイターにオーダーを出すようなものです。あなたが注文を伝えると（JSON-RPCリクエスト）、ウェイターはキッチンへ行って料理を取りに行き（関数の実行）、最終的にあなたのテーブルに料理を運んでくる（JSON-RPCレスポンス）のです。

## 3. JSON-RPCの生成: ステップバイステップガイド

では、スマートコントラクトとのやり取りには具体的にどのようにJSON-RPCが使われるのでしょうか。まず、スマートコントラクトを作成すると、そのスマートコントラクトと通信するためのJSON-RPCリクエストが生成されます。このリクエストには、スマートコントラクトのアドレスや呼び出す関数の情報などが含まれます。そして、このリクエストをEthereumネットワークに送信することで、スマートコントラクトが実行され、その結果がJSON-RPCレスポンスとして返ってきます。

## 4. InfuraとAlchemy: スマートコントラクト開発の支え

では、スマートコントラクトとのやり取りを助けるサービスは何かというと、それがInfuraとAlchemyです。InfuraとAlchemyは、開発者がEthereumネットワークと通信するためのAPIエンドポイントを提供しています。これにより、開発者は自分でフルノードを立てる必要なく、簡単にスマートコントラクトと通信することができます。これらのサービスは、スマートコントラクト開発者にとって重要なインフラとなっています。

## 5. 実際の開発フロー: JSON-RPCの自動生成と使用例

では、実際の開発フローはどのように進んでいくのでしょうか。大まかに言えば、スマートコントラクトのコードを書いてデプロイした後、そのスマートコントラクトと通信するためのJSON-RPCリクエストが生成されます。そのリクエストをInfuraやAlchemyのAPIエンドポイントに送信することで、スマートコントラクトがEthereumネットワーク上で実行され、その結果がレスポンスとして返ってくるのです。

具体的なコード例を見てみましょう。たとえば、以下のようなコードを書いてスマートコントラクトをデプ

ロイするとしましょう。

```js
// スマートコントラクトのコード
contract MyContract {
    function greet() public returns (string memory) {
        return "Hello, Ethereum!";
    }
}
```

このスマートコントラクトをデプロイした後、以下のようなコードを書くことで、`greet`関数を呼び出すJSON-RPCリクエストを生成し、そのリクエストを送信することができます。

```js
// JSON-RPCリクエストの生成と送信
const myContractAddress = '0x123...'; // スマートコントラクトのアドレス
const myContractABI = [...]; // スマートコントラクトのABI

const myContract = new web3.eth.Contract(myContractABI, myContractAddress);

myContract.methods.greet().call((err, result) => {
    console.log(result); // "Hello, Ethereum!"
});
```

このコードでは、まず`web3.eth.Contract`を使ってスマートコントラクトのインスタンスを作成しています。次に、そのインスタンスの`methods`オブジェクトを通じて`greet`関数を呼び出し、その結果をコールバック関数で受け取っています。ここで、`call`メソッドは実際にはJSON-RPCリクエストを生成し、そのリクエストをEthereumネットワークに送信しています。このように、実際のコードレベルではJSON-RPCリクエストの生成と送信が自動的に行われます。

## 6. APIキー: 開発者の鍵と盾

では、APIキーとは何なのでしょうか。APIキーは、あなたがサービスの利用者であることを証明するためのツールです。サーバー側では、このAPIキーを見てあなたのリクエストを認証し、許可された操作だけを許します。APIキーは通常、アカウント作成時に自動的に発行され、あなたのアカウント設定ページから取得できます。

APIキーの使い方は簡単です。通常、APIリクエストを送信する際に、HTTPヘッダーに`Authorization`フィールドとしてAPIキーを含めます。サーバー側では、このAPIキーを見てリクエストを認証します。たとえば、以下のようにAPIキーを使ってInfuraのAPIエンドポイントにリクエストを送信することができます。

```js
// APIリクエストの送信
fetch('https://mainnet.infura.io/v3/your-project-id', {
    method: 'POST',
    headers: {
        'Content-Type': 'application/json',
        'Authorization': 'Bearer your-api-key' // APIキー
    },
    body: JSON.stringify({
        jsonrpc: '2.0',
        id: 1,
        method: 'eth_blockNumber',
        params: []
    })
})
.then(response => response.json())
.then(data => console.log(data)); // ブロックナンバー
```

このコードでは、`fetch`関数を使ってInfuraのAPIエンドポイントにPOSTリクエストを送信しています。その際に、HTTPヘッダーの`Authorization`フィールドにAPIキーを含めています。これにより、Infuraのサーバーはあなたのリクエストを認証し、リクエストされた`eth_blockNumber`関数を実行します。

## 7. JSON-RPCプロトコルの詳細解説

最後に、JSON-RPCプロトコルについて詳しく解説しましょう。JSON-RPCプロトコルは、クライアントとサーバー間でデータをやり取りするためのプロトコルで、JSON形式のメッセージを使用します。その基本的な形式は以下のようになっています。

```json
{
    "jsonrpc": "2.0

",
    "method": "methodName",
    "params": [param1, param2, ...],
    "id": requestId
}
```

ここで、`jsonrpc`フィールドはプロトコルのバージョンを表し、`method`フィールドは呼び出す関数の名前を表します。`params`フィールドはその関数に渡すパラメータの配列を表し、`id`フィールドはリクエストの識別子を表します。これにより、クライアントはサーバー上の関数を呼び出し、その結果を得ることができるのです。

以上が、Ethereumとスマートコントラクトの魔法の世界と、その背後で働くJSON-RPCとAPIキーの基本的な知識と使い方です。