ワールドコンピュータの内部
Ethereum はしばしば「ワールドコンピュータ」と呼ばれます。しかし、従来のサーバーとは異なり、Ethereum 上のあらゆるインタラクションは、ネットワーク内のすべてのノードが同じ状態に到達することを保証する一連の厳格な低レベルプロトコルによって定義されています。
開発者やパワーユーザーにとって、ABI、RLP、および EVM バイトコードといったこれらのプロトコルを理解することは、トランザクションのデバッグ、スマートコントラクトとのやり取り、およびガス使用量の最適化に不可欠です。このガイドでは、Ethereum エコシステムの技術的基盤を分解して解説します。
1. アプリケーション・バイナリ・インタフェース (ABI)
ABI は、Ethereum エコシステムでスマートコントラクトと対話するための標準的な方法です。スマートコントラクトはバイトコードにコンパイルされるため、どの関数を呼び出し、どのような引数を渡すかを EVM に伝える方法が必要になります。
関数セレクター
Solidity コントラクトのすべての関数は、その関数セレクターによって識別されます。
- シグネチャ:関数名とそのパラメータの型を取得します(例:
transfer(address,uint256))。 - ハッシュ:その文字列の Keccak-256 ハッシュを計算します。
- セレクター:ハッシュの最初の 4 バイト。
コントラクトにトランザクションを送信するとき、「Data」フィールドの最初の 4 バイトが関数セレクターです。関数セレクターデコーダーを使用すると、トランザクションがどのようなアクションを実行しているかを特定するのに役立ちます。
引数のエンコーディング
ABI は、さまざまなデータ型(uint、address、string、bytes)を 32 バイト(256 ビット)のスロットにパッキングする方法を定義しています。固定サイズの型は順番にパッキングされますが、動的な型(文字列や配列など)は、ペイロードの最後にある実際のデータを指すためにオフセットを使用します。これらのデータを生成したり、トランザクションから解析したりするには、ABI エンコーダーデコーダーが必要です。
2. RLP (Recursive Length Prefix) シリアル化
ABI はコントラクトとの対話に使用されますが、RLP は、トランザクションやブロックなどのオブジェクトをシリアル化するために Ethereum の実行レイヤーで使用される主要なエンコーディング手法です。
なぜ JSON や Protobuf ではないのか?
RLP は、絶対的なシンプルさとスペース効率のために設計されました。JSON とは異なり、メタデータ(キーや引用符など)がありません。構造と生のバイトデータのみをエンコードします。
RLP の仕組み
RLP はデータの長さに戻づいてエンコードします:
- 短い文字列:(0-55 バイト) は単一のバイト (
0x80+ 長さ) でプレフィックスされます。 - 長い文字列:マルチバイトの長さインジケーターでプレフィックスされます。
- リスト:(配列) は
0xc0+ シリアル化された項目の総長さでプレフィックスされます。
送信するすべてのトランザクションは、署名されてネットワークにブロードキャストされる前に RLP エンコードされます。生のトランザクションの 16 進データを分析するには、RLP エンコーダーデコーダーが不可欠なツールです。
3. Ethereum の単位:Wei から Ether まで
Ether (ETH) は小数点以下 18 桁まで分割可能です。スマートコントラクトでの「小数点オーバーフロー」エラーを避けるためには、これらの単位を理解することが不可欠です。
| 単位 | 値 (Wei 単位) | 一般的な名称 |
|---|---|---|
| Wei | 1 | 最小単位。 |
| Gwei | 1,000,000,000 ($10^9$) | ガスの価格に使用されます。 |
| Szabo | $10^{12}$ | マイクロイーサ (Microether)。 |
| Finney | $10^{15}$ | ミリイーサ (Milliether)。 |
| Ether | $10^{18}$ | 主要な通貨単位。 |
Ethereum 単位変換器 (または Wei/Gwei/ETH 変換器) を使用することで、正しい金額を送信し、適切なガス価格を設定することができます。
4. EVM とバイトコード
Solidity コントラクトをコンパイルすると、EVM バイトコードになります。このバイトコードは、オプコード (Opcodes) (実行コード) のシーケンスです。
オプコードとガス
各オプコード(ADD、MUL、SSTORE、SLOAD など)には、固定の「ガス」コストがあります。
SSTORE(データの保存):非常に高価。ADD(数学計算):非常に安価。
逆アセンブル
EVM バイトコード逆アセンブラは、生の 16 進コードを取得し、人間が読めるオプコードに戻します。これは、セキュリティ研究者が Etherscan 上でソースコードが公開されていない「未検証」のコントラクトを監査するために使用されます。
FAQ:Ethereum の内部構造
Q: 「関数シグネチャ」とは何ですか?
A: 関数の人間が読める文字列表現です(例:deposit())。そのハッシュによって 関数セレクター が決定されます。
Q: Ethereum のトランザクションはどれでもデコードできますか?
A: コントラクトの ABI (JSON) があれば、入力データをデコードできます。ABI がなくても、生のバイトと関数セレクターを確認することはできます。4byte.directory のようなサービスを使えば、セレクターを既知のシグネチャと照合できることがよくあります。
Q: なぜガスに Gwei が必要なのですか?
A: ETH は価値が高すぎるため、ガスの基本単位として使用するには不向きだからです。Gwei (Giga-Wei) を使用することで、先行する大量のゼロを扱うことなく、ネットワークリソースの細かな価格設定が可能になります。
Q: トランザクションの「Input Data」フィールドとは何ですか?
A: コントラクト呼び出しの場合、ABI エンコードされた関数セレクターと引数が含まれます。コントラクトデプロイの場合、EVM デプロイバイトコードが含まれます。
結論
Ethereum のスタックは、効率性と決定論的な実行における傑作です。RLP のコンパクトなシリアル化から ABI の構造化されたインタフェースまで、あらゆるレイヤーが分散型環境向けに最適化されています。これらの概念をマスターすることで、あなたは単なるユーザーから、最も根本的なレベルで「ワールドコンピュータ」を使いこなすパワーユーザーへとステップアップできるでしょう。