金融系IT系企業に務める身としてはブロックチェーン上で動くアプリケーションくらい作ってみたいと思い、ブロックチェーンを学ばなければと思い、「ブロックチェーンアプリケーション開発の教科書」を読み始めたので、知識整理のため、投稿。
ブロックチェーン概要
- サトシ・ナカモトが投稿したビットコインのデザインペーパーから生まれた技術
- 最初はビットコインを支える仕組みとして生まれたが、暗号通貨の枠を超えたP2Pアプリケーションを開発するための技術としても普及し始めた(※ 暗号通貨以外のシステムに使われているブロックチェーン技術をブロックチェーン2.0とも呼ばれるらしい)
- ブロックチェーンは分散管理を行う技術のため、システム参加者を限定したり、パフォーマンスが必要となるシステムには不向き。
ビットコインプラットフォームのブロックチェーン技術の主な要素
タイムスタンプ
- 管理者を必要としないアプリケーションを目指したため、イベントが発生した時刻を中央集権的に管理することができない。
- これに対する解として、「絶対時刻」ではなく「相対時刻」を扱うハッシュチェーンがある。
ハッシュチェーン
order1 → hash(order1)
↓
order2 → hash(order2)・hash(hash(order1))
↓
order3 → hash(order3)・hash(hash(order2))・hash(hash(hash(order1)))
イメージ的には上記だと思っている。
注文が入るたびに、その注文、以前の注文をハッシュ化していく。
この仕組みによって、order2がハッシュ化されているということはorder1がハッシュ化されていることだ、と再帰的に判定していくことができる。これにより出来事の順序をシステムで理解できる仕組み。
これでは分散アプリケーションで担保するべき以下の二つが担保できないかもしれない
-
P2Pネットワークに参加しているノード全てが最新のタイムスタンプを参照できるか?
- これができないとノードごとに見ている最新断面が異なってしまう。
-
過去データを改ざんされた場合に、それを検知、拒否できるのか
- これができないと取引履歴の時系列改ざんやら、取引内容の改ざんやら、やりたい放題。
ブロックチェーン
上の二つの問題に対する解決策としてブロックチェーンで使われている仕組みは以下。
マークルツリーによるブロックの概念
- データを一つずつハッシュ化するのではなく、いくつかのデータを束ねてハッシュ化し、ブロックという単位で再帰的にハッシュ化していく。
- 受け取ったデータを一個一個ハッシュ化していくより、効率的に送信元データと今ハッシュ化したデータが破損・改ざんされたことを検知できる。
Proof of Work
- 最新ブロック + トランザクションデータ + nonce(ワンタイムパスワード的なもの)をハッシュ化した値が規定された値以下になる様なnonceを見つけることができたノードのみが新しいブロックを作成できるという仕組み。
- このブロックを作成することを「マイニング」という。ここで新しいブロックに取り込まれたトランザクションデータはブロックチェーン上で承認された取引となる。
- これを全ノードが一斉に行う。で、このnonceを見つける難易度は平均的に10分程になる様に調整される。この10分というのが世界中の全ノードに最新断面のブロックが伝播するまでにかかると仮定されている時間だそうな。
- でも必ず10分間隔で新しいブロックができる訳ではないので、ネットワーク環境のせいなどで同時に二つの最新ブロックが作成されたりした場合は、その後に続くブロックが長く続いたほうが採用される。ただ、採用されなかったブロックに含まれるトランザクションはブロックチェーン上で承認されていないので、またマイニングされて新しいブロックとして作成される。
- 時間稼ぎと取引の承認を同時に行ってる仕組みかなと思う。すごい。
UTXO
- 通貨の送信ではデータ(お金)を自分の口座から削除し、相手の口座に追加する方式(残高記録方式)とデータ(お金)自体に所有者情報を記録しておき、その所有者を書き換えることによって送金を実現する方式(コイン識別方式)があり、ブロックチェーンではコイン識別方式をベースにしたUTXOという仕組みを導入している。
- これはトランザクション管理を容易に行うための手段。
- UTXOではデータ(お金)の所有者情報の書き換えを行う時に、公開鍵認証の文脈での送金したい相手の公開鍵で自分の送金したいデータ(お金)をロックする。そして送金相手がロックされたデータ(お金)を自分の秘密鍵で解除し、自分の所有者情報に書き換えることで自分のデータ(お金)にすることで実現する。
- 自分の送金したいデータ(お金)のうちいくらかを手数料としてロックしたままにしておくと、マイニングに成功したノードが報酬として受け取れる。この手数料を多くしておくとマイニングするノードとしては魅力的なトランザクションとなるため、迅速に新しいブロックとしてブロックチェーン上で承認される。
終わりに
ブロックチェーンを理解する書籍として非常にわかりやすかった。
ここで記載した内容は、書籍のメインのブロックチェーン上で動作するアプリケーションを作る前提としてのブロックチェーンについて理解するための章の部分。
実際にブロックチェーン上で動作するアプリケーションを開発するとしたら、その分野に特化したイーサリアムのプラットフォームを使うのが良さそうだけど、一旦ブロックチェーンを理解するためにビットコインのブロックチェーンについて勉強してみたが、とても面白い。
業務アプリケーションを作る上で扱う技術とは違って新鮮な気持ちになった。
とりあえず何か作れる様になれるまでは勉強してみようと思う。