Mi

日常をさらさらと

Ethereum Transaction

Accounts

Externally Owned Account(EOA)

外部所有のアカウント

Contract Account

スマートコントラクト これがつくられる時に作成されるアドレス

アカウントの構造

  • nonce -> メッセージ実行時にインクリメントされる値
  • balance -> このアカウントが保有しているWeiの量
  • storageRoot -> 状態dataのMerkle Patricia tree のルートハッシュ 256bit
  • codeHash -> このアカウントのcodeのhash値. 検索に利用される

これらの4つの要素が内包されている

EOA と Contract Account の見分け方

codeHashがnilのHash値の時はEOA

Transactionの構造

受取手が EOAの場合は 送金トランザクション 受取手が Contract の場合は、execution トランザクション(スマートトランザクションのコードを何かしら実行するトランザクションとなる)

構造
  • nonce
  • gasPrice
  • gas
  • to
  • value(何かしらのetheを送る場合)
  • このtransaction全体に対する署名
  • data(仕様上は無限の値を入れれる)

Transaction is Message

  • nodeの中ではMessage Callとして扱われる
  • TransactionもMessage Callに変換される
  • Contract -> Contract の呼び出しも EOA -> Contract の呼び出しも同じように扱える
  • Messaage Callの発生源はEOAであるため、発生源を示すフィールドも用意されている

Message Callの構造

  • sender -> messageを投げたAddress
  • originator -> messageの発生源のAddress
  • recipient -> messageの受信Address
  • execute account -> messageを受けとって、codeを実行する人.recipient = exexute account
  • available gas -> 利用可能なgasの量
  • gas price
  • data
  • depth of stack -> 実行時のcontextの深さ
  • state modification -> 実行時にこのアカウントのstateの変更を許可するフラグ

送金トランザクションの流れ

  1. Transactinが有効かチェック
  2. 送金対象のアカウントがなければ作成
  3. 送金を実行
  4. evmを起動してcodeを実行

Bitcoinとの違い

  1. Bitcoinではtxoの所有権の確認のために署名が使われるが、Ethereumがgas代の支払いが誰かを確認するために署名が使われる
  2. Ethereumでは署名のないTransactionは発行できない
  3. Bitcoinでは複数Addressへ送金が可能だが、Ethereumではtoフィールドが1つしかないので、1Transactionで1つのaddressにしか送れない