ブロックチェーン技術ブログ

ブロックチェーンと英語、数学に関するブログ

Ethereum入門1 <アカウント、トランザクション、ブロック、ガス>

Ethereumは、Bitcoinと同様に仮想通貨の一種です.
仮想通貨とは、ブロックチェーンの分散台帳に記録された交換可能な電子データです.

仮想通貨は、仲介業者を介することなく、当事者間で送金や商品の売買をおこなうことができます.
また、特定の団体が中央主権的に管理するのはではなく、各団体・個人が分散してノードを動かすことで管理しています.

Ethereum

Ethereumは、トランザクションによって状態を更新するステートマシンです.
アカウントや残高を保持するだけでなく、ステートを更新するコントラクトコードの実行をおこなうことが可能です.

Ethereumでは、トランザクションを実行するのにガスと呼ばれる手数料を支払う必要があります.
これは、不正なコードあるいは不備のあるコードがEVMのネットワークを浪費するのを防ぐためです.

コンセンサスメカニズムには、Proof of Stakeを採用しています.
仮想通貨をブロックチェーン上で管理するためには、全てのノードが同一のブロックチェーンに同意している必要があります.
ブロックチェーンに新たにブロックを追加するときのルールを定めたものがコンセンサスメカニズムです.

Ethereumは、コンセンサスメカニズムにProof of Work(PoW)を使用していましたが、2020年12月1日からProof of Stake(PoS)を採用しています.

PoSは、各バリデータがEther(Ethereum上の通貨)をステーク(賭け金)として、ブロックの検証や新たなブロックの作成をおこないます.
バリデータは、ブロックを検証・作成することによって、報酬を得ることができます.
しかし、バリデータが不正な行動をとったもしくはブロックの作成時にオフラインであった場合、ステークの全部あるいは一部を消失します.

Ether (ETH)

Ethereum上の通貨が Ether です.

また、wei や gwei といった単位が使われます.
 1wei = 10^{-18} ETH
 1gwei = 10^{-9} ETH ※グウェイと呼ばれます

アカウント

Ethereumには、外部アカウント(Externally-owned Account)とコントラクトアカウント(Contract Account)の2種類があります.

外部アカウントは、秘密鍵を持つ人によって管理されているアカウントです.
コントラクトアカウントは、EVMにデプロイされた送金などの様々なアクションをおこなうコードのアカウントです.

  • 外部アカウント・コントラクトアカウント 共通

    • ETHの保持・送金が可能
  • 外部アカウント

  • コントラクトアカウント

    • 作成(デプロイ)するのに、ガスを消費する
    • 外部コントラクトから呼び出されて、コントラクトコードを実行する
    • アドレスは、コントラクトアカウントを作成した人のアドレスとnonce(トランザクションに含まれるカウンター)から生成される

トランザクション

トランザクションは、外部アカウントによって送信されます.
また、EVM上でトランザクションを実行するのに、ガスを消費します.

トランザクションには、以下の3種類があります.

ガス

ガスは、Ethereum上でトランザクションを実行するに必要な計算量の単位です.
ガスが大きければ大きいほど、トランザクションの実行に必要な計算量が多くなります.

単純な送金の場合、gas limitは 21,000です.

トランザクションの実行に必要な手数料(ETH)は、以下の式で計算されます.
  gas limit * (base fee + priority fee)

パラメータ名 説明
base fee 1ガスあたりの最低価格
priority fee 1ガスあたりのマイナーへのチップ
max fee 手数料の上限 (base fee + priority feeを含めた値)

max fee を設定することで、ブロックを作成するまでbase feeがわからないことによって、もしくはコントラクコードの無限ループ等によって、指定した値より多くの手数料を払うことを避けることができます.
(base feeは、直前のブロックのガスの合計と新しく追加するブロックのガスの合計の割合によって決まるので、トランザクション送信時に正確な金額がわからない)

例) アリスがボブに1ETHを送金する (この時 base fee: 20 gwei, priority fee: 3 gwei)

単純な送金であるため、gas limitは21,000です.

21,000 * (20 + 3) = 483,000 gwei (0.000483 ETH)

アリスのアカウントから、1.000483 ETH が差し引かれます.
ボブのアカウントに、1 ETH が送金されます.

21,000 * 20 = 42,000 gwei (0.00042 ETH) が消失します. 21,000 * 3 = 6,300 gwei (0.000062 ETH) がマイナーにチップとして支払われます.

ブロック

ブロックは、複数のトランザクションをまとめたものです.
ブロックを順に繋いでいくことで、ブロックチェーンを構成します.

また、ブロックは、直前のブロックのハッシュ値を含んでいます.
Ethereumでは、ブロックチェーンのデータ構造に、マークルパトリシアツリーを利用し、ブロックやトランザクションの改ざんを検知できるようにしています.

ブロック追加の流れ

  1. バリデータの中から、ブロックを作成する人(プロポーザー)がランダムに選ばれる
  2. プロポーザーがトランザクションを任意の並び順で選択して、まとめる
  3. まとめたトランザクションを順に実行してコミットして、ステートを更新する
  4. トランザクションと更新されたステートをまとめてブロックを作成する
  5. 他のバリデータがブロックのトランザクションを実行して、検証する
  6. 検証に成功した場合、ブロックチェーンに追加する

ブロックに含まれるトランザクションのガス使用量の合計をブロックサイズと呼びます.

ブロックサイズには、上限がありその数は  3 * 10^{7} ガス です.
ブロックサイズが大きすぎる場合、ブロック内のトランザクションを実行するのに必要な計算リソースが大きくなり、一部のバリデータのみ実行可能となってしまいます.