Blockchain
Ethereum

UMLっぽい図でざっくり理解するEthereumの送金処理

Ethereumとは

Ethereumとは、ブロックチェーン技術を利用した分散アプリケーションのためのプラットフォームです。
詳しくは、こちらを参照。読み進める上で視覚的に理解したいことを勉強ついでにメモしています。
馴染みのあるUMLを利用してイメージを掴んでいきます。

Ethereum上の登場人物

アカウント

アカウントと呼ばれるオブジェクトは、トランザクションを発行し、別のアカウントに送金したりスマートコントラクトを実行したりします。

主に、次の4つのフィールドを持ちます。(ドキュメントより引用)
- nonce:そのアカウントが送信した累積トランザクション数
- ether balance:そのアカウントが所有するether量
- contract code:コントラクト・コード(EOAの場合は空)
- storage:そのアカウントが保持する任意のデータ

Externally Owned Account

Externally Owned Account(EOA)はWebサービスにおけるユーザのようなものです。ユーザによりコントロールされ、トランザクションの生成・送金などを実行します。
これをクラス図っぽいもので表してみます。
スクリーンショット 2017-11-14 16.09.50.png
EOAの場合はコントラクトコードは空なので書いてません。振る舞いとしては、
- createTransaction() : トランザクションの生成
- transfer() : 他のEOAへの送金
- createContract() : コントラクトの生成
- execContract() : コントラクトにコードを実装させる
があります。
※型や引数や戻り値は私のイメージに近いものを適当に入れてあります。

Contract

アカウントには、コントラクトもあります。
同様に、クラス図っぽいもので表してみましょう。

スクリーンショット 2017-11-14 16.14.05.png

コントラクトは、コントラクトコードをプロパティとして持ち、自身のコントラクトコードを実行するメソッドがあります。

トランザクション

ここまで何度か出てきている「トランザクション」についても同様にクラス図っぽいもので表してみます。トランザクションはアカウントによって生成されます。
スクリーンショット 2017-11-14 16.18.22.png

主に、下記のプロパティを持ちます。
- transferAmount: ether送金額
- toAddress: 送信先アドレス
- senderSignature: 送信アカウント署名
- data: 任意データ(トランザクションの相手先がコントラクトの場合に、コントラクトコードに引き渡すデータ)
- startGAS: STARTGAS値
- GASPrice: GASPRICE値

「GAS」は送金やスマートコントラクト実行に必要な手数料で、startGASとGASPriceによって計算されます。手数料はマイニングを行う「マイナー」に支払われます。

トランザクション処理の流れ

内容はこちらのページの「トランザクションの流れ」のパートを御覧ください。
文字で読むだけだとなかなか理解できなかったのでシーケンス図っぽいものに落とし込んでみました。
ここでは、EOA→EOAの送金を図にしています。また、残高不足によるエラー時の処理の流れは省いてあります。正常系のみです。
スクリーンショット 2017-11-14 16.23.21.png

大きく分けると次のような処理が行われています。
1. トランザクションの発行(1)
2. 正当性チェック、下準備(1.1~1.1.2)
3. 手数料計算(2)
4. 送金処理(3~7)

まとめ

図にしてみるとだいぶイメージが掴めます。
コントラクトの実行の場合も大きな流れは変わらず、送金処理の部分がコントラクトコードの実行置き換わるという理解で良いかと思います。
間違っている箇所等ございましたらご指摘いただけると幸いです。