ブロックチェーン (Ethereum)

最近、ブロックチェーンの勉強をしています。
論文を読んでみて自分の中で少し分かりづらかったところがあり、
頭の中を整理する意味を込めてメモを残しました。
同じように勉強中の方に少しでも何かの気づきになればいいかなと思います。
(間違いありましたらツッコミ歓迎です)

基礎知識はブロックチェーン (Bitcoin) を参照.
論文: https://github.com/ethereum/wiki/wiki/%5BJapanese%5D-White-Paper#ethereum

アカウント (Bitcoinでいうところの「状態」)

Bitcoinでは各ノードが持つ残高情報はトランザクション履歴から計算されていたが、
Ethereumではアカウント内部に持つことができる.

  • nonce
  • ether balance
  • contract code (存在すれば)
  • storage (デフォルトは空)

アカウントには、EOAとcontract の2種類がある.

EOAは秘密鍵によって管理され、コードを持たず、
トランザクションを生成して署名する、Bitcoinのような基幹システムを担う.
(なお、EOAはトランザクションを生成後、他のcontractに対してメッセージを送信できる)

contractは、その上で動くプログラム可能なコード.
EOAによって呼び出されていつも特定のコードを実行し、
自身のether残高と、何度も使う変数を把握するのに必要な key/value ストレージを直接管理する.

トランザクション

  • メッセージの受領人 (受取人の公開鍵情報…だと思う)
  • 送信者を特定する署名 (上の公開鍵をハッシュ化したものに送信者が秘密鍵で署名したもの…だと思う)
  • 送信者から受領人へ送られる ether の量
  • オプショナルデータフィールド(署名付きデータパッケージ)
  • STARTGAS 値:トランザクションの実行にかかる 計算のステップ数 の最大値
  • GASPRICE 値:送信者が支払う、1計算ステップあたりの手数料

(送られてくる) オプショナルデータフィールドに入っているデータは、
opcodeを使うことで取得することができ、その後storageに保存することができる。

STARTGAS や GASPRICE について。

Ethereumでは、無限ループや計算理論的に無駄なコードの消費を避けるため、
各トランザクションが実行できる計算のステップ数に上限が設けられている.
計算の単位は「gas」と呼ばれ、1計算ステップは1gasを消費する.
また、storageへの書き込みは1byte毎に5gasが消費される.

これらは手数料として実行者に支払いを強要されることになるが、
同時にネットワークに大きな負担を与えるトランザクションを生み出さない設計となる.

なお、Bitcoinでは無限ループなどが起こりうるコードの挿入自体ができないようになっており、
その結果、Ethereumでできるような複雑な取引ができないような設計になっている.
(言い換えると、Ethereumは複雑な取引をできるようにするためにgasの仕組みを入れたといえる)

メッセージ

  • メッセージの送信者
  • メッセージの受信者
  • メッセージと一緒に送信されるetherの量
  • オプショナルデータフィールド
  • STARTGAS 値

EOAがトランザクションを生成するのと同じように、contract同士でも上記のようなやり取りができる.
contract内のみで動作し、ネットワーク上では動作しない.
例えば、CALL( or CREATE ) opcodeはメッセージを生成して実行します.

注意点としては、トランザクションやcontractによって署名されたgasの許容値は、
それぞれが使用できる量ではなく、総量である点.
例えばAからBへのトランザクションの送信時に1000gasを許容値にした場合、
Bはメッセージで1000gas以上のgasは消費できないということ.
内部処理(メッセージ)で1000gas以上使うと、ガス欠となりトランザクションは実行されなくなる.

状態遷移関数の実行

誰かが誰かに送金を開始するとお互いのアカウントの状態が変わる.
その際、以下の状態遷移関数が実行される.

  1. トランザクションが「well-formed (ex. 値が正しいか等)」かチェックし、署名が有効であれば、nonceが送信者のアカウントに所持しているものと同じがチェックする. 合致しなければエラーをかえす.
  2. トランザクションの手数料を「STARTGAS * GASPRICE」として計算し、署名から送信アドレスを決定する. 送信者のアカウントの残高から手数料を差し引き、送信者のnonceをインクリメントする. 残高不足ならエラーを返す.
  3. 次にstorageにかかるgas代を算出する. 「最大ステップ数( = STARTGAS / 1ステップ = 1gas) – ((5gas / 1byteあたり) * 使用byte)」
  4. 送信者から受信者のアカウントにトランザクションを転送. (送信者の残高が引かれ、送信先の残高に足される) 受信者のアカウントがなければ新規作成. 受信者のアカウントがcontractであれば、全ての実行が完了するか、ガス欠になるまでcontractのコードを実行する.
  5. もし、送信者が十分なお金を持っていなかったり、ガス欠のために値の転送に失敗した場合は、手数料の支払いを除いて全状態を元に戻し、手数料はマイナーのアカウントに加える.
  6. そうでなければ、余った全てのgasを全て送信者に返し、消費したgasはマイナーに支払われる手数料として送信.

コード実行

コードは以下の3種類にアクセスできる

  • stack
  • Memory
  • storage

stackやmemoryは計算実行後毎にリセットされ、storageは長期間、値が保持される.
また、受信したメッセージにおける値・送信者・データにアクセスできる.
ブロックヘッダの値にもアクセスでき、返り値としてbyte値のデータを出力することもできる.

コードはEOAがトランザクションを生成するタイミングで実行される.
仮にブロックAに追加されたとすると、全てのノードで実行されることになる.
つまり、その時点より未来において、ブロックAをダウンロードした全てのノードということ.

ブロックチェーンの違い

Bitcoinとの違いは、各ブロック内に全状態の情報が含まれること.
全状態の情報を保存するためには、ブロックごとに生成される部分木が更新できないといけない.
そこでマークル木ではなくパトリシア木を使う. パトリシア木ではノードの挿入・削除が可能になっている.
非効率のようにみえるが、各ブロック内に全状態の情報が含まれるために、
Bitcoinのように全トランザクション履歴を保存する必要がなくなり、5〜20倍のスペースが節約できる.

法定通貨との連携

ETH/USDのレートを管理するcontractにアクセスする必要が出てくる.

シンプルな実行方法としては、特定のパーティー(利害関係が一致し、結託した参加者の集合) により維持管理される、
「データフィード contract」を通す方法があり、このcontractにメッセージを送信することで、
現在のレートを受け取ることができるようになる.

証明書(トークン)発行

Bitcoinにはない機能としてトークンがあり、
その重要な機能としてトークンを使ってトランザクション手数料の支払いができる.

トークンは発行者が自由に発行し、無効化の権利を有することもできる(※)ため、
発行主体が信用可能であることが重要である. (現状は多くの詐欺が横行しているのが実情)
しかし、「取引所」のような分散型の投資市場を用意することで、その価値を完全に失うリスクを減らすことができる.
ただし、「ヘッジングcontract」にエスクローとして資金を保持させる必要があり、完全にそのリスクを避けることはできない.
また、法定通貨の価格を表示させるのに信用できるデータソースを利用する必要があり、完全に非中央集権化されているわけではない.

※ コードの書き方によっては逆にできないようにすることも可能.

分散型自律組織 (DAO)

会員あるいは株主が、67%以上の多数派を占めると、contractのコード修正や資金の消費が可能になるというもの.
コードの修正は、本来はできないものだが、別のところにcontractを複数保持しておき、
そこに呼び出すcontractのアドレスを保持しておけば、事実上contractの書き換えができる.

Aというcontractのコードを書き換えたい場合…

  • Bというcontractに、Aのcontractのアドレスをstorageに保存しておき実行するようにしておく
  • C、Dというcontractをトランザクションに載せる
  • Cのcontractは実行されたタイミングで、BのcontractにAのアドレスからDのアドレスに変更するメッセージを送る
  • 以降、Aのcontractを実行するBのcontractは全てDのcontractを実行するようになり、コードの書き換えが完了する.

つまり、書き換えが考えられるcontractは、予め他のcontract経由で実行されるように作っておく必要がある.

ABOUTこの記事をかいた人

フリーランスとして働く、フルスタックエンジニア 初崎 匠のサイト。仕事のことから趣味のアニメーション制作、英語学習など、様々なことを通じて、少しでも多くの人が幸せになれるような価値を提供できるよう挑戦し続けます。