📖

Chapter1: イーサリアム入門 | Solidity Programming Essentialsを読む

2022/08/02に公開

イーサリアムの知識を整理するために2022年6月発売のSolidity Programming Essentials 2nd Editionを読み進める試みです。この記事ではChapter1を読み進めます。

Solidity Programming Essentials: A guide to building smart contracts and tokens using the widely used Solidity language, 2nd Edition (English Edition)

読書ログは以下のスクラップで逐次更新していきます。
https://zenn.dev/mah/scraps/ea8c79961ae8c8


いわゆるブロックチェーンに関する説明なので、ほとんどの人は飛ばし読みでOK。イーサリアム特有のトピックについてのみ、まとめていく。

イーサリアムノード

P2Pで接続されているノードには3つの種類がある。

  • EVM(Ethereum Virtual Machine)
  • マイニングノード(Ethereum 1.0)
  • バリデータ(Ethereum 2.0)

ただ、現実には種類毎に専用のノードは存在せず、各ノードが全ての機能を兼ねている。

EVM(Ethereum Virtual Machine)とは?

スマートコントラクトの実行ランタイム。

  • コントラクトと外部アカウント(externally owned accounts)、自身のストレージデータにアクセス可能
  • 元帳全体にはアクセスできないが、現在の取引に関する限られた情報は持っている
  • トランザクションは即座に実行されるわけではなく、トランザクションプールに追加される(この時点ではまだイーサリアムの台帳に書き込まれていない)

マイニングノード(Ethereum 1.0 / Proof of Work)

ブロック生成、検証、およびチェーンへの追加を担当する。マイニングノードには以下の種類がある:

  • フルノード:ジェネシスブロック以降の全てのブロックと完全なグローバルステートを持ち、ブロックの生成と検証に参加することができる
  • ライトノード:ヘッダーのみのブロックを持ち、必要な情報は接続されているフルノードに依存する
  • アーカイブノード:フルノードだが、過去の情報を照会したりレポートを作成するために使われる

バリデータ(Ethereum 2.0 / Proof of Stake)

チェーンに新しいブロックを生成する役割を担うノードだが、マイニング処理は行わない。取引プールから利用可能な全ての処理を集め、ブロックを生成し、そのブロックを他のバリデータにブロードキャスト、認証を行う。認証プロセスの一環として、バリデータは各取引を実行し、自分のチェーンにブロックを追加しながら状態を変更する。

アカウント

外部アカウント(Externally owned accounts)

イーサリアム上で人が所有しているアカウントのこと。

個人がイーサリアム上で外部アカウントを作成すると公開鍵と秘密鍵が生成され、公開鍵がこの外部アカウントのアイデンティティとなる。公開鍵は通常256文字だが、イーサリアムでは最初の160文字でアカウントのアイデンティティを表現する。外部アカウントは残高にEtherを保持することができ、他の外部アカウントと取引を行うことができ、コントラクト内の関数を呼び出して取引を実行することもできる。

コントラクトアカウント

秘密鍵はなく、公開アドレスで識別される。外部アカウントと同様にEtherを所有することができるが、関数と状態変数で構成されるスマートコントラクト用のコードが含まれる。外部アカウントは取引を開始する役割を持っており、取引にはトランザクションのコストであるガスが必要である。

Ether、ガス、トランザクション

Etherはイーサリアムの通貨であり、イーサリアムの状態を変更する全ての活動は手数料としてEtherを請求する。チェーンのブロックを生成して書き込むことに成功したマイナーにはEtherが報酬として支払われる。Etherは取引所を通じてドルや他の通貨に変換することができる。

イーサリアムでは小数点を扱えないので、weiを最小単位として10の18乗weiをetherとしている。

// https://github.com/ChainSafe/web3.js/blob/0.15.0/lib/utils/utils.js#L40
var unitMap = {
    'wei':          '1',
    'kwei':         '1000',
    'ada':          '1000',
    'femtoether':   '1000',
    'mwei':         '1000000',
    'babbage':      '1000000',
    'picoether':    '1000000',
    'gwei':         '1000000000',
    'shannon':      '1000000000',
    'nanoether':    '1000000000',
    'nano':         '1000000000',
    'szabo':        '1000000000000',
    'microether':   '1000000000000',
    'micro':        '1000000000000',
    'finney':       '1000000000000000',
    'milliether':    '1000000000000000',
    'milli':         '1000000000000000',
    'ether':        '1000000000000000000',
    'kether':       '1000000000000000000000',
    'grand':        '1000000000000000000000',
    'einstein':     '1000000000000000000000',
    'mether':       '1000000000000000000000000',
    'gether':       '1000000000000000000000000000',
    'tether':       '1000000000000000000000000000000'
};

ガス

トランザクション

イーサリアムでは以下のトランザクションを実行できる。

  • あるアカウントから別のアカウントへのEtherの転送
    • 対象のアカウントは外部アカウントまたはコントラクトアカウントとなる
  • スマートコントラクトのデプロイ
    • 外部アカウントはトランザクションを使用してコントラクトをデプロイすることができる
  • コントラクト内での関数の使用または呼び出し
    • 関数によってイーサリアムの状態が変化するならトランザクションだが、状態が変化しない場合はトランザクションとみなされない

スマートコントラクトのデプロイ時に何が行われているか?

最初にSolidityコンパイラによるコントラクトのコンパイルが行われる。コンパイル後は以下2つの成果物が生成される。

  • Application Binary Interface(ABI)定義
  • コントラクトバイトコード

ABIは全てのexternal関数、public関数の宣言、およびそれらのパラメータと戻り値の型から構成されるインターフェースのこと。コントラクトの呼び出し元はABIを使用してコントラクト関数を呼び出すことができる。

バイトコードはEVMで実行するためのコントラクトの低レベル命令セットのこと。

イーサリアム上にコントラクトをデプロイするためのインプットとしてABIとバイトコードが必要であり、デプロイはトランザクションで実行される。デプロイはトランザクションなので、ガス代がかかる。トランザクションがマイニングされると、コントラクトアドレスを介してデプロイしたコントラクトを利用できるようになる。

Discussion