Blockchain
Ethereum

そもそも根本的に全然違う

根本的な違い

スマートコントラクトアカウント

  • ビットコインは、1種類のアカウントしかない そもそもアカウントという概念はなく、単にアドレスを持っている。とあるアドレスの残高を確認したい場合、そのアドレス宛に送金した金額とそのアドレスから別アドレスに送信した金額を合算して残高を表示するだけ。
  • イーサリアム上では、アカウント という概念があってアカウント毎に残高、nonce、コード、ストレージを持ってます。普通のアカウント(外部所有アカウント: EOA (Externally-owned Account))とコントラクトアカウント(Contract Account)2種類あります。
    • 普通のアカウントは、ビットコインのアカウントと同じ、送金などができます
    • コントラクトアカウントはキモです。
  • コントラクトアカウントは、残高以外、実行できるプログラムコード(厳密に言うとコンパイル済みのバイナリコード)を持っている
  • コントラクトアカウントに送金すると、特定な関数(無名関数)が呼びされ、そこに定義されている処理が実行される(たとえば、受け取ったETHをオーナーアカウントに転送するとか、だれからどのぐらいをもらったかを記録しておくとか)
  • 送金以外、そのコントラクトの情報を知っている場合、定義されている関数を呼び出すのもできる
  • コントラクト関数実行については、書き込みがある場合、ブロックチェーンに書き込むので、マイニングが必要になるが、読み取るだけなら、マイニング不要

GASという発明

  • ビットコインもスマートコントラクトがありますが、チューリング不完全であり、繰り返しさえできない。なぜかと言うと、ノードがトランザクションを計算する際無限ループがあると、簡単にネットワーク全体のDDOS攻撃になってしまうので、それを避けるために敢えてチューリング不完全にしている
  • この問題に対するイーサリアムの回答は、GASである
  • イーサリアム上でトランザクションを計算する際、各計算のステップ毎に課金される、その課金の単位はGAS。
  • トランザクションを作成する時は、GASの上限指定は必須です。
  • 実際トランザクションを計算する時、各計算ステップ毎の必要なGASを集計する
    • 合計値はGAS上限値を超えてなければ計算し、処理を実行する(結果をブロックチェーンい書き込むとか)
    • GAS上限値を超えた場合、その場で停止し、処理を実行しない、トランザクションがブロックチェーンに書き込まれない。ただ、計算に掛かる費用(GAS)は送信者に戻さない

参考記事