BlockChainを作る
Javaを皮切りにCS方面への興味を強く抱いたきっかけの一つとして、『ブロックチェーンの衝撃』を学生時代に読んだことを思い出す。
ブロックチェーンに興味を持ったのはビットコインの基盤技術であることを知ったことがそもそもの発端。
当時(2017年年末)のことを思い出すために相場を調べてみると、
2017.11末に100万弱/BTCで、取引が始まって以来の大暴落となる翌月12/15の220万/BTCと、
ひと月でこれまでの倍のレートに跳ね上がっており、
仮想通貨に興味のあるネットの一部では異様な盛り上がりがあったことをなんとなく覚えている。
奇しくもコインチェック事件が発生したのも2018年1月のことであり、そのころは「仮想通貨元年」なんて言葉もよく耳にしていた。
書籍に話を戻すと、IoTやリーガルテック、金融、ヘルスケアなど様々な産業への可能性として様々な具体例が書かれており、
なぜか社会の既得権益みたいなものを毛嫌いしていた自分に強烈に刺さった記憶がある。
改ざんができない(= お金の不正ができない)点が魅力的に映り、ルールチェンジャーになるチャンスだと思ったからだろう。
ポジティブなことばかり書かれていて楽しいが、ブロックチェーンの仕組み周りはほぼ理解ができなかった記憶がある。
当然、仮想通貨の切り口でブロックチェーンが語られるので、PoWやPoS、Nonceなどマイニング周りのことが図式とともに説明がある。
しかし前述の通り理解ができなかったので、分かりたい、作って仕組みを知りたいという思いから計算機やプログラミングそのものに興味が向いた。
Java自体の勉強はコンソールに文字を出力する初体験を始まりとして、SpringBootでWebAppを作ることもしたり、それはそれで楽しく、その延長上に今の日々の仕事がある。
というわけで、前置きが長くなってしまったが、
Web3なんて言葉を周りで耳にするようになってこの思い出をふと思い出したので、
当初の目的も果たせるようになってきたので、
シンプルなものから作ってみようと思う。
ただ今では設計できる時点で、書籍の内容を理解できるレベルにはあると思うし、
書いてみて気づくことなんてあるのかなとは思うけど
調査メモ
ブロック
-
https://www.asahi.com/ads/start/articles/00286/
- ブロック: 取引データ、過去の取引データ、任意の値
- 新たなブロックが一定時間ごとに生成
- 新たなブロックに過去の取引データをもたせることでブロック間で論理的な関係性を持つようになり、いわゆるチェーンと呼ばれる
- ノード(サーバー)が互いにブロックチェーンを同期
-
https://greenapple-investment.com/system-of-blockchain.html
- ブロック: ハッシュ値(一つ前のトランザクションの要約)、トランザクション(取引データ)
-
https://jp.cointelegraph.com/news/what-is-blockchain-in-depth-explanation-of-how-it-works-and-its-types
- ブロック: 前のブロックのハッシュ値、取引データ、ナンス値
-
https://www.nli-research.co.jp/report/detail/id=67889?pno=2&site=nli
- ブロック: 親ヘッダのハッシュ値、マークルルート、タイムスタンプ、採掘難易度、ナンス
- https://www.asteria.com/jp/inlive/social/2425/
ナンス
-
https://www.nli-research.co.jp/report/detail/id=67889?pno=2&site=nli
- ブロックヘッダからハッシュ値を計算したときに、そのハッシュ値が閾値(target)を下回るような値
- マイニングとはなにかについて理解する必要がありそう
-
https://zaif.jp/glossary/nonce
- ナンスと呼ばれる32ビットの値をハッシュ関数という複雑な数式に代入して計算し、答え(ハッシュ値)を算出する。このハッシュ値は一定の条件を満たした場合のみ正当とされ、新しいブロックがブロックチェーンに追加される
-
https://bitcoin.dmm.com/glossary/nonce
- ランダムな32bitの値であるナンスを用意し、ハッシュ関数を使ってハッシュ値を生成する
- 生成されたハッシュ値がある値より小さい(値の先頭に0が何個も並ぶ)数値になるまでナンスを変えながら同じ計算を繰り返す
- 正解となるナンスは、他のマイナーやビットコインネットワークの利用者達によって検算され、規定のハッシュ値が生成されることを確認される
マイニング
- ブロックを作成する試み
- 参加者各々がナンスとハッシュ関数を使ってハッシュ値を生成、生成された値が閾値を下回るまで繰り返し、一番最初にハッシュ値が閾値を下回るナンスを見つけたときにブロックが作成される
- 桁の制限があるナンスのすべてを試行しても正解のナンスが見つからない場合もあるが、ブロックヘッダにタイムスタンプがあるため、現実的な時間内に問題は解決される期待は持てる
- ブロックヘッダのハッシュ値の値はSHA256と呼ばれるハッシュアルゴリズムが用いられているので、そのアルゴリズムが出力する値が取りうる数値は、2進数256桁(16進数だと64桁、10進数だと78桁)
- 「ナンスとハッシュアルゴリズムによるハッシュ値の計算により出力される値が閾値以下かどうかの試行の繰り返し」のこと
分散型
- 軽量型ノード(計算型のノードは他のフルノードが持つブロックチェーンの情報を参照する)
- 一つのブロックに1000から2000を超える取引が含まれる。容量にして1MB強(btcの場合)
- 管理者は不在だが、各参加者が管理の一貫としてデータチェックを行っており、データ構造上の不備のある取引が共有されないようになっている
- この仕組みがいわゆるプルーフオブワーク(= PoW)
- 例えば、たまたま同じ時間に異なる参加者によって異なる「正解のナンス」が発掘されたときに、ブロックチェーンが2つ作成されてしまった場合、長い方のブロックチェーンを正当なブロックチェーンとみなし、短いブロックチェーンは破棄されるようになっている。
- このデータの書き換えの困難性が改ざんに強い理由
- 全参加者が同じようなCPU計算量を持っている前提の上で改ざん取引を含んだ不正なチェーンを作ろうとする攻撃者側のCPU計算量が源流の正しいチェーンでマイニングをしている参加者たちのCPU計算量を上回る必要がある(= 51%攻撃)
その他
- ブロックサイズ問題
- ライトニングネットワーク
- Segwit
- ハードフォーク
要件整理
BlockChain
- d: Blocks
Block
-
d: header
- d: prevHash
- d: hash
- d: nance
-
d: transactions
- d: transaction
- d: sender
- d: recipient
- d: amount
Header
prevHash
- 前のBlockのhash値
- 直前のBlockまでの全transactionの要約
hash
- Blockのhash値
nance
- マイニング(採掘)に関するデータ
- 32bit
Transactions
Transaction
sender
- 送金人
recipient
- 受取人
amount
- 送金額