【東京大学ブロックチェーン公開講座第5週】イーサリアム①
本記事は、2024年東京大学ブロックチェーン公開講座の5つ目のレポートです。
【東京大学ブロックチェーン公開講座第1週】ブロックチェーン概論
【東京大学ブロックチェーン公開講座第2週】ビットコイン①
【東京大学ブロックチェーン公開講座第3週】ビットコイン②
【東京大学ブロックチェーン公開講座第4週】ビットコイン③
【東京大学ブロックチェーン公開講座第5週】イーサリアム①(本記事)
なお、本記事は講座の要約ではなく、講座のポイントを抽出しつつ、筆者の理解や考察を添えてアウトプットしたものとなります。講座内容との差異や筆者の主張(オレンジ背景)が含まれます。
イーサリアムもビットコインと同様、初期のものと現行のものでバージョンアップが入っており、それなりに違いがあるそうです。本記事の内容は初期のイーサリアムについてです。
Ethereumとはなにか
Ethereumは、Bitcoin Protocolを一般化したもの。ワールドコンピュータを実装し、そのうえでアプリケーション開発をしたい(DApps, Decentralized Applications)、というモチベーション。
処理の一般化:送金(ビットコイン)から、プログラムへ(状態=stateを持てるように)
管理対象の一般化:トークンの移転記録(ビットコイン)からアカウントがもつ状態(state)の遷移記録へ
また、このプログラムを『スマートコントラクト』という。
大枠の仕様
主にBitcoin Protocolとの違いを解説していく。
アカウント
イーサリアムには、以下2つのアカウントが存在する。ビットコインにおけるアドレスはEOAに近い概念。
Type | Description |
---|---|
EOA(Externally Owned Account) | 人が管理するアカウント。秘密鍵を持ち、トランザクションを作ることができる。 |
CA(Contract Account) | スマートコントラクトのアカウントで、スマートコントラクトコードを持つ。秘密鍵を持たず、トランザクションを作ることができない。 |
トランザクション
トランザクションはEOAから発行され、以下2種類がある。また、実行後には結果をまとめたレシートが発行される。
Type | Description |
---|---|
Message Call | 送金に相当する、一般的なトランザクション。 |
Contract Creation | スマートコントラクトを生成するトランザクション。 |
送信元・送信先によって、以下の分類になる。
From | To | Transaction Type | Description |
---|---|---|---|
EOA | EOA | Message Call | 送金トランザクション |
EOA | CA | Contract Creation | コントラクト生成 |
EOA | CA | Message Call | コントラクトの実行 |
Internal Transaction
トランザクションとは異なり、CA起点のデータの動きがInternal Transaction。送信先はCA・EOAのどちらもあり、内部的にCAが別アカウントに送金したり、新しいコントラクトを作成したりする。
ただし、あくまでトリガーはEOAによるMessage Call。また、Internal Transactionはブロックチェーンに記録されず、レシートも発行されない。
EVM(Ethereum Virtual Machine)
すべてのマイナーノードはEVMという仮想マシン(実行環境)を持つ。トランザクションの実行にスマートコントラクトの実行が伴うため、その実行環境が必要なため。
スマートコントラクトはSolidityで記述し、EVMはSolidityをbytecodeに変換して実行する。
状態(state)データの保管
トランザクションはブロックチェーン内に記録されるが、実行結果を示す状態(state)データは各マイナーノードがブロックチェーン外の領域に保持する。ただしstateデータの要約(後述)はブロックチェーン内に記録される。
ブロックチェーン上のデータ量が肥大化するのを防ぐため、このような設計になっている。
各構成要素が保持するデータ
EOA
ビットコインにおける秘密鍵・公開鍵・アドレスと概要は同じで、乱数の秘密鍵から楕円曲線で公開鍵を求め、公開鍵ハッシュからアドレスを導出する。
違いとして、以下2点がある。
- 公開鍵ハッシュに用いるハッシュ関数はkeccak-256(SHA256より安全)
- アドレスにはチェックサムがない(アドレスと文字列を紐づけて使う構想、ドメインとIPアドレスのイメージ)
EOAが保持する状態データ
Type | Description |
---|---|
Nonce | EOAにより実行されたトランザクションの累計数 |
Balance | EOAが所持する残高(wei) |
アカウントが残高を保持するモデルで、アカウントベースモデルという。ビットコインのUTXOとは異なる。
Ethereumの通貨単位
Ethereumの通貨はEther(イーサ・ether・ETH)。BitcoinにおけるBTCに相当するもの。etherの最小単位としてweiがある。
なお、Bitcoinにおけるsatoshiは
CA
CAもアドレスをもつが、EOAとは大きく異なる。秘密鍵を持たない。
そのコントラクトを作成したEOAのアドレスと、そのEOAの保持するNonceをハッシュ化(keccak-256)して得られるユニークなアドレス。
CAが保持する状態データ
Type | Description |
---|---|
Nonce | CAにより作成された別のCAの累計数 |
Balance | CAが所持する残高(wei) |
Code Hash | コントラクトの中身(プログラムコード)をハッシュ化したもの |
Storage Root | コントラクトの状態をハッシュ化したルート(後述) |
プログラムコード自体は、Contract Creationトランザクション内に存在(後述)
マークル・パトリシアツリー
マークルツリーとパトリシアツリーを組み合わせたもの。探索の効率性を高めるために利用される。Ethereumにおける木構造のデータ保存はすべてマークル・パトリシアツリーになっている。
トランザクション
Message Callトランザクション
Field | Description | Memo |
---|---|---|
blockhash | このtxを含むブロックのブロックヘッダーハッシュ | マイニング前はnull |
blocknumber | このtxを含むブロックのブロック高 | マイニング前はnull |
transaction index | このtxを含むブロック内でのインデックス | マイニング前はnull |
from | このtxを作成したEOAアドレス | 正確には署名欄(ECDSA)で、署名からアドレスを導出 |
to | このtxの宛先アドレス(EOA/CA) | |
nonce | 送信者が実行したtx累計数 | |
hash | このtxのハッシュ | |
value | 送信するetherの量(wei) | |
data | データ領域(16進数のbytecode) | コントラクト実行時は引数を入れる |
gasLimit | EOAがtx実行に対して支払えるGasの最大量 | 手数料(後述) |
maxPriorityFeePerGas | EOAがマイナーに支払えるGasの最大金額 | 手数料(後述) |
maxFeePerGas | EOAがtx実行のために支払えるGasの最大金額 | 手数料(後述) |
Message Callトランザクションのレシート
Field | Description | Memo |
---|---|---|
blockhash | このtxを含むブロックのブロックヘッダーハッシュ | マイニング後なので値が入っている |
blocknumber | このtxを含むブロックのブロック高 | マイニング後なので値が入っている |
transaction index | このtxを含むブロック内でのインデックス | マイニング後なので値が入っている |
contractAddress | 作成したCAのアドレス | ContractCreationでないのでnull |
from | このtxを作成したEOAアドレス | |
to | このtxの宛先アドレス(EOA/CA) | |
hash | このtxのハッシュ | |
gasUsed | tx実行に使ったGasの量 | |
cumulativeGasUsed | tx実行に使ったGasの量(internal transaction含む) | |
logs | tx実行ログ | |
logsBloom | ブロック内の全tx実行ログ(Bloom Filter形式) | |
root | tx実行の結果変化したアカウント状態(state)の要約 | (後述) |
Ethereumの手数料(gas)
Bitcoinと同様、Ethereumのトランザクション実行には手数料が必要。スパム攻撃対策、マイナーへのインセンティブとして利用される。
Ethereumでは、手数料の指定にether(wei)ではなくgasという単位をかませている。これはトランザクション実行に必要な計算量をマイナーノードに分かりやすく示すため。
Ethereumではトランザクションを起点として複数のInternal Transactionが発生する可能性があり、そのトランザクションの実行にかかる計算量がトランザクションサイズ(データ量)から推測できないため。
例:手数料0.1etherではなく、feePerGas = 0.000002ether, gasLimit=50000(=0.1ether)といった入力
用語の整理は以下のとおり。feePeaGas(計算単位あたりの手数料)は、baseとpriorityの2階建てになっている。主な目的は、スケーラビリティの課題(後述)への対処と、etherの総供給量を減らすため。
Name | Type | Description |
---|---|---|
Gas | 所与 | スマートコントラクトの計算量に基づいて定められている |
baseFeePerGas | 所与(ブロックごと) | tx実行に必要な1gasあたりの費用(wei/gas)。Ethereumの混雑具合によって変動。baseFeeはマイナーには渡らず、burnされる |
priorityFeePerGas | EOAが設定 | マイナーに支払う1gasあたりの費用(wei/gas)。Bitcoinにおける手数料に相当、高いほどブロックに取り込まれやすい |
GasLimit | EOAが設定 | tx実行にあたり支払えるgasの上限値。事前にどのくらいgasが必要か分からない場合がある、手数料が無限になることを避ける(無限ループなど) |
GasUsed | - | tx実行した結果、実際にかかったgasの値 |
これらを元にマイナーノードがトランザクションを選定して実行する。結果として、以下の2ケースに集約される。
手数料が不足するケース
実際の手数料(feePerGas * gasUsed) > EOAが支払い可能な手数料(feePerGas * gasLimit)
この場合、トランザクションは実行されないが、feePerGas * gasLimit分のetherは消費される(base分はburn, priority分はマイナーへ)
手数料が余るケース
実際の手数料(feePerGas * gasUsed) < EOAが支払い可能な手数料(feePerGas * gasLimit)
この場合、トランザクションは実行され、feePerGas * gasLimit分のetherは消費され、余ったehterはEOAに返却される。
Contract Creationトランザクション
Field | Description | Memo |
---|---|---|
blockhash | このtxを含むブロックのブロックヘッダーハッシュ | マイニング前はnull |
blocknumber | このtxを含むブロックのブロック高 | マイニング前はnull |
transaction index | このtxを含むブロック内でのインデックス | マイニング前はnull |
from | このtxを作成したEOAアドレス | 正確には署名欄(ECDSA)で、署名からアドレスを導出 |
to | このtxの宛先アドレス(EOA/CA) | 必ずゼロアドレス(0x000...) |
nonce | 送信者が実行したtx累計数 | |
hash | このtxのハッシュ | |
value | 送信するetherの量(wei) | |
data | データ領域(16進数のbytecode) | 作成するCAの中身(プログラム) |
gasLimit | EOAがtx実行に対して支払えるGasの最大量 | 手数料 |
maxPriorityFeePerGas | EOAがマイナーに支払えるGasの最大金額 | 手数料 |
maxFeePerGas | EOAがtx実行のために支払えるGasの最大金額 | 手数料 |
Contract Creationトランザクションのレシート
Field | Description | Memo |
---|---|---|
blockhash | このtxを含むブロックのブロックヘッダーハッシュ | マイニング後なので値が入っている |
blocknumber | このtxを含むブロックのブロック高 | マイニング後なので値が入っている |
transaction index | このtxを含むブロック内でのインデックス | マイニング後なので値が入っている |
contractAddress | 作成したCAのアドレス | アドレスが入る |
from | このtxを作成したEOAアドレス | |
to | このtxの宛先アドレス(EOA/CA) | 必ずゼロアドレス(0x000...) |
hash | このtxのハッシュ | |
gasUsed | tx実行に使ったGasの量 | |
cumulativeGasUsed | tx実行に使ったGasの量(internal transaction含む) | internal transactionがないため、gasUsedと等しい |
logs | tx実行ログ | |
logsBloom | ブロック内の全tx実行ログ(Bloom Filter形式) | |
root | tx実行の結果変化したアカウント状態(state)の要約 | (後述) |
Internal Transaction
CAから発せられる、ブロックチェーンに記録されない処理(正確にはトランザクションではない)。マイナーノードが保持する状態(state)データから逆算して把握する。レシートは発行されない。
Field | Description | Memo |
---|---|---|
from | このinternal transactionを作成したCAアドレス | 必ずCAのアドレス |
to | このinternal transactionの宛先アドレス(EOA/CA) | |
value | 送信するetherの量(wei) | |
data | データ領域(16進数のbytecode) | 呼び出される関数と引数など |
type | internal transactionの分類 | CALL, DELEGATECALL, CREATE, SUICIDEなど |
gas | internal transactionに必要な計算量 |
Bitcoinにおけるトランザクション(UTXO)
比較として、UTXOのトランザクションは以下のようなデータ構造。
Field | Description | Memo |
---|---|---|
version | txフォーマットバージョン | |
input-counter | txに含まれる入力の数 | |
inputLists | 入力のリスト | 各inputは、pre |
output-counter | txに含まれる出力の数 | 呼び出される関数と引数など |
outputLists | 出力のリスト | CALL, DELEGATECALL, CREATE, SUICIDEなど |
locktime | タイムスタンプまたはブロックナンバー | txが特定の時間またはブロック高に到達するまでに処理を遅延させるために利用 |
第5回ここまで
Discussion