🌐

【東京大学ブロックチェーン公開講座第5週】イーサリアム①

2024/05/09に公開

本記事は、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がある。

1 ether = 1 * 10^{18} wei = 1,000,000,000,000,000,000 wei

なお、Bitcoinにおけるsatoshiは

1BTC = 1 * 10^{8} satoshi = 100,000,000 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