ビットコインは安全だっていうけれど、実際にどんな感じになっているのか分かりやすく教えてほしい。暗号化とか、良く分からないけど整理して教えてほしい。
こんにちは、サトシです。
上記の悩みに答えます。
今回のもくじ
- ビットコインの安全性
- ブロックチェーン構造
- マイニング(POW)の仕組み
記事の信頼性
僕はビットコインの専門家ではありません。上記の書籍を引用しつつ、補足しながら解説していきますので信頼性は担保しています。
ビットコインはその他の仮想通貨のベースとなっているコインです。ビットコインを学習すれば、仮想通貨の世界が広がります。
記事の構成は2パートです
本記事の構成をかんたんに説明します。
ビットコインはブロックチェーン技術で「安全」だと聞いたことがあると思います。「安全」といってもどんな感じで悪意ある攻撃から守られているか気になりますよね。
本記事は2つの観点から「安全」を見ていきます。
以下の通り。
- 観点①:データーを書き換え(=改ざん)された場合
- 観点②:送金途中に誰かに抜きとられる場合
「安全」は以下の技術で守っています。
- 観点① → ブロックチェーンとHash(ハッシュ)
- 観点② → 暗号化技術とマイニング
本記事は以下の構成ですすめます。
- 前半パート:観点①、観点②
- 後半パート:マイニング深堀り
「安全」を解説するうえでマイニングは外せません。とはいえ、文字ばかりだと眠くなるので、読者のみなさんも一緒に手を動かし確認しながら進めるように深堀していきます。
それではよろしくお願いします。
前半パート1の基礎知識です
まずは基礎知識を解説します。
3つあります。
- 基礎①:Hash(ハッシュ)値
- 基礎②:ブロックチェーン構造
- 基礎③:分散ネットワーク
順番に解説します。
基礎①:Hash(ハッシュ)値
IT用語辞典から引用します。
ハッシュ値とは、元になるデータから一定の計算手順により求められた固定長の値。
IT用語辞典 e-word
上記の通り。
簡単にお伝えすると、Hash値は入力がなんであれ、出力は64ケタのランダムな数値になります。
「一定の計算手順」とありますが、ビットコインの場合は「SHA-256」という種類の計算方法で64ケタの数値を返します。
Hash値の特徴が2つあります。
- 特徴①:入力が1文字でも違うと全く違う出力になる
- 特徴②:出力から入力は推測できない
実際にHash値をつくってみよう
Webに「SHA256暗号化オンラインツール」があるので、以下の通り入力みましょう。
- 入力:AさんからBさんへ1BTCを送金
- 出力:803ba1d7df46ab2ca803cb7b108c378cec24c98918dbdd3c73c773756366fd81
入力が上記と同じであれば、出力も同じになるはずです。
次は入力を1文字変更(B → C)してみます。
- 入力:Aさんから
C
さんへ1BTCを送金 - 出力:1cd3113cfd82fdf82ddbf0eb9732f833dd73ad0f0d9569b3566bc7c66cdb1f40
どうでしょうか。入力が1文字変えることで、まったく違った出力になったと思います。
これがHash値です。
基礎②:ブロックチェーン構造
次はブロックチェーン構造で、上記のイメージです。
少し解説します。
※ブロックの詳しい解説は後半パートで後述します。
- ブロックには「ブロックヘッダー」と「複数の取引データ」が入っている
- 「マックスルート」は複数のトランザクションをまとめたHash値
- マックスルートを含めたブロックのHash化されている
- 「前のブロックのHash」によりブロック同士が繋がっている
※取引データは「トランザクション」のことです。
要するに、ブロックの中身が丸ごとHash値になっていて、そのHash値通しでブロック同士が繋がっています。
上記の構造には2つの特徴があります。
書籍より引用します。
①たった一本の鎖である、②一方向にしか流れない(不可逆的である)、という2つの特徴があり、そのことがコピーや二重取引などの不正 防止に重要な意味を持っています。
大塚雄介. 最新 いまさら聞けないビットコインとブロックチェーン
上記の通りです。
引用文と繰り返しになりますが、ブロックチェーン構造によってコピーや二重取引を防止しているといった感じです。
少し脱線:ブロックチェーンを視覚的に見れる「ブロックチェーン検索」
bitFlyerの「ブロックチェーン検索」(外部サイトへ飛びます)は直感的にわかりやすかったのでご紹介。ブロックをクリックすると、ブロックの中身が確認できます。
また、上記の画像の中、右端の黒いブロックがあります。この黒いブロックはビットコイン通貨上、いちばん最初に生成されたブロックで「GENESIS(ジェネシス)」といいます。
基礎③:分散ネットワーク
分散ネットワークは平たく言うと、世界中に同じブロックチェーンのデータがたくさんイメージです。
ブロックチェーンのデータ(ブロック0からすべてのブロック)は、世界中のマイナーが同じデータを持っています。※補足:マイニングを行う業者をマイナーといいます
中央にサーバーがあるわけではなく、分散されそれぞれデータを保存しています。
特徴は、中央のサーバーがないので外からの1か所を攻撃されても痛くもかゆくもないといった感じです。
基礎知識は以上です。
前半パート:観点① データーの書き換え(=改ざん)は無理ゲーな話
次に、悪意のある第3者がデーター(どこかのブロック)を書き換えた場合を例をつかって解説します。
例の前提です。
- ブロック1、ブロック2、ブロック3が繋がっている
- ブロック2には900個のトランザクション
- トランザクション900は「Aさん → 自分 1BTCを送金」
トランザクション900の取引データを悪意のある第3者が書き換えたとします。
- 改ざん前:Aさん → 自分 1BTCを送金
- 改ざん後:Aさん → 自分 100BTCを送金
上記のように書き換えられた場合、次のようになります。
解説します。
- ブロック2 トランザクション900のデータを書き換え
- マックスルートが変更
- ブロック2全体のHash値が変わる
- ブロック3に入っていたブロック2のHash値と違う
上記の通り。
ブロック2の中を書き換えたことで、ブロック3との接続が上手くいかなくなります。
もしうまく接続する場合、次はブロック4を書き換え、ブロック5を書き換えと最新のブロックまで辻褄を合わせていかなければいけないという、無理ゲーが始まるわけです。
しかも、世界のマイナーには同じブロックチェーンのデータが分散されているので、すべて改ざんし続けるのは不可能といった感じです。
無理ゲーですよね。
つまり、観点① データーの書き換え(=改ざん)は無理ゲーです。
前半パート:観点②送金途中に誰かに抜き取られることはない?
次は送金中に第3者に狙われた場合です。
すこしだけ暗号化の基礎知識の解説です
ビットコインの暗号化には2つの技術が使われています。
ざっくり解説します。
- 電子署名 → 送信できるのは秘密鍵を持っている人だけ
- 公開鍵方式 → 受信できるのは秘密鍵を持っている人だけ
要するに「秘密鍵」を持っている人が正しいという感じです。
詳しい説明が知りたい方は「公開鍵暗号方式とは?初心者でもわかる公開鍵暗号方式の基礎」(外部サイトへ飛びます)をどうぞ。
基礎知識は以上です。
話をもどし、送金中に第3者に狙われたを見ていきます。
仮に以下の取引があったとします。
- Aさん → Bさん 1BTCを送金
取引中に不正が起きた場合、取引が正しいかという観点で確認しなければいけません。
次の3つの観点です。
- 観点①:送信元が正しいか
- 観点②:受信元が正しいか
- 観点③:送信内容が正しいか
順にみていきます。
観点①:送信元が正しいか(電子署名で守ってます)
上記の通り。
送信元のAさんに第3者がなりすました場合、Aさんの「秘密鍵」でデータを暗号化しているので、送信元はかならずAさんという事になります。
観点②:受信元が正しいか(公開鍵方式で守ってます)
上記の通り。
受信元のBさんに第3者がなりすました場合、データはBさんの「秘密鍵」でしか開けられないので、受信元はかならずBさんという事になります。
観点③:送信内容が正しいか
上記の通り。
AさんからBさんへ1BTCを送金した後にCさんにも送金した場合をみていきます。これを「二重取引」といいます。「二重取引」はマイニングによりマイナーみんなでチェック・承認しています。
という感じで、「観点②送金途中に誰かに抜き取られることはない?」→「基本的にはない」です。
後半パート:Blockchain Exploerを見ながらマニングを深堀り
前半パートで二重取引はマイニングによりチェックしているとお伝えしました。
そこで、マイニングってどんな仕組みなのかを解説していきます。一緒に手を動かしつつ、確認しながら進めていただけると嬉しいです。
以下の流れで進めます。
- ブロックチェーンを見てみよう
- ブロックの中身を見てみよう
- マイニングはNonce(ナンス)値(=鍵)を見つけるレース
順に解説していきます。
ブロックチェーンを見てみよう
「Blockchain Explorer => ALL Block」にアクセスします。
同じ画面になっていると思います。上記がブロックチェーンです。
各項目の説明です。
- Height:ブロックの番号
- Hash:ブロック全体のHash値
- Mined:ブロックができた時間
- Miner:マイニングした業者
- Siza:ブロックのサイズ
簡単ですね。
ブロックの中身を見てみよう
前半パートの図を使って、ブロックの中身を簡単に解説します。
ブロックの中身は大きく分けると以下の通り。
- ブロックヘッダー(=基本情報)
- 複数のトランザクション
実際にBlockchain Explorerをつかって「Blockchain Exploer → Block 732982」へアクセスし、確認してみます。
ブロックヘッダー(=基本情報)
図が見えにくいかもしれませんが、ブロックヘッダーにはたくさん情報があります。
とりわけポイントだけを解説します。
- Number of Transactions:→ブロックに含むトランザクションの数
- Merkle root(マックスルート):→➀分のトランザクションをまとめたHash値
- Nonce(ナンス):→先頭19文字を0にするために調整した値
- Block Rwward:→Nonceを見つけたマイナーへの報酬
※「Blockchain Exlpoer 」では見れませんが、「前のブロックのHash値」が記録されています。
Nonce(ナンス)はNumber used onceの略で一度しか使えない数値という意味です。何のためにあるのかは後述します。
複数のトランザクション
上記は、上から3つのトランザクションの図です。
「Blockchain Exploer → Block 732982」のトランザクションを見てみます。
1つのブロックには複数のトランザクション(取引データ)が入っています。
※ブロックヘッダーの「Number of Transactions:→ブロックに含む取引の件数」分はいっています。
トランザクションの内容は以下の通り。
- Fee: → 手数料
- Hash:トランザクション全体のHash値
- 送ったビットコイン
- 送信元アドレス
- 受信元アドレス
簡単ですね。
補足:マイナーへの報酬
上記の図の1番上のトランザクションの送信元に「COINBASE(Newly Generated Coins)」とあります。
このトランザクションはマイナーへの報酬です。報酬の送信先は、マイナーのアドレス(=財布)になります。
マイナーのアドレス「19dENFt4wVwos6xtgwStA6n8bbA57WCS58」をクリックすると、財布の中身が見れます。
「Final Balance」は今までの累積の報酬です。534.75998040 BTC(=執筆時点で26億円ぐらい)です。
以上がブロックチェーンの構造です。
マイニングはNonce(=鍵)を見つけるレースです
次にマイニングの内容を解説していきます。
まずは全体の流れです。
- マイナーはトランザクションプールからトランザクションを承認
- ルールに基づいたNonceをさがす
- いちばん早くNonceを見つけたマイナーはブロックとNonceを報告
- 報告を受けた他のマイナーはトランサミン含むブロックとNonceを確認
- マイナーの過半数がOKならブロックを接続
※トランザクションプールは未承認のトランザクションのたまり場です。
ざっと解説していきます。
前提知識:②のルールを解説
ルールを書籍から引用します。
最初の19 程度の文字がすべて「0」になるような任意の文字列を見つけなけれ ばいけないと決まっているのです。
大塚雄介. 最新 いまさら聞けないビットコインとブロックチェーン
実際にルールの通りになっているか「Blockchain Exploer」で確認してみます。
解説します。
上側が「Block 733475」、下側が「Block 733474」です。そして、それぞれのブロックのHash値とNonceです。
ブルーのハッチング部分は、ブロックのHash値の先頭19 文字「0」の部分です。
各項目を抜きだします。
- Block 733475
- Hash:
0000000000000000000
5cbabf435aa9d8a00f59f38ba8b0666bd56f4e09c639d - Nonce:3,344,115,827
- Block 733474
- Hash:
0000000000000000000
729efc2494ac575d9af832c8644234a83f8a30969eee4 - Nonce:560,311,810
上記の通り。
ルール通りブロックのHash値が先頭19文字、0が並んでいますね。
ブロックのHash値の先頭が0になるNonceを探しまくる
どういう事かというと、以下の通りです。
例えば、入力の後ろにNonceをつけてHash値を探してみます。※Nonceは値自体に意味はなく、ただの調整するための値です。
Webの「SHA256ハッシュ生成ツール」に入力してみます。
以下の通り。
Nonce:[11111111]の場合
- 入力:AさんからBさんへ1BTCを送金
[11111111]
- 出力:
997a8f0481cc4aef341
2c72959bd2554e15fb24094947568d0f987f687888cff
上記のNonceは、出力の先頭19文字がまったく0になっていません。
Nonce:[11111112]の場合
- 入力:AさんからBさんへ1BTCを送金
[11111112]
- 出力:
433fa00e477356d02c9
5d4b5dfe5716c47776dfefa24bb740d296eb6f252bc11
上記のNonceも、同じですね。
Nonce:[11111113]の場合
- 入力:AさんからBさんへ1BTCを送金
[11111113]
- 出力:
7c5e998d6b781fb8ae0
c5ff509eb37804a59ea04712cb3a160f43da10e0bd4fd
上記も同じです。
という感じで、ブロックのHash値の先頭19文字までが「0」になるまでNonceを変えるという計算をマイナーはしらみつぶしに繰り返します。
これをPool-Of-Work(プルーブオブワーク)といいます。
計算は半端ない回数です。
具体的な計算回数は10の22乗(=0が22ケタ)とか、そういうレベルで設計されています。さらに、コンピューターの高速化に伴って、時間の経過で計算回数は増えるようにも設計されています。たとえば、先頭19文字→20文字とかです。
Pool-of-work(プルーブオブワーク)は電力が半端なく、環境問題と言われています。アルゼンチンの年間電力よりも多いとか言われています。
Nonceがマイナー同士で同時に見つかることはない?
上記の疑問をもった方がいるかもです。
Nonceをはやく見つけるのは、当然コンピューターの性能に依存します。なので、マイナーはマイニング専用のハイスペックコンピュータを使います。
マイナーみんながハイスペックコンピュータを使うと、Nonceを見つけるマイナーに差ができないはずです。
じつは、マイナーが計算しているブロックは、マイナーごとに異なります。
理由は、以下です。
上記の理由があるので、Nonceを見つけるレースが成り立っている感じです。
はれて、Nonceを見つけたマイナーは、ほかのマイナーへ「みつけたよ」と伝え、ブロックとNonceを報告します。
ブロックを確認して過半数がOKならブロックが繋がる
Naonce(ナンス)値をいち早くみつけたマイナーは、ほかのマイナーにブロック(トランザクション含む)に不正がないかどうかチェックされます。
マイナーの過半数がOKとなれば、ブロックは承認されブロックチェーンに追加といった流れです。
前半パートの「観点③:送信内容が正しいか」は、ブロックの確認で他のマイナーが不正がないかを確認してくれる仕組みになっています。
まとめると、ビットコインはかなり安全です
以下の通りです。
- 観点①:データーの書き換え(=改ざん)は無料ゲーな話 → ブロックチェーンとHashで守られている
- 観点②:送金途中に誰かに抜き取られることはない? → 暗号化技術とマイニングで守られている
長くなってしまいました🙇♂️
今回は以上です。