NHN Cloud Meetup 編集部
ブロックチェーンとビットコイン
2018.08.28
1,534
この記事は、2017年5月に社内で発表した資料です。
今とは異なる内容が含まれている可能性があります。
はじめに
(画像出典:https://www.blockchain.com/)
ブロックチェーンの技術がなぜ話題になっているのか、メカニズムがどうなっているのか、どのような分野に適用できるのか、以下の資料をご覧いただき、お役に立てれば幸いです。余談ですが最近、仮想通貨の価値が日々変化しています。なぜ上がっていくのか答えられませんが、自分だけの回答を得るのに役立つと思います。またブロックチェーンの技術は、ビットコインの論文で初めて言及された技術であるため、ほとんどの説明と事例はビットコインが中心です。しかし、他のブロックチェーンの基盤技術も大きな枠組みで見ると、ブロックチェーンをベースに、事業目的とビットコインの限界(欠点)を修正すれば使用できると考えます。https://github.com/bitcoin/bitcoinにオープンソースとしてビットコインソースが公開されています。(MIT License)
1章では、ブロックチェーンの活用分野を簡単に説明し、2章、3章では、ブロック構造とメカニズムについて技術的に説明します。4章、5章では、限界点とその他の参考内容をまとめました。不十分な部分があればフィードバックをお願いします。
目次
- ブロックチェーンの活用
- ブロックチェーンの概要
2-1. ブロックチェーン構造
2-2. ブロック構造 - ブロックチェーン(ビットコイン)のメカニズム
3-1. マイニング過程
3-2. トランザクション処理
3-3. 検証過程
3-4. P2Pアーキテクチャ - 限界
- その他注意事項
要約
- ブロックチェーンとは何か
- P2Pネットワークに分散した元帳形態のデータベース構造
- ブロックチェーンの活用の可能性
- ビットコインのような貨幣のほか、公認認証書、ロジスティックス請求書など、さまざまな分野で研究/サービスがされている
- ビットコインの限界と脆弱性を修正した様々なコインが登場している
- ライトコインはコイン生成サイクルを2.5分(ビットコイン10分)、SHA256アルゴリズムをScryptに変えマイニング防止
- ダッシュコインは、既存の公開取引を匿名取引に変更し、現実世界の取引実績時間に合わせ検証時間を10分以上から1秒に減少
- ビットコインは安全か
- 検証課程にある。P2Pで元帳分散、公開鍵/秘密鍵基盤の取引はHashCashで作業証明があり安全
- ビットコインはオープンソースであり、新しい脆弱性と不足点は継続的に改善される
- ビットコインはコスト面で効率的か
- 中央制御機関がなくインフラ(サーバー、DBなど)がなくても維持される
- ただし、多くの人が参加した場合の限界点を考慮する必要がある
- ビットコインでどのように取引が行われるか
- ビットコイン取引当事者は、個人の公開鍵(口座)を持っており、取引時は公開鍵を使ってビットコインを送信する
- 取引は、世界中のビットコインのノードに送信され、ブロックに編入される
- ブロックは継続して追加されており(10分に1本)、チェーンを形成している(現在、約47万個のブロック)
- 偽造された取引はブロックに入れないように検証課程が複数ある
- 全世界でビットコインのブロックチェーンは1つだけ存在する
1.ブロックチェーンの活用
1.1ブロックチェーンの事例(Use case)
貨幣(Currencies)
- 貨幣機能を実行する電子マネー
- 規制、監督、法制化などに関する公認性なし
- 例)ビットコイン、ソーラーコイン、ダークコイン、ピアコインなど
資産登録(Asset Registry)
- 資産登録をブロックチェーンに記録し、個人キー資産の所有権を主張する帳簿機能
- ブロックの大きさが貨幣用ブロックより相対的に大きく、ネットワークのパフォーマンス低下と高コストを伴う
- 例)カラードコイン、オムニ、XCP(カウンターパーティー)など
アプリケーションプラットフォーム(Application Platform)
- ネットワーク上に存在するブロックチェーンにアプリケーションを開発して動作させるプラットフォームの役割
- サービス初期のため、脆弱性が多数存在する
- 例)イーサリアム、ETN(エレクトロニウム)、NXT(ネクスト)など
資産中心(Assent Centric)
- 貨幣、資源、株式、債券の取引を、一部のユーザーのみ閲覧できる共有帳簿に記載する(ビットコインは公開された帳簿)
- 外国為替取引は、振込、決済、送金を目的としている
- 例)リップル、Stellar(ステラ)
参考)イーサリアム
- ビットコインブロックチェーンに派生し、ビットコインの次に資産価値が大きい
- プラットフォームタイプのブロックチェーンでチューリング完全言語をサポートし、ブロックチェーン上にアプリケーション開発可能
- チューリング完全:計算問題をプログラミング言語や抽象機械で解くことができる。C++、JAVAなどがある
- イーサリアムでSolidityという独自の言語を使用
- ブロックチェーン上に開発可能な構造であるため、符号化の自由度からハッキング事故が頻繁に起きる
- 現在は、市場での検証と脆弱性の補完が必要な時期と観察される
1.2 Public vs Privateブロックチェーン
パブリックブロックチェーン
- 誰でも参加可能で、取引の両方に公開されている(ビットコイン)
プライベートブロックチェーン
- 限られた参加者で構成されており、場合によっては中間介入が可能
- 取引の検証や閲覧権限を定め、データの修正が可能である
- パブリックと比較すると、システムの複雑性が低く(マイニングと取引実績による)安価な運営が可能
- 例)R3CEVブロックチェーン商用化研究のためのコンソーシアム(国内外70の銀行)
1.3ブロックチェーンの長所、短所
長所
- セキュリティ:分散データベース、取引操作不可
- 透明性:公開取引
- 匿名性:財布の作成、利用時に身元証明手続きがない
- 快適:誰でもボタンをクリックするだけで口座が作成できる
- 安全性:一箇所にすべてのデータを保持するリスクを避けられる
- 効率:システム統合と複雑なプロセスに起因する高コストが必要がない(インフラなど)
- 振込手数料が安い。決済の完結性(一度決済すればキャンセル不可)
※場合によっては欠点になることがある
短所
- 価値の変動:法定貨幣に依存し頻繁に価格変更がある
- 管理の難しさ:パスワード、秘密鍵を紛失した場合、復旧できない
- ハッキング:ブロック自体をハッキングするのは難しいが、ビットコインを使用しているサービスがハッキングの対象になる
1.4銀行や公共サービスへの適用が難しい
- 匿名性:銀行取引や公共サービスでは、匿名性を使用できず、事故発生時の凍結、強制引渡しなどができない
- 透明性:取引の内訳が個人情報と見做され、必要に応じて内部情報や営業機密に準ずることがある
- 合意構造:競争を広げ、マイニングプロセスから作業を証明し、インセンティブを受ける構造である(処理コストの浪費)
- 拡張性:毎秒数千回のカード決済や取引をブロックチェーンで処理する難しさ
- 規制適用が困難:国内の電子金融取引法、金融実名制などを適用することは困難
※これらを改善した仮想通貨が引き続き登場する
1.5ハッキングの危険
- 概ねブロックチェーン自体は安全であるが、関連サービスがハッキングされる
- 事後処理が不可能、ハッカーを特定するのが困難
- 誰もがアクセス可能なサービスであるため、ハッキングの脅威は常にある
- 代表的なハッキング事例
- MtGoxビットコイン取引所のハッキング、破産事件:ハッカーがビットコインを受領したにもかかわらず、取引所で確認できなくさせて多重出金させる。当時最大のビットコイン取引所であったが破産した。
- イーサリアムTheDaoサービスハッキング
1.6詳細な活用分野
金融業界
- 迅速かつ安全な取引を可能にする
- 小額決済、国際送金、株式取引など
- 例)国際送金は手数料が高くと送金が完了するまでに1〜2日かかる。公開鍵/秘密鍵を使ってすぐ取引ができ、手数料が削減できている
- 支払い、精算、決済プロセスの非効率性をなくす
- プロセスに参加する各組織がそれぞれのデータを保持し、相互通信によってリソースの無駄遣いが激しい
行政サービス分野
- 偽造・変造が不可能な記録システムを構築できる
- 出生、死亡、結婚届、土地、企業登記など
- 音源の所有権登録、株式、特許などの所有権登録
契約分野
- 一定の条件を満たせば取引が自動実行されるプログラム
- 特定の条件を満たしているか判断し、支払いを承認
- 例)保険会社は、農民を対象に干ばつが農産物の生産に影響を与える場合、保険金を支給するという方針を設け、干ばつが30日間続くと保険金が支払われる契約条件を明示。条件を満たしているか確認過程では人の介入が必要なく、保険金も自動支給されるので、全体のプロセスの効率が向上する。結果的に、時間とコストの低減が可能。
IOT分野
- IBMは、Linuxが主導しているプロジェクトで、数百個の事物がネットワークに接続され互いに通信している。指定された業務を遂行するのに、集中システムで、これらをすべて監視し管理するのは不可能である。設定された条件に達すると、自律的に課題を遂行し、事物間コミュニケーション過程で第3者によるハッキングを防ぐ。
取引手数料とPOWの活用
- メールを送信するときHashの逆計算するようにして一定の手数料を支払う
- 取引手数料が含まれる場合、優先的に処理される。なければ遅延するだけ。例えば、スパム送信に作業証明(= POW)が必要と設計
- ※POW(作業証明、Proof Of Work):特定の難易度のタスクを実行したことを証明する手法
(画像出典:http://www.datanet.co.kr/news/articleView.html?idxno=110500 /韓国語)
2.ブロックチェーン(Blockchain)
2.1ブロックチェーンの由来
- 暗号化された仮想通貨ビットコインの基盤技術で、2008年に初めて紹介される
- Bitcoin:A Peer-to-Peer Electronic Cash System、Satoshi Nakamoto https://bitcoin.org/bitcoin.pdf
- b-money、hashcashなど、すでに発明された貨幣を組み合わせて分散された電子マネーシステムを作る
2.2ブロックチェーンの定義
- P2Pネットワークに分散した元帳形態のデータベース構造
- 一定サイズの元帳(複数取引の記録、トランザクション)が集まってブロックが形成され、ブロックが繋がりブロックチェーンとなる(リンクリストの形)
2.3ブロックチェーンの価値
- 既存の個人と個人、公共機関や個人、企業と企業の間に発生する様々な形の取引関係を改善できる基盤技術
=>金融取引、契約などで第三者の仲介と保証、公証なく取引の確実性、安全性、二重取引の遮断を確実にする - 取引当事者間の信頼が要求されるすべての契約の仲介プラットフォームとしての役割を果たし、お互いを信頼できずに発生する非効率を取り除く
=> 情報は、ネットワークの参加者間で分散/共有/管理され、実際のデータ(取引内訳)を含んでいるか公開され、検証される - 今後の影響と価値について、TCP / IP技術と比較されたりもする
画像出典:https://www.openxcell.com/blockchain-for-president
2.4ブロックチェーン構造
ビットコインのブロックチェーン構造
画像出典:http://www.smallake.kr/ 韓国語
- ブロックチェーンはブロックが追加され続ける構造、チェーンの高さが増加を意味する
- 前ブロックは親ブロックと呼ばれ、親ブロックの次を子ブロックで表現
- 子ブロックが親ブロックのハッシュ値を持つことで、セキュリティが維持される。偽造防止
- 親が変更されると、子が変更される構造。変造するには前に生成されたすべてのブロックを再計算しなければならないが、変造は可能
- ブロックが高くなるほど、安全性は高くなり、高いブロックに含まれた取引ほど安全を意味する
- 世界中に1つのチェーン(帳簿)だけ存在
- 参考)2017/6/5 22:10あたり、ブロックの高さ469876
2.5ブロックの構造
ブロックヘッダ
- ブロックサイズ:ブロックヘッダは固定であり、ブロックに含まれる取引の数に応じて可変である
- バージョン:データ構造のバージョン。構造変更時に必要
- 前ブロックのハッシュ:前ブロックと繋がることを意味する
- タイムスタンプ:ブロック生成時間、1970.1.1以降秒単位の時間
- 難易度の目標:マイニングの難易度(bit値)で2016個目のブロックごとに変更
- メンテナンス:作業証明アルゴリズムで使用されるカウンター(値を変えてくれる役割)
トランザクション
- トランザクション数:取引数
- コインデータベーストランザクション:ブロック生成時に発生するビットコインで、本ブロックをマイニングしたマイナスの収入
- トランザクション:10分間収集した取引情報
2.6ブロックRawdata
- ブロックの識別は、ブロックのハッシュ値、あるいは高さで識別
- ただし高さはユニークでないことがある
- ブロックには通帳の残金は表示されず、取引記録のみ表示される(InputとOutput)
- ブロックを作る過程(マイニング過程)で補償を受けることになり、これは最初の取引で確認できる
ビットコインの0番ブロックRawdata
{/ブロックヘッダ "hash":"0000000019d66689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f",///識別値 "ver":1, "prev_block":"000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",/移転ブロック,最上位のブロックのため,0 "mrkl_root":"4a5e1e4baab89f3a32518a88c31bc87f618f7673e2cc77ab2127b7afdeda333b", "time":1231006505, "bits":486604799, "fee":0, "nonce":2083236893, "n_tx":1, // トランザクション数 "size":285,/ ブロックサイズ0.285KB "block_index":14849, "main_chain":true, "height":0,/チェーン高さ0(初ブロック) "tx":[ {// トランザクション領域, 最初のトランザクション "lock_time":0, "ver":1, "size":204, "inputs":[/1番目の取引はマイニングされた取引を示す。 Inputの起源がない。 {// ふつうの取引はInput - > Outputの連結環でInputのアドレスがある。 "sequence":4294967295, "script":"04fff001d0104455468652054696d657320~30332f4a616e2f323033036392043686163656c6f72206f6e206f6272696e6b206f66206f662073636363636f6e6420626962696c6366366f75206266266f74206f766606f6606f6606606f6f366f6f666666 } ], "time":1231006505, "tx_index":14849, "vin_sz":1, /input数 "hash":"4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b", "vout_sz":1, //output数 "relayed_by":"0.0.0", "out":[ { "addr_tag_link":"https:\/\/en.bitcoin.it\/wiki\/Genesis_block" "addr_tag":"Genesis of Bitcoin", "spent":false, "tx_index":14849, "タイプ":0, "addr":"1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa",//ビットコイン受信者住所(公開鍵),マイニングされたビットコインは採掘者の住所として記録される。 アウトプット "value":5,000,000,000,//50BTC, 1BTC=100,000 Satoshi(1億 サトシ) "n":0, "script":"4104678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7bab8d578c } ] }] }
1番のブロック(一部省略)
"prev_block":"000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f", // <span style="color: #000000;;">0番ブロックのHash値</span> "height":1, // <span style="color: #000000;;">高さが+1 増加する</span>
80,000回のブロック(一部省略)
"prev_block":"000000001937917bd2caba204bb1aa530ec1de9d0f6736e5d85d96da9c8ba",//79,999ブロックのハッシュ "n_tx":2,// 二つのトランザクションが含まれる "height":80000 最初の取引(省略) }, 2番目の取引 "lock_time":0, "ver":1, "size":158, "inputs":[ { "sequence":4294967295, "Prev_out": "spent":true, "tx_index":135639, "タイプ":0, "addr":"1JBSCVF6VM6QjFZyTnbpLjoCJTQEqVbepG",/当該アドレス(口座)を持った人が50BTCを送信(Output領域確認) "value":50000000,//50BTC "n":0, "script":"410428338ffd784c198147f99aed2cc16709c90b1522e3b3637b312a6f9130e0eda7081e373a96d36be319710cd5c134aaffba81fffff18650de8807de8f3f32fe43f4d8de8de }, "script":"48304502206e21798a42fae0e854281abd38bacd1aeed3ee3738d9ee1446618c4571d1090db022100e2ac980643b82c0e88ffec6b64e3e6ba357f7d7d7d7d } ], "time":1284613427, "tx_index":135927, "vin_sz":1, "hash":"5a4ebf666822b0b2d56bd9dc64ecce0bc38ee7844a23ff1d7320a88c5fdb2ad3e2" "vout_sz":1, "relayed_by":"0.0.0", "out":[ { "spent":true, "tx_index":135927, "タイプ":0, "addr":"16ro3Jptwo4asSevZnsRX6vfRS24TGE6uK",/上のInput口座→Output口座に50BTCが送られる "value":50000000, "n":0, "script":"76a914404371705fa9bd789a2fcd52d2c580b65d35549d88ac" } ] }] }
参考)マークルルート(Merkle Root)とマークルパス(Merkle Path)
画像出典:http://chimera.labs.oreilly.com/books/1234000001802/ch07.html#merkle_trees
- マークルルート:Merkle Tree(= Hash Tree)の最上位ハッシュ値。取引数に関係なく256bitのハッシュ値としてマーク
- マークルパス:取引ツリーの中にあることを証明する各Level特定ノードの集合
- マークルツリーはバランスツリー、ダブルSHA256で形成される
(1)リーフノードのハッシュ値= SHA256(SHA256(Transcation A))
(2)リーフノードのハッシュ値をStirngに付けて再びSHA256(SHA256) - 特定の取引がブロック内に含まれることを証明する過程に使用され、効率的
- 取引N個のとき、Log2(N)のマークルパスで取引を含むか確認
- 例)取引Kがブロックのトランザクション領域に16個の取引に含まれていることを確認する
(1)特定の取引とツリーのルートを接続するマークルパスを作成、H(L), H(IJ), H(MNOP), H(ABCDEFGH) -青のノード
(2)マークルパスに対応するハッシュペアとマークルルートを計算する、H(KL), H(IJKL), H(IJKLMNOP), H(ABCDEFGHIJKLMNOP) -青点線ノード
( 3)最終的なルートハッシュ値を触れると、取引Kがそのブロックに含まれることを証明
3.ブロックチェーン機構
3.1マイニング(Mining)コース
- 取引情報や記録を集め、有効な個々のブロックを形成する過程
- ハッシュ関数においてブロック生成条件に合う数(Nonce)を見つけるために、相当のコンピューティングパワーを使い、有効な新しいブロックを完成させた採掘者はインセンティブを受ける。
- インセンティブ?新規ビットコインとブロックに含まれた取引の手数料を受け取る。
- インセンティブはP2Pベースの電子マネーを維持する手段であるだけで、電子マネーの目的ではない。
マイニング方法
- 特定の値(Nonce)を見つけるためのハッシュ演算処理
(1)ブロックのヘッダをSHA256() 演算、Nonce=0
- ハッシュ関数 – SHA256の特徴:Yの結果値を計算することは簡単、Yの値を持って逆にXを探すのは困難
(2)SHA256()の結果値<難易度目標値を満足するブロックヘッダのNonceを探せば成功。
- Xを求める2^256の演算は非常に難しいので、特定範囲の値を探して難易度調整をする
- 難易度調整は、難易度目標値の最初の0の数を増やしたり(難易度が高くなる)、0の数を減らす(難易度が低くなる)
(3)採掘者はインセンティブを受け取り、ブロックを作成し伝播する。
(4)他のノードが作成されたブロックが入手されると、計算を中断して、その次のブロックを作る計算に着手。
難易度調整
- ビットコインのルールで、2016番目のブロックごとに調整(ビットコインのルール)
- 2016個のブロックが生成される時間の平均値を求め、10分間に1個ブロックが生成されるよう調整する。
- ビットコインの難易度 https://bitcoinwisdom.com/bitcoin/difficulty
- Adjust time:難易度の調整時点
- Hashrate:世界採掘速度
- 1KH / S:毎秒1000個のハッシュを計算することができるコンピューティングパワー
- 1TH / S:1秒間に1兆個のハッシュ計算、0.01266のBITCが稼げる予想値(1月あたり)
- ビットコイン初期には簡単に設定されたが、マイニングの参加者が増えるに従い動的に調節して難しくなる、10分に1つ維持されるようにする
難易度調整の意味
- 独立的である、取引件数、コイン価値とは関係なく発行された貨幣規模は一定に調整される
- ハッシュパワーの増加は、自由市場方式が適用される
- 努力をかけるほどコインを多く得る構造
POW(作業証明、Proof Of Work)
- 特定難易度のタスクを実行したことを証明する手法
- 作業の難しさは難易度に合わせて設定し、その作業が完了したことを確認するのは容易でなければならない
- 様々な方法が作業証明に使用できるが、ビットコインは「Hashcash」方式を使用
HashCash
- マイニングのためにはHashCashを解かねばならない、これは自分がどれだけの努力を注いだかという証拠となる
- HashCash 4要素(ビットコイン例示)
- (1)目標:2016個のブロックを生成するのに2週間必要、すなわち、10分に1個
- (2)作業方法:ハッシュによる目標値を検索
- (3)難易度の調整方法:2週間かかるのを1週間で解決したら難易度を2倍にあげる。つまり過剰/未達部分だけ目標値の難易度を変更
- (4)難易度の調整時点:2016のブロックごと
マイニングの意味:Nonce検索 – > Hashcash課程 – > POW(作業証明、Proof Of Work) – >努力の証拠 – >信頼 – >努力で得られた貨幣
ビットコインの数量制限
- マイニングに追加されるビットコインは210,000ブロックごとに1/2に削減される
(画像ソース:https://en.bitcoin.it/wiki/Controlled_supply) - 2040年を最後に、約2100万ビットコインが発行される
- インセンティブが減ると、ユーザーはブロックを生成するノードを駆動するよりは、取引手数料を稼ぐように誘導される
消耗的な作業が必要な理由
- 互いに競争、監視することにより、取引の有効性を検証
- 誰も新規ブロックを独占的に作らないようにすることで、任意の操作や介入を第一段階から遮断する
- 困難なマイニング課程を介して新規ブロックの形成速度を平均10分程度に合わせて取引の収集と配布、取引の妥当性確認などが手順通りに進められる
- 結局、取引内訳がブロックに含まれて積み重なると、変更が不可能で、世界のどこでもその取引を確認できるようになり、セキュリティが維持される
3.2トランザクション処理
トランザクションの構造
- 取引には入力値と出力値がある。過去の出力値は、他の取引での入力値として使用
- 取引は公開鍵、秘密鍵に基づいて実行される
- A-> Bにコインを送信するとき、AはBに公開鍵(=口座)を送り、Aが当該取引の秘密キーで署名する
- ビットコインの取引行為は、現実世界と同様、自分の貨幣を与え残高を受け取る構造
- 現実では100ウォン払って30ウォン使い、70ウォンを受け取る
- ビットコインでは100ウォンが消え、私の70ウォンが新しくできる、相手は30ウォンが新しくできる
トランザクションの例
- Transaction CはCという人が発行した小切手と仮定
(画像出典:https://en.bitcoin.it/wiki/Transaction)
(1)Transaction Cには二つの入力、過去に発行された2つの小切手を参照するリンクがある
- Input一つはAから受信した100BTC
- Inputもう一つはBから受信した50BTC
(2)Cは150BTCを使用できるが、このうち101BTCをDに与えるという小切手がTransaction C.
- Transcation DはDが誰かに101BTCを提供する
- Trnascation Bは、以前の小切手がない小切手である。つまり採掘(Mining)で発行されたビットコインを含んでいる。最終的にはCが採掘者
- 最終的にCは、49のお釣りを持っている。これをUXTO、Unspent Transaction Outputと呼ぶ
残金、UXTO(Unspent Transaction Output)
- UTXO(Unspent transaction output):消費されていない取引の出力値
- 実際には1BTCを支出するのにちょうど落ちるUXTOを使用するのではなく、使用可能なUXTOをGreedyアルゴリズムで可能なUXTOを組み合わせる
- 1BTCの支出のためにUXTO 0.1+0.2+0.7の組み合わせ
- 一般的に、残高照会はUXTOをすべて加えたものである
- UXTO Rawdata
- https://blockchain.info/unspent?active=18tErV8Tg3ZPrBg7m3cjDZkajEtvfzWYfh
{ //当該アドレスのUXTOを見せてください "unspent_outputs":[ { "tx_hash":"db95f3769d95257c353b345e8a1052b6ac2a945ecb2784b88dca1bb3eeaee", "tx_hash_big_endian":"eeea3ebba1dc884b78b2ec45a9c26a2b05a1e88e5e343b357c259d76f395db", "tx_index":52726616, "tx_output_n":0, "script":"76a9145679a899dc210729cc845643fc998d4b61b4da7288ac", "value": 300000, // すべてのoutputの合計が残金となる 'value_hex':'0493e0' "confirmations":179540 }, { "tx_hash":"0cd81aad3c67f0361a02b49195f38c707846e39a93771eab360c94c65891ec48", "tx_hash_big_endian":"48ec9158c6940c36ab1e77939ae34678708cf39591b4021a36f0673cad1ad80c", "tx_index":52734187, "tx_output_n":0, "script":"76a9145679a899dc210729cc845643fc998d4b61b4da7288ac", "value":3274715,//すべてのoutputの合計が残金となる 'value_hex':'31f7db' "confirmations":179533 }, ] }
孤立トランザクション
- 複数のトランザクションでInputとOutputの継ぎ目が切れた場合
- 前取引の出力値を消費し、次の取引の入力値と出力値を生成
- 例)P2Pで伝播された時、最上位の出力値がなく、途中から来た場合、一時的に孤立
- DOS攻撃防止のため保管する孤立の数は制限されている
- 孤立取引プール:未承認取引リストを一時的に保管、ローカルメモリに上がっている
- 取引取引プールに追加されると、その取引の出力値を参照する孤立取引(当該取引の立場では子取引)があるかチェックして、いれば取引プールに移動、後日ブロックに追加
- cf)UTXOフル:ブロックチェーン上に存在する消費されていない出力値すべてが入っている集合
コインベース
- 最初のブロックを採掘した人への補償でもらった取引にはInputデータがない
- すべての取引は、inputとoutputがあるが、コインベースのみ例外
- 入力値が先か出力値が先かで出力値が先になる
3.3検証プロセス
- 中央制御局(信頼機関)はないが、分散化された独立的なノード数千個が特定の規則を従いながら作りあげた合意を導き出す
- 合意は、以下4つのプロセスが相互作用して作成される
(1)フルノード(すべての取引を持つ)は、各取引ごとに独立した検証実施
(2)作業証明(POW)から証明された計算法を使用して採掘ノードが検証取引を新しいブロックに独立して追加
(3)すべてのノードが新しいブロックを独立的に検証した後、チェーンブロックを連結
(4)すべてのノードが作業証明から行われた最高累積演算チェーンを独立的に選択 - 最終的に50%以上の参加者の同意を経て有効性が確認されると、候補ブロックは前のブロックに連結されてブロックチェーンが完成する
3.3.1独立した検証
- 形式検証:構文(syntax)、合法フィールドの値、値の範囲
- 取引検証:取引の入力値がUTXO(Unspent TX Output)であるか、すなわち有効であることは、入力値> =出力
- コインベース取引検証:コインベースOutputを使用するには、少なくとも100サイクル後に使用可能
- 他にも20以上のチェックリストがあるが、脆弱性や攻撃があるたびにチェックする項目は変更される
- すべてのノードは渡された取引の形式と内容を検証、検証された取引だけ他のノードに伝播
取引伝播
- ビットコインネットワークに転送されるだけですむ。すなわち、一つのノードに転送がされる
- 手段は無線LAN、Bluetooth、NFC、バーコード、ラジオ、衛星などでノード一つに伝達されると全世界に広がる
- 実際に周辺P2Pに連結した3〜4個のノードに伝達され、幾何級数的に伝播される
3.3.2作業証明によるブロック生成とトランザクション追加
- 例)アリスがボブの店でコーヒーを買いビットコインで支払う
(1)アリスがビットコインでボブのお店でコーヒーを買った取引を作る
(2)世界中のノードがその取引を受けて取引プール(=メモリプール)に追加する
(3)ボブが採掘(Mining)に成功してブロックを探す。アリスの取引をブロックに含め、次のブロックを作るようにする。そのブロックは全世界に広がる
(4)キャロルはボブがブロック作成に成功したことを知り、本人が持っていた取引がボブが作ったブロックであることを確認して、取引プールで重複取引を除去する
(5)キャロルは再び次のブロック競争に参加する
取引の優先順位
- 取引代金が大きく、古いUXTO記録であるほど優先順位が高くなる
- 優先順位= Sum(input * input age) / Transaction Size
- 採掘ノードは取引空間の中で50KBは優先度の高い取引に割り当てられている
- 採掘者が手数料の高い取引のみ含めるようにすることもあるが、優先順位に年齢が含まれることから、長期間、取引プールに残された取引は今後含まれる
取引伝播直後の信頼性
- 取引伝播直後<ブロックに含む<ブロックチェーンに含める
- 取引伝播直後
- バイヤーが取引を送信すると、数秒以内に世界中のほとんどのノードに伝播
- この取引はまだブロックチェーンに含まれていない(承認前の段階)
- 伝達された取引を受けたノードは、それぞれ独立的に個々を検証(検証ステップ1)
- ブロックチェーンに含まれている場合
- ブロックチェーンの特定の深さに達した場合(深いほど信頼性が高い)
取引の信頼性と現実の世界
- 少額取引は取引が伝播していることだけを確認して、通常の取引で扱われる
- 次のブロック(最長10分)が生成されるまで待つと現実世界と合わない
- 大きな取引は一定の深さ以上ブロックチェーンが積み上げられたとき承認
- 取引当事者が定められ、十分な深さに達すると採掘されたブロックの作業証明(POW)=信頼が確保されたと見做す
- 売り手の商品の提供時点はBが決定する
安全な取引規模
(画像出典:https://arxiv.org/pdf/1402.2009.pdf)
- ブロックの深さが1個の場合、ハッカーが全体の40%のコンピューティングパワーがあれば25BTC取引まで安全だと見る
- ブロックの深さが2個の場合、ハッカーが全体の40%のコンピューティングパワーがあれば54BTC取引まで安全だと見る
3.3.3 – 新しいブロックの検証
- ネットワーク上のすべてのノードが新しいブロックを独立的に検証する – >採掘したことを欺きにくい構造
- ブロックヘッダのハッシュは目標の難易度よりも小さいかを検証
- 文法的有効
- タイムスタンプは2時間以内など
3.3.4 – ブロック選択
- 最も長いブロック(=最も難易度が高い)チェーンを選択
- 新しいブロックを受信すると、前のブロックのハッシュ値を確認
- ノードは3種類のブロックを持っている
- メインブロックチェーンに接続されているブロック
- メインブロックチェーンから分岐して作成されたブロック:ブロックが競って作られた状態
- 親のないブロック:二つのブロックがそれぞれ短い時間でマイニングされ、逆の順序で到着した場合に発生する
- 親ブロックが到着すると順番に接続され、孤立したブロックのプールからなくなる
- 最も難易度が高いチェーンを選択することで、すべてのノードはネットワーク全体の合意を導き出して一貫性のある状態に収束する
同時に複数ノードがマイニングに成功した場合(=ブロック分岐)
- 長いブロック優先政策、時間の経過とともに短いブロックチェーンは消える
- 分岐が発生することがあり、採掘インセンティブはすぐに使用できない。100ブロック以降で使用可能、最終的に1人だけ支給
(画像出典:https://www.slideshare.net/skimaza/ss-57356762 /韓国語) - 参考)短いブロックチェーンに含まれる取引はブロック採掘者(コンストラクタ)が再び検証
ブロック分岐例示
- ノードは、Meshネットワーク、ノード間の距離はホップ数ベース(地理的な位置X)
(画像ソース:http://chimera.labs.oreilly.com/books/1234000001802/ch08.html#forks)
(1)世界のノードは、ブロックP(青)を最上段にしてブロックチェーンを持っている
(2)カナダは赤Aというブロックを作成し、オーストラリアは緑Bというブロックを作成して、互いに伝播した状況
(3)緑Bを伝播されたロシアが紫色Xブロックを作るようになり、伝播する
(4)短いブロックチェーンP-Aは破棄され、緑のP-B-Xブロックがメインチェーンとなる
ブロック生成周期が10分である理由
- 取引の承認時間(伝搬時間)と分岐が発生する確率の間で折衝した結果
- ブロック生成時間が早いほど取引処理速度は速くなるが、分岐が発生する可能性が上がる
ブロックの拡大要因とフロー
- 自分の利益(インセンティブ、手数料)を最大化する活動
- ブロックを伝播せず、引き続き本人の深さで採掘すると、破棄される危険がある
- 手順
- マイニングに成功すると、すぐに隣接ノードにブロック転送
- 各ノードは新しいブロックを転送して検証した後、伝播
- 各ノードは新しいブロックを自分のブロックのコピーに追加
- 各ノードは次のブロックの採掘を開始
3.4 P2Pアーキテクチャ
P2Pの長所
- 中央集中的な管理主体がなくブロックチェーンの動作と検証が可能
- ピアが多いほど安全になる構造
P2P上のノードの種類
(画像出典:http://chimera.labs.oreilly.com/books/1234000001802/ch06.html#_the_extended_bitcoin_network)
- 様々な形で存在、次の4つの機能を選択的に所有
- 機能B:ブロックチェーン全体を所有、取引検証が可能
- 機能N:ネットワークルーティング機能、全ノード必須
- 機能W:財布機能がある場合
- 機能M:採掘機能がある場合
- ライトウェイトノード:単純支払検証ノードとも呼ばれ、ブロックヘッダだけを持っており、取引は伝達しない
- スマートフォン、タブレット、内蔵型などの空間や戦略制限のある機器で駆動できるノード
- 参考)財布、モバイル財布、採掘用に使用される別途プロトコルがあり、スタートラムプロトコル
- スタートラムプロトコル:スタートラム採掘ノードとビットコインメインネットワークをつなぎ、スタートラムプロトコルとビットコインP2Pプロトコルを結ぶ
- スマートフォン、タブレット、内蔵型などの空間や戦略制限のある機器で駆動できるノード
- https://bitnodes.21.co/
ビットコインのノードになる過程
(1)最初のノードを索時にSeedNodeを通じて隣接ノードと接続(クライアントに長くよく維持されたSeedNode List存在)
- 地理的位置は重要ではない
(2)複数の接続が成立すると、近くの人にノードアドレスを渡してすべて連結させる
- ランダム接続。83333ポート、TCPコネクション、あるいは他のプロトコル
SPVノードの脆弱性
- 取引を自ら検証することができず、取引の存在有無を偽ノードが確認できる脆弱性
- 特定の取引を検証するためには、取引を検索する必要があるので、プライバシーが露出される(アドレス、アドレス+取引露出)
- ブルームフィルタ機能で解決
- 検索中のアドレスを明確にせず質疑応答を繰り返す、確率ベース
- 取引の検証精度&プライバシーtradeoff関係
SPVでマークルツリーとブルームフィルタを使用して取引を検証
- フルブロックは取引を検証できるが、ライトウェイトノードは独自検証が難しく、マークルツリーとブルームフィルタを使用して検証する
- 例)特定アドレスにビットコインが送金されることに関与するSPVノードがあると仮定
- (1)SPVノードは本人が興味のあるアドレスに受信される取引だけを監視するため、隣接フルノードとの接続通路にブルームフィルタを設置
(2)隣接ノードがブルームフィルタの条件を満たす取引を確認すると、ブロックヘッダとマークルパスを送信
(3)SPVノードはこのマークルパスを利用して、当該取引をブロックに連結し、取引がブロックに含まれることを検証する
(4)またブロックヘッダを利用して、当該ブロックがブロックチェーンに連結していることを確認
(5)すなわち取引とブロック間、ブロックとブロックチェーン間の2種類が組み合わされて、当該取引がブロックチェーンに記録されることを証明した - 要約:SPVノードがブルームフィルタで特定パターンに一致する取引を提供してくれることを要請する- >周辺SPVノードはブルームフィルタを受け、本人に当該取引か確率的計算をする- >ブルームフィルタ条件を満たせば、ブロックヘッダとマークルパス伝達- >該当取引かを確認。
参考)ブルームフィルタ
(画像出典:https://ja.wikipedia.org/wiki/ブルーム_フィルタ)
- ブルームフィルタは、20ビットのビット配列、異なるハッシュ関数の3つを持つ(図基準)
- xをハッシュして、20ビットサイズの配列で対応する位置に値を1に変更する、合計3回
- y、zも同様に進行する
- ブルームフィルタ生成(=元素追加):取引出力をブルームフィルタに入れ、配列の値を0から1に変更する
- ブルームフィルタ検索(=元素検索):同様にハッシュを回しbitが1であるか確認
- 一つのbitでも0が表示されたらない、という意味
- ブルームフィルタはhashであるため、0-> 1でビット値が累積する可能性がある。 – >ビット配列が小さく、ハッシュ関数が少ないほど取引検索精度は落ちる
4.脅威と限界
- 量子コンピュータの問題解決能力
- Full blockノードのインセンティブ不在
- 中国採掘能力拡大(集団行動)
- ウイルスを使用した分散採掘
- 財布紛失、盗難、ハッキング…etc.
- 処理速度は10分毎に1MBの容量のブロックが追加生成され、1秒間に7つの取引履歴を処理できる(1MBは取引1000〜2500取引含む)
- ビザカードが毎秒5万6千個処置
- 容量を増やすと検証と伝播時間が長くなる
- セキュリティと信頼性を確保する過程が低コストかの議論
- 取引情報検証のためのコンピューティングパワーを使うが、採掘者だけインセンティブがある
- コンピューティングパワーは、Google全体のコンピューティングパワーの20倍。電気料金は、1千5百万ドル。全体で見たとき、中央集中型より肥沃な問題提起が可能
- ガバナンス不在
- 生態系の形成過程において、関連ガバナンス、ガイド、拡散/伝播を担当する機構不在
- Pre-blockchain段階での信頼性不在。次のブロックに取引記録される構造
- ユーザー集団のハッキング、取引所のハッキング
5.その他注意事項
5.1ビットコイン秘密鍵生成過程
- 256bit乱数生成 – > Private Key作成 – > Elliptic Curve Multiplication(one way、楕円曲線乗算関数) – > Public Key作成 – > Hash Function(one way) – > Bitcoin Address作成(KeyKeyAddress構造)
- 乱数生成時、暗号学的に安全な疑似乱数生成器を使用すべき(CSPRNG)
- Private Key-> Elliptic Curve Multiplication実行プロセスは、NISTが開発したsecp256k1という標準に記載されている
- Public Key-> Bitcoin Addrの実行ハッシュプロセスは、SHA256 -> RIPED160 -> Base58Check
- 最終構造
- Private Key:256bit、16進数の64文字、場合によってはBase58Checkエンコードできる
- Public Key:520bitの16進数13文字、場合によっては圧縮。数学的な計算に基づいて、x、y座標の両方が含まれる
- Bitcoin Addr:Hash過程を経て、16進数の40文字、Base58Checkにエンコードに以下のような形で終了
- 例)1GwV7fPX97hmavc6iNrUZUogmjpLPrPFoE
5.2 51%攻撃
- ハッシュパワーのうち51%を制御しているマイニング集団がビットコインを攻撃する場合
- ブロックチェーンと二重支払取引内で意図的に分岐を作り、当該チェーンに再収束を実施するシナリオ
- 以前に承認されたブロックから分岐を作成し、当該チェーンに再収束を実施することで、猛威的なブロックを無効にする
- 例)A-> Bに50BTCを渡した取引が進行
- 当該取引の特定ブロックに含まれるや否、悪意のある採掘者は、当該ブロックの高さで再び採掘し、操作した取引を含める
- 分岐したブロックを増やしていくことで、ブロックが長くなり、結局、従来のブロック破棄とともに、取引がなくなる
- 大きな取引金額であるほど保護を受けるために何度も承認を待たなければならない
- HashRateが現在では幾何級数的に増加することにより、51%を掌握するのは現実的に難しい
5.3採掘とハッシュ競争
- マイニングに使うコンピューティングパワーが上がり続けている
- マイニングのためのハードウェア使用、CPU -> GPU -> FPGA -> ASIC
(画像出典:https://blockchain.info/ko/charts/hash-rate) - 現在はどれだけのチップを、一つの構造物の中に入れて熱と適切な電力を供給できるかを検討する段階
- 現在のハッシュ参加尺度:コンピューティングパワーにかかる電気、熱制御コスト <ビットコインの価値
- マイニング企業がコンピューティングパワーを一般に販売し利益をシェアする
5.4メンテナンス(カウンター)値の枯渇
- 最初は難易度を変えてマイニングしたが、ハッシュ速度が速くなるにつれて難易度が増加するようになり、ブロックヘッダの値2^32(4byte)だけ解約してもブロックが見つからない。現在はコインベースの取引に一部のフィールドを使用する
緊急警報放送システム
- 2013年マルチブロック分岐を発生させたDBのバグで使用される。公開キー基盤のため、署名を介して送信され改ざんされない
- ほとんど使用されない
パブリック、プライベートブロックチェーンの運営
- 対象サービスが既に存在する強力な仲介者に代わるビジネスモデルならパブリックブロックチェーン
- サービスの目標、顧客が単一企業または相互の透明性を重視する共同体であればプライベート
その他関連用語
ビットコイン財布
- 財布= {デジタルキー、ビットコインアドレス、デジタル署名}、ユーザーのローカルに保存される小さなDB
- デジタルキー= {公開鍵、秘密鍵}
- 公開鍵=口座番号、ビットコインを送信するときに使用
- 秘密鍵= PIN番号、ビットコインを消費する際に使用(署名)、出力値に個人が署名する
ハードフォークvsソフトフォーク
- バージョンアップグレードを意味する
- Softfork:新バージョンと旧バージョンを同時に使用しても問題がないアップグレード
- 採掘者は新バージョンにアップグレードする必要があるが、一般ユーザーは不要
(画像出典:https://blockchain.info/ko/charts/hash-rate)
- 採掘者は新バージョンにアップグレードする必要があるが、一般ユーザーは不要
- Hardfork:ブロックチェーンにフォークが発生するため、必ずアップグレードが必要
- 採掘者とユーザーの両方のアップグレードが必要
- フォーク後に既存サブカルチャーのブロックチェーンが淘汰される。したがって参加者の合意が必要であり、意見収集をする
- 例)ブロックの取引サイズは1MBだが、2MBに増やすにはプログラムの反映が必要であり、これはハードフォークとする
スクリプト
- ロックスクリプトと解除スクリプト
- ロックスクリプトは出力値に存在し、公開鍵あるいはビットコインアドレスが含まれること=ScriptPubKey
- 解除スクリプトは入力値に存在し、ユーザーの財布が秘密鍵から生成されたデジタル署名を含んでいる
- ロックスクリプトが出力値に置いた条件を「解決」するか、満たして出力値が消費されるようにするスクリプト=ScriptSig