日本ブロックチェーン協会の定義から、ブロックチェーンを理解しよう⑦最終回 ~ データ同一性&まとめ編 ~
前回までのおさらい
2)「電子署名とハッシュポインタを使用し改竄検出が容易なデータ構造を持ち、且つ、当該データをネットワーク上に分散する多数のノードに保持させることで、高可用性及びデータ同一性等を実現する技術を広義のブロックチェーンと呼ぶ。」
前回は太字の部分のみを解説しました。まずは可用性について触れ、高可用性を説明しました。可用性とは「システムが壊れていない状態がどれだけ維持されているか」を示す指標の事(≒稼働率)でした。なので高可用性とは、高確率でシステムが壊れていない状態がどれだけ維持されているかの指標でした。
じゃあどのくらいが高いかの指標は以下の表のようになっていることになります。
Availabilityレベル Availabilityクラス 年間ダウンタイム 100% 連続処理 0分 99.999% フォールトトレラント 5分 99.99% フォールトレジリエント 53分 99.9% ハイアベイラビリティ 8.8時間 99-99.5% 一般の商用 44~87時間
そのうえでまた一つ読み進めていきたいと思います。
2)「電子署名とハッシュポインタを使用し改竄検出が容易なデータ構造を持ち、且つ、当該データをネットワーク上に分散する多数のノードに保持させることで、高可用性及びデータ同一性等を実現する技術を広義のブロックチェーンと呼ぶ。」
ついに最後になります。いやー、長かった。本当に。
データ同一性
そのデータは間違いない?改竄されていない?みんな同じデータになってる?ってことです。じゃあどうやってそれをするか。特別なプロトコル、電子署名、ハッシュポインタ、データ構造などなどさまざまな技術を用いて実現しています。そして、それらを用いて高可用性・データ同一性を実現する技術を「ブロックチェーン」と読んでいるんですね。
いやー、終わった終わった。今日はうまい酒が飲めそうだぜ!!って思うのは早いです。実はこの定義の下には以下のような文章が書いてあります。
定義策定のアプローチ
まず、Satoshi Nakamoto論文およびその実装である、ビットコインのブロックチェーンをオリジナルのブロックチェーン(以下「オリジナル」)として強く意識しています。
狭義のブロックチェーン(定義1)は、オリジナルを意識し、それが備える本質的で不可分な特徴を捉え、言語化しました。
広義のブロックチェーン(定義2)は、昨今〜今後の技術の展開を鑑み、オリジナルが備える特徴であっても、別の実装方式や別の目的への展開などにおいて、置換や変化が行われていく広がりを許容しながらも、特徴を捉えられるよう、言語化しました。
今後について
今回公開する定義は、現在時点の見解であると考えており、今後もアップデートが必要であると考えています。また、引き続き、ブロックチェーンに関する用語解説を策定していく予定です。
広義・狭義のブロックチェーン
何となくお忘れかもしれませんが、この定義は1)、2)がありました。ブロックチェーンで色々調べてみると、本当に様々な見解や説明が書かれています。そうなると自分も思いますし、周りからもあることを言われます。
「ブロックチェーンってなに??」
この素朴な疑問への一つの解として1)をオリジナル=ビットコインとして「狭義のブロックチェーン」、2)を「広義のブロックチェーン」として定義されたということになります。
じゃあ広義のブロックチェーンって何になるかというと以下の表が非常にわかりやすくまとまっていました。(ビットコインも入っているので、狭義も含んでますね)
出典:ビットコイン研究所ブログ(http://doublehash.me/blockchain-difinition/)
ここでは細かい説明はしません。何となくこれだけ多くの分類が出来るんだな、と思っていただければ十分です。
まとめ
1)「ビザンチン障害を含む不特定多数のノードを用い、時間の経過とともにその時点の合意が覆る確率が0へ収束するプロトコル、またはその実装をブロックチェーンと呼ぶ。」
2)「電子署名とハッシュポインタを使用し改竄検出が容易なデータ構造を持ち、且つ、当該データをネットワーク上に分散する多数のノードに保持させることで、高可用性及びデータ同一性等を実現する技術を広義のブロックチェーンと呼ぶ。」
定義策定のアプローチ
まず、Satoshi Nakamoto論文およびその実装である、ビットコインのブロックチェーンをオリジナルのブロックチェーン(以下「オリジナル」)として強く意識しています。
狭義のブロックチェーン(定義1)は、オリジナルを意識し、それが備える本質的で不可分な特徴を捉え、言語化しました。
広義のブロックチェーン(定義2)は、昨今〜今後の技術の展開を鑑み、オリジナルが備える特徴であっても、別の実装方式や別の目的への展開などにおいて、置換や変化が行われていく広がりを許容しながらも、特徴を捉えられるよう、言語化しました。
今後について
今回公開する定義は、現在時点の見解であると考えており、今後もアップデートが必要であると考えています。また、引き続き、ブロックチェーンに関する用語解説を策定していく予定です。
全7回に渡って説明することになった「日本ブロックチェーン協会の定義から、ブロックチェーンを理解しよう」ですがいかがだったでしょうか。以上の文を見て、ふむふむなるほどねと1mmでも思ってくれたのならこれほどうれしいことはありません。
また、今後についてと書かれているように、この定義はアップデートされていくはずですし、するべきだと思います。その時はまたこのブログで書いていけたらとも思います。
では今日はここまでです。ここまで読んで頂きありがとうございました!
何か不備等ありましたらご指摘いただけると幸いです。
参考資料
・なんでもかんでもブロックチェーン?何をもってブロックチェーン?ブロックチェーンの用語の混乱を整理してみる(議論たたき台) | ビットコイン研究所
日本ブロックチェーン協会の定義から、ブロックチェーンを理解しよう⑥ ~ 高可用性編 ~
前回までのおさらい
2)「電子署名とハッシュポインタを使用し改竄検出が容易なデータ構造を持ち、且つ、当該データをネットワーク上に分散する多数のノードに保持させることで、高可用性及びデータ同一性等を実現する技術を広義のブロックチェーンと呼ぶ。」
前回は太字の部分のみを解説しました。電子署名とハッシュポインタを使うことで、「改竄検出が容易なデータ構造」を実現しています。またそれをみんながみんなのデータを持っている(=当該データをネットワーク上に分散する多数のノードに保持させる)ことで改竄を防ぎ、もし起きてもそれが容易に検出できるように設計されていると説明しました。
そのうえでまた一つ読み進めていきたいと思います。
2)「電子署名とハッシュポインタを使用し改竄検出が容易なデータ構造を持ち、且つ、当該データをネットワーク上に分散する多数のノードに保持させることで、高可用性及びデータ同一性等を実現する技術を広義のブロックチェーンと呼ぶ。」
ということで今回は太字の部分ですね。今回は前回のようにちゃっちゃっと進みます!とはなりません。だって見てください。コウ・・・カヨウセイ?
思わずカタカナになってしまうぐらい難しそうな言葉。もう・・・いや。
可用性(Availability)
本題に入る前に、まずは最初の一文字を消した「可用性」ついて理解していきましょう。簡単に言えば「システムが壊れていない状態がどれだけ維持されているか」を示す指標の事です。そのため可用性=稼働率、として説明されることもあります。
システムは銀行のATMでも、インターネットでも何でもいいです。ちなみにJISでは以下のように定義されています。
許可されたエンティティが要求したときに,アクセス及び仕様が可能である特性。
さらに、稼働率は以下の式で表されます。
稼働率 = 総稼働時間/総時間
この稼働率が1に近くなるほど可用性が高く、0に近いほど可用性が低いということになります。正し、あらかじめ設定されたメンテナンスなどは故障には含みません。あくまで災害やサイバー攻撃、バグなどの想定外の故障になります。
高可用性(High Availability)
まあここまでくれば「高可用性」の意味も何となく察しがつくのではないでしょうか。可用性が高いこと。つまり高確率で、システムが壊れていない状態がどれだけ維持されているか、もしくは稼働率が1に近いことになります。
じゃあその高い確率とはどのくらいでしょうか? 80%? 90%? 人によってそれぞれだよ!となりそうではありますが、一応指針目安として以下のようになっているようです。以下の表は任意のシステムを1年間休まず動かした場合になります。
Availabilityレベル Availabilityクラス 年間ダウンタイム 100% 連続処理 0分 99.999% フォールトトレラント 5分 99.99% フォールトレジリエント 53分 99.9% ハイアベイラビリティ 8.8時間 99-99.5% 一般の商用 44~87時間
...99.9%!たっっっか!!!っていうのが個人的な感想ではあります(笑)まあATMとかSNSとかを想像したとき、年間で約8.8時間(一回でというわけではない)も止まったら困りますよね。それでも99.9%なんですから、システム作るってのは大変なんですね・・・・。
まとめ
2)「電子署名とハッシュポインタを使用し改竄検出が容易なデータ構造を持ち、且つ、当該データをネットワーク上に分散する多数のノードに保持させることで、高可用性及びデータ同一性等を実現する技術を広義のブロックチェーンと呼ぶ。」
高可用性とは、とにかく止まらない!ずっと稼働している!ということです。で、ブロックチェーンはそれを満たすような仕組みであるこということですね。
参考資料
・「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典
日本ブロックチェーン協会の定義から、ブロックチェーンを理解しよう⑤ ~ 改竄検出編 ~
前回までのおさらい
2)「電子署名とハッシュポインタを使用し改竄検出が容易なデータ構造を持ち、且つ、当該データをネットワーク上に分散する多数のノードに保持させることで、高可用性及びデータ同一性等を実現する技術を広義のブロックチェーンと呼ぶ。」
前回は太字の部分のみを説明しました。ハッシュポインタとは、ハッシュ関数から得られるハッシュ値を隣のブロックのポインタとして使うことで、ブロック(データ)ごとの繋がりを作っています。そのために以下のような要件を満たす、暗号学的ハッシュ関数も含めて説明しました。
- どんな入力にも固定長の値を出力
- 同じ入力には同じ出力
- 一方向性(原像計算困難性)
- 第2原像計算困難性
- 衝突困難性
これにより、ハッシュ値は少しでも入力が違うと出力結果が全く違うものになる&どんな入力を入れても固定長の出力が得られことになります。
そして、このような特性を持つハッシュ関数を用いることで隣のブロックを指し示す(=ポインタ)ことをしていますと説明しました。
そのうえでまた一つ読み進めていきたいと思います。
2)「電子署名とハッシュポインタを使用し改竄検出が容易なデータ構造を持ち、且つ、当該データをネットワーク上に分散する多数のノードに保持させることで、高可用性及びデータ同一性等を実現する技術を広義のブロックチェーンと呼ぶ。」
ということで今回は太字の部分ですね。今日は前回、前々回と違い、ちゃっちゃっと進みます!...たぶん
みんながみんなのデータを持っている
このブログで口うるさいほど言っているセリフがあります。それが「みんながみんなのデータを持っている」というものです。これを小難し言葉で表現しているのが「当該データをネットワーク上に分散する多数のノードに保持させる」というものです。
当該データはブロックチェーンに保存している何等かのデータになります。仮想通貨のような金銭データかもしれないし、公文章や生体データかもしれません。データの種類はここでは説いていません。また、ノードは連載一回目の記事で軽く説明しましたが、ネットワークに参加しているコンピューターやプログラムをさします。ここではネットワーク=ブロックチェーンになりますね。
改竄検出
以上のものが成り立つ理由も説明してきたのでここではあえて触れません。前回、前々回は少し技術的な話だったのでどうしても小難しい感じになりましたが、それは「改竄検出」を説明するためにしました。
電子署名は、署名者が間違いなく署名したことを証明する技術でした。ハッシュポインタは、隣のブロックを繋げる役割として働いていました。署名者しか知らない秘密鍵を用いることでデータの正当性を証明し、少しでも入力が違うと出力結果が全く違うものになる&どんな入力を入れても固定長の出力が得られるというハッシュ関数の特性を活かしたものでした。
これにより、みんなが好き勝手にみんなのデータを持っていたり、好き勝手に改竄することを防いでいます。もちろんそんな無法状態だったら、そもそも一つに合意できません。ただこれがもし改竄された時、分かりづらくては困ります。なぜなら改竄検出を何度も何度もチェックするのは大変ですよね。刻一刻とブロックが積みあがっていく中で、チェックにそう時間をかけられません。
なので出来るだけ簡単にチェックできなければなりません。それを実現するために外せない技術が電子署名とハッシュポインタ(もちろんこれだけではない)になるということです。
ただブロックに取り組む前に正当なデータであるかをチェックしてブロックに取り込んでいます。ですので、ブロックに取り込む(=データの合意)後ではなく、前に行われる場合の方が多いかもしれません。ただし、現在はブロックに取り組まれた後に改竄 or 不正なデータが発覚した場合にも対処できるようにしようという動きもあります。
まとめ
2)「電子署名とハッシュポインタを使用し改竄検出が容易なデータ構造を持ち、且つ、当該データをネットワーク上に分散する多数のノードに保持させることで、高可用性及びデータ同一性等を実現する技術を広義のブロックチェーンと呼ぶ。」
電子署名もハッシュポインタも、数学的に逆算が非常に大変という特性を持つことで改竄を防ぎ、もし起きても検出が用意になるように設計されています。さらに、多くのノードで成り立つ(具体的な数値は不明)ネットワーク状態だということですね。
今回もここまでお読みいただきありがとうございます!何かご意見ご指摘等ありましたらコメントいただけると幸いです。
参考資料
日本ブロックチェーン協会の定義から、ブロックチェーンを理解しよう④ ~ ハッシュポインタ編 ~
前回までのおさらい
2)「電子署名とハッシュポインタを使用し改竄検出が容易なデータ構造を持ち、且つ、当該データをネットワーク上に分散する多数のノードに保持させることで、高可用性及びデータ同一性等を実現する技術を広義のブロックチェーンと呼ぶ。」
前回(日本ブロックチェーン協会の定義から、ブロックチェーンを理解しよう③ ~ 電子署名編 ~ - 卒論から始まるBlockchain)はこの太字の部分だけを解説しました。例として以下のものを考えながら説明しました。
アリスがボブに10BTC送る状況を考るとき、超大まかなステップは以下のようになります。
- 「アリスからボブに10BTC送る」という取引内容をアリスがネットワークに知らせる。
- 取引内容に問題がないかみんなで検証する。
- 正しければ約束事(コンセンサスアルゴリズム)に沿って合意し、ブロックを繋げる。
この時の取引内容は本当にアリスがネットワークに知らせた(発行した)のかを証明する技術になると説明しました。
- アリスしか知らない秘密鍵で署名を作る
- ネットワーク上に公開鍵とともに公開
- 各ノードが公開された署名と公開鍵を使って、それぞれが同じものかを検証する。同じであればアリスの正当な取引とする。
このようにアリスが秘密鍵と公開鍵を用いることで、その取引内容が間違いなくアリスが発行し、途中で改ざんされていないとい事を証明しているのでした。
そのうえでまた一つ読み進めていきたいと思います。
2)「電子署名とハッシュポインタを使用し改竄検出が容易なデータ構造を持ち、且つ、当該データをネットワーク上に分散する多数のノードに保持させることで、高可用性及びデータ同一性等を実現する技術を広義のブロックチェーンと呼ぶ。」
...ハッシュポインタ?もういい加減スラーっと進ませていただきたい。そう願うばかりですね(´・ω・)
ハッシュポインタを説明する前にいくつか前提知識が必要そうです。それが、ハッシュポインタのハッシュの部分。こいつです。おそらくハッシュ値のことを指していると考えられる(間違ってたらごめんなさい)ので、そこから説明します。
皆さん、関数って覚えていますか?y=2x とか y=x+2 とかのあいつです。xに何かを入れるとyの値がわかります。つまり変数に任意の値を入力すると、それに対応して結果を出力します。 二次関数、指数関数、三角関数、etc...そんな中、本日ご紹介するのが「ハッシュ関数」でございます。そして、この関数から得られる値を「ハッシュ値」といいます。
この関数、とっても面白い性質を持っているんです。特に今回ご紹介するのは以下の2つです!!
- どんな入力にも固定長の値を出力
- 同じ入力には同じ出力
さらにブロックチェーンで求められるものはただのハッシュ関数ではありません。「暗号学的ハッシュ関数」です。以下のような安全性を満たすハッシュ関数がそう呼ばれることがあります。
- 一方向性(原像計算困難性)
- 第2原像計算困難性
- 衝突困難性
...頑張ろう。
どんな入力にも固定長の値を出力
少し変な質問をします。
Q:y=x+2に適当な整数を入力すると、それに伴って出力の桁数はどうなりますか?
A:入力の値によって変化する。
何を当然なことを言っているんだと思われたかもしれません。でもハッシュ関数だとそうはいかないからこんな質問をしました。実際にビットコインで使われているSHA-256(シャ-ニゴロと呼びます)を例に見てみましょう。
入力:1
出力:6B86B273FF34FCE19D6B804EFF5A3F5747ADA4EAA22F1D49C01E52DDB7875B4B
入力:1234567890
出力:C775E7B757EDE630CD0AA1113BD102661AB38829CA52A6422AB782862F268646
出力は数字以外の文字も含まれていますが、そこは気にしないでください。今回大事なのは出力の長さです。1桁でも10桁でも全く同じ長さですね。もちろん嘘ではありません。試しにこちらで色々試してみてください。なんでそうなるかは置いといて(単に説明できないだけ)、必ず任意の固定長の出力をするように設計されています。
同じ入力には同じ出力
当たり前だろ!って思った方が多いかもしれません。かくいう私もそう思いました。でも大事なので挙げました。これは言葉の通りです。特に説明はしません。
※先ほど挙げたサイトで例の入力をいれてみてください。同じものが出てくるはずです。ちなみに半角ですよ。
一方向性(原像計算困難性)
ここからは暗号学的ハッシュ関数を満たすための3要素の説明になります。見るからにやばそうな名前がついていますが大丈夫です。案外見かけだけです。
まず一つ目の「一方向性(原像計算困難性)」という性質。簡単に言えば出力から入力を求めることは困難(やろうと思えばできなくはないが、現実的に無理)ということです。
例えば
4A44DC15364204A80FE80E9039455CC1608281820FE2B24F1E5233ADE6AF1DD5
という出力が得られた時、どんな値が入力されたかわかりますか?わからないですね。ではこれならどうでしょう。F5CA38F748A1D6EAF726B8A42FB575C3C71F1864A8143301782DE13DA2D9202B
やはりわかりませんね。(ちなみに答えは10と20です。わかったぜ!という方、おそらく人知を超えたと思われます。こんなブログ見てないで全人類のために何かしてください。お願いします。)
正確に言うのであれば、出力されたh(m)から入力したmを求めることは非常に困難であるという性質です。
第2原像計算困難性
ある入力 mと、そのハッシュ値h(m)が与えられた時、同一のハッシュ値になる別の入力を計算することは困難であるという性質です。例えば先ほど10を入力したときのハッシュ値で考えた時、これと全く同じハッシュ値になる入力を見つけるのは非常に困難であることを指します。
衝突困難性
同じハッシュ値h(m) をとるようなメッセージ(m,m') の組を一つでも見つけることは非常に困難という性質。先ほどの第2原像計算困難性と似ていますが別物です。
とりあえずここまでだらだらと性質やら特徴やらを述べてきたわけですが、一番抑えておいていただきたいのは「少しでも入力が違うと出力結果が全く違うものになる&どんな入力を入れても固定長の出力が得られる」ということです。(じゃあ最初からそう言えというツッコミをしてはいけません)
ポインタ
ここまでさんざんハッシュ関数&ハッシュ値について説明してきましたが、ハッシュポインタの「ポインタ」部分の説明をしていきたいと思います。でもそう深堀はしません。
ここではデータ構造としてのポインタを指します。代表的なものはC言語になるかと思いますが、ここでは「何かを指し示してしている」という説明にとどめたいと思います。ですのでポインタとはデータの「何かを指し示している」ということだけを頭に入れてください。
ブロックチェーンでのポインタ
先ほどポインタとは「何かを指し示している」と説明しました。ではブロックチェーンでは「何を」指し示しているのでしょうか。
それは「隣のブロック」です。ブロックチェーンはデータをつなぎ合わせています。でもこれは物理的につながっているのではありません。あくまでデータで繋がっているのです。
そしてデータを繋ぐ役割を担っているのがハッシュ値になります。(もちろんハッシュ値は他にも役割があります) ビットコインを例にしましょう。
ビットコインでは10分置きに新たなブロック(データ)ができます。この時、全取引内容をハッシュ関数に入力し、その出力をh(m)とします。そしてまた10分経ち、新たなブロックを作るとき先ほどのようにハッシュ値h(m')'を出力します。しかし、ここで一工夫。先ほど作ったh(m)を入力にいれてh(m')'を出力します。つまりh(h(m),m')'になります。つぎの10分が経ち新たなハッシュ値を出力します。その時も同じように今までできたハッシュ値を入力に入れて新たなハッシュ値を出力します。
このようにブロック(データ)ごとにハッシュ値を作り、それが次のブロック(データ)とを繋げています。つまり次のブロックを指し示す役割になっています。(表現としては無理やりすぎるかな(;´・ω・))
こうすることでそれぞれのブロックに対して繋がりができます。つまりハッシュ値を用いることで隣のブロックの場所を指し示す(ポインタ)ことができるのです。
さらに先ほどのハッシュ値の特性から、各々のハッシュ値はほぼ雄一無二の値です。それぞれ偽装・改変することもほぼ不可能です。これがブロックごとの繋がりをより強固にしています。
まとめ
ハッシュ値を隣のブロックのポインタとして使うことで、ブロック(データ)ごとの繋がりを作っています。これが「ハッシュポインタ」になります。
調べているとハッシュチェーンと紹介されていることが多いような気がしましたが、あくまでハッシュ値が各ブロックのアドレスを指し示すような役割であるということを強調したくてこの言葉を使ったのかなと解釈しています。(まちがっていたらごめんなさい)
というこで今回はここまでです!ここまでお読みただきありがとうございました!!
何かご意見ご指摘等ありましたらコメントいただけると幸いです。
参考資料
日本ブロックチェーン協会の定義から、ブロックチェーンを理解しよう③ ~ 電子署名編 ~
前回までのおさらい
1)「ビザンチン障害を含む不特定多数のノードを用い、時間の経過とともにその時点の合意が覆る確率が0へ収束するプロトコル、またはその実装をブロックチェーンと呼ぶ。」
前回は太字部分を「ファイナリティーを確保する」という言葉に置き換えて説明しました。じゃあファイナリティーってなに?というのは以下のようなものを指しますとお話しました。
(1)受け取ったおかねが後になって紙くずになったり消えてしまったりしない、また決済方法について(2)行われた決済が後から絶対に取り消されない――そういう決済が「ファイナリティーのある決済」と呼ばれます。
ではなぜこれが定義の太字部分に関係あるかはブロックチェーンのある特徴に由来しますよ。それは「一定時間ごとにデータを繋げていく」、「より長くつながったデータを正しい合意とする」という二点によります(前回は説明を簡略化するためあえてこの二点に絞った)、と説明しました。
Q:ブロックチェーンは「どんな」データを合意しているのか?
A:ある計算を一番早く、正しくした者のデータをみんなで合意する(ビットコインの場合&データの中身についての話は省略)。そして、合意したブロックを一定時間ごとに繋げていく。
注意点
1:ある瞬間に、正しいデータが複数提案される(これをフォークといいます)ことがある。
2:その場合、より長くなった方を正しいデータとして合意し、繋げていく。短い方(その他のブロック)は無効になる。
これによりブロックチェーンでは、一時期は正当な取引であると合意されていたものが時間が経つと無効になる、覆される可能性があります。だからブロックチェーンでは「一定時間」ごとにネットワークで合意されたデータを繋いでいき、それらが後で「無効・覆る可能性」が限りなく0に近くなっていく(0%にはならない)ことでデータの正当性を担保しています。と説明し、最後に(1)のまとめをして終わりました。
ブロックチェーンとは:応答を返さない、誤った応答を返す可能性がある不特定多数の参加者を含むネットワークにおいて、時間が経つにつれてその合意内容が覆される確率が限りなく0に近くなっていくプロトコル、実装のこと
ということで、今回から(2)の説明をしていきたいと思います。では改めて定義を見て見ましょう。
2)「電子署名とハッシュポインタを使用し改竄検出が容易なデータ構造を持ち、且つ、当該データをネットワーク上に分散する多数のノードに保持させることで、高可用性及びデータ同一性等を実現する技術を広義のブロックチェーンと呼ぶ。」
・・・まあ、なぞだよね。画面たたき割りたくなるよね。だって最初の一語「電子署名」がわからんもん。
定義だからしょうがない?うるせぇ!もっとわかりやすく言えねえのかよ!
そんな方々のために、私頑張りたいと思います。
署名とは
そもそも署名とは何でしょうか。Google先生に聞くと、以下のような文が見つかりました。
行為者の同一性を示し、行為者の責任を明らかにするために行為者が自己の氏名を手書き(自署)すること。
出典:日本大百科事典(全書)、署名とは - コトバンク
これは間違いなく私(署名者)が行った・確認したものですよ。ということを証明するものなどで使われるものです。ここでは手書き(自書)と書かれていますが、ネットの世界にも証明しなくてはならない事があります。そして、ブロックチェーンにも必然的にあるわけです。
では一体どんな場面でそれは必要になってくるのでしょうか。ここではビットコインを例に説明していきます。
ブロックチェーンで必要な署名とは
アリスがボブに10BTC送る状況を考るとき、超大まかなステップは以下のようになります。
- 「アリスからボブに10BTC送る」という取引内容をアリスがネットワークに知らせる。
- 取引内容に問題がないかみんなで検証する。
- 正しければ約束事(コンセンサスアルゴリズム)に沿って合意し、ブロックを繋げる。
※今回は電子署名の話だけしたいので、色々省略してます。ごめんなさい。
※アリスとボブは暗号学などでよく出てくるので使っています。特に意味はないです
※BTC:ビットコインの略
ここで問題です。1.「アリスからボブに10BTC送る」という取引内容をアリスがネットワークに知らせる、と書きました。では、この取引内容は本当にアリスがネットワークに知らせた(発行した)のでしょうか?
もしかしたらボブが勝手に発行したのかもしれません。もしくはネットワーク全体に知らせる途中で、誰かが取引内容を改ざんしているかもしれません(本当は10BTCではなく1BTCだったなど)。でもそんなことはありません!確実にアリスが発信したものです!取引内容にも間違いありません!!という確証を得るにはどうすればいいのでしょうか。
これこそがブロックチェーンで必要な署名です。そして、こんな時に使われるものが「電子署名(デジタル署名)」です。
※他にも確認しなければならないことは多くあります。しかし、今回は説明簡略化のために絞っています。ご理解ください。
※赤文字は修正した部分です。大事な部分を赤にしているわけではありません。
電子署名とは
この電子署名をするために、アリスやその他のノードはどのような動きをするのか、超簡単にまとめてみます。
<アリス>
※暗号化していない元の情報=平文。暗号化した情報=暗号文といいます。以下それぞれを、平文・暗号文と表記。
<その他のノード>
- アリスが公開した公開鍵を使って、(暗号化した取引内容を元に戻す(以下、復号と表記)。)署名検証する。
- (復号したものと、平文を比べる。同じであれば、)署名検証が正しければアリスが本当に署名したものと判断。違っていれば正しい署名がなされていないと判断し、その取引は無視。
では要点を絞って説明していきます。
秘密鍵・公開鍵
最初にアリス(署名者)は以下の二つの鍵を用意します。
秘密鍵:アリス(署名者)だけが知る鍵。誰にも知らせてはいけない。
公開鍵:(今回は)署名検証(平文を復号化)するための鍵。ネットワーク上に公開するため誰でも知っている。
おそらく理解しがたいのは公開鍵ではないでしょうか。特にネットワーク上に公開するという点。鍵なのに公開していいの!?と思うかもしれませんが、大丈夫です。
何故なら公開鍵から秘密鍵を知ることは実質不可能だからです。ここで「実質」とつけているのには訳があります。というのも、現在の暗号技術は数学的計算量によって担保されたものを使用しています。つまり、計算すればいつかは暗号が解読できるかもしれないが、それは何万年、何十万年かければ解けるよ、ということです。一つの暗号解読にそれだけの年月がかかるならば、それは実質解読不可能と考えられます。この先に出てくる「実質」も同じ意味です。
※次回のハッシュの話をするので、その時に詳しく説明するかも?
次いで重要なポイントは秘密鍵は文字通り「秘密」にしなければなりません。これを知られたら、ほかの人々はいつでもアリスに成り代わることが出来てしまいます。しかもそれはネットワーク上では本物のアリスとして完全に認められてしまいます。その為、秘密鍵は絶対に知られてはいけません。絶対にですよ!!
また、電子署名では秘密鍵を用いて署名(平文を暗号化)します。この署名(この暗号文)はもちろんアリス(署名者)以外は実質解読することができません。
そして、この署名(暗号文)はアリスの秘密鍵からしか作れません。大事なのでもう一度いいます。この署名(暗号文)はアリスの秘密鍵からしか作れません。
これが後々、署名として活きてきます。
署名検証
その他のノードは、アリスの公開鍵を用いて署名検証(暗号文を解読)します。そして同じくアリスが公開した署名(平文)とを比べます。そこで、両者が一致していればアリスが署名したもの、つまりは正当な発起人が出した情報だと確認できます。
でもなぜそんなことが言えるのでしょうか。先ほどの一文を覚えていますか?「この署名(暗号文)はアリスの秘密鍵からしか作れません。」といいました。
つまり、公開された署名(暗号文)を作れるのは全世界で秘密鍵を持っている者のみ。今回でいうアリス本人でしかありえないということになります。
これでアリスが本当に署名をしたと確認することができます。
まとめ
秘密鍵・公開鍵の二種類の鍵を用いることで。電子署名という技術が成り立っているとお話しました。
これは署名者しか知りえない情報(秘密鍵)でしか作れない署名を作る(暗号文を用いる)ことで、その情報の正当性を得る技術になります。
本当はハッシュ関数を用いての説明の方がよかったかもしれませんが、それはまた次回ということにしました。
ということで今回はここまでです!お疲れ様でした。ここまでお読みいただきありがとうございました!!
何か不備等ありましたらご指摘下さると幸いですm(_ _)m
修正:2018/06/13
公開鍵暗号の秘密鍵・公開鍵の役割と、電子署名の秘密鍵・公開鍵の役割を勘違いしていたため一部修正を入れました。少々読みづらくなってはいますが、どこで勘違いしていたかがわかるように()に打消し線を引き、赤文字で修正しました。重要な部分という意味で勘違いされるかもしれない(あながち間違っていない?)ので、ある程度時間が経ったら黒文字にします。
ちなみに同じような勘違いをしている方は以下のブログがおすすめです!
あときっかけは以下のツイート。上のブログもその流れの紹介です。ありがたや(*´ω`)
誤解されることが多いけど、電子署名は必ずしも暗号化/復号化してる訳ではないですよ。RSAを使った公開鍵暗号では電子署名は暗号化/復号化と書けるけど、BitcoinやEthereumなどで使われているECDSAの電子署名は暗号化/復号化してる訳ではないので。
— Shigeyuki Azuchi (@techmedia_think) 2018年6月12日
参考資料
日本ブロックチェーン協会の定義から、ブロックチェーンを理解しよう② ~ ファイナリティー編 ~
前回までのおさらい
前回は定義1の一番最初に出てくる単語「ビザンチン障害」をメインに解説していきました。(日本ブロックチェーン協会の定義から、ブロックチェーンを理解しよう① ~ ビザンチン障害編 ~ - 卒論から始まるBlockchain)
ビザンチン障害:応答を返さない、誤った応答を返す障害のこと。
と紹介しました。さらに、それを含むネットワーク内でどのように合意すればいいかは、実はこの記事で紹介してたよ(ブロックチェーンってなに?に答えよう - 卒論から始まるBlockchain)と言いました。またそのような場合に、ネットワーク内で一つの情報(提案)に合意するためには、
ネットワークの総数:n≥3t+1(n:ネットワークの総数, t : 故障機器数)
正常に動く機器:m≥2t+1(m :正常に動く機器の総数, t : 故障機器数)
が必要だよ!という話をして終わりました。その上で今日は太字の部分
1)「ビザンチン障害を含む不特定多数のノードを用い、時間の経過とともにその時点の合意が覆る確率が0へ収束するプロトコル、またはその実装をブロックチェーンと呼ぶ。」
「時間の経過とともにその時点の合意が覆る確率が0へ収束するプロトコル」
をメインに説明していきたいと思います!
”プロトコル”とは
相変わらずどこから手を付けていけばいいのかというところですが、とりあえずカタカナから片付けましょう(何となく)。
プロトコル:機器同士がネットワークを利用して通信するうえで決めている約束事
この記事を読んでいる方の多くは日本語を母語にしているかと思います。ではなぜ私たちは「日本語」で会話ができるのでしょうか。それは「日本語」での単語の意味や、文法がわかっているから。つまり「日本語」のルールがわかっているからですね。一方が日本語で話し、一方がスワヒリ語で話しても会話は成り立ちませんね。同じように、インターネットや通信の世界も場所によって様々なルールがあります。でもそれでは不便だよね。だから、プロトコル(ルール、お約束事)を決めましょう。それをもとに色々やっていきましょう、というのがあるわけです。じゃあブロックチェーンにおけるルールは何かというと、
「時間の経過とともにその時点の合意が覆る確率が0へ収束する」ルール・お約束事です。
ふむ...わからん( ˘ω˘) ややこしい言い方しやがって、っという怒りは我慢しましょう。
この長くてややこしい文章を、私は「ファイナリティーを得る」と置き換えて理解しています(間違ってたらごめんなさい)。なのでここから先はファイナリティーについての説明を絡めながら進めます。
...余計ややこしくなってんじゃねえか(#^ω^)、っという怒りはもう一度我慢しましょう。ちゃんと説明しますから。
”ファイナリティー”とは
「ファイナリティー(fainality)」とは金融、特に決済の場面で使われる言葉です。例えば日銀のホームページにはこのように書かれています。
(1)受け取ったおかねが後になって紙くずになったり消えてしまったりしない、また決済方法について(2)行われた決済が後から絶対に取り消されない――そういう決済が「ファイナリティーのある決済」と呼ばれます。
まずは「(1)受け取ったおかねが後になって紙くずになったり消えてしまったりしない、また決済方法」を説明します。
例えば、私がある店で1万円分の商品券を使って買い物をしたとします。するとお店はその商品券を、発行元の会社に持っていき1万円に換金します。しかし、もし換金する前に発行元の会社が倒産したとしたら、その商品券はどうなるでしょうか。そう、ただの紙切れになりますね。そうなったとしたら、お店側は1万円分の損失を被ったことになります。
この、お店側が現金ではなく商品券を受け取るという事は、「損失を被る可能性を抱えた」事になります。これは商品券を受け取ったこと、倒産する可能性のある会社が発行した商品券を受け取った事、が原因として考えられます。そのため、決済には「(1)受け取ったおかねが後になって紙くずになったり消えてしまったりしない、また決済方法」が重要視されます。
次に「(2)行われた決済が後から絶対に取り消されない」を説明します。
先ほど受け取った商品券を換金した後、実は無効なものだったと判明したとします(拒否できない)。おかねを取り上げられるということは、お店側からすればタダで商品を手放したことになります。
つまり、「(2)行われた決済が後から絶対に取り消されない」事も決済においては重要なことになります。
ではなぜこれがブロックチェーンの定義の一文に関係があると私が言っているのか。それはブロックチェーンのある特徴に由来します。
ここでは2点だけに絞って説明します。
一定時間ごとに繋げていく
ブロックチェーンってなに?に答えよう - 卒論から始まるBlockchainの記事で「データの繋がり」と説明したことに関連しています。詳しい説明は省きますが、この「データの繋がり」は「一定時間」ごとに繋がっていく(長くなっていく)のです。(例えば、ビットコインだと10分に1ブロックずつ伸びていきます。)
また、「みんながみんなのデータを持っている」とも説明しました。ここでは、「どうやったら」一つのデータに合意できるかは説明しました。では「どんな」データを合意しているのでしょうか。
「どんな」データを合意するか
もう一度ビットコインを例に話を進めます。ビットコインでは「ある計算を一番早く、正しくした者のデータ」をみんなで合意しています。しかし、世界はとても広いです。なのでどうしても時間差により複数出てきてしますことがあります。しかも、この二人のデータはどれも違う(全く同じの可能性もある)が、どれも正しい(ここでは正しいとする)のです。
お前何言ってるんだ(´・ω・)、という声が聞こえますが本当なんです。ある瞬間に、正しいデータが複数提案される(これをフォークといいます)ことがあるのです。
それじゃあ、みんなで一つのデータに合意できてないじゃないか!どうするんだ!っとなりますね。しかしこれは単純。
それぞれが正しいと思う方(実際は早く受け取ったデータの方)を元に、新しくデータを繋げていきます。
そうしてより長くなった方を正しいデータとして合意していきます。じゃあ長くならなかった(合意されなかった)データはどうなるか―――無効です。なかった事になります。
一旦話を整理しましょう。
Q:ブロックチェーンは「どんな」データを合意しているのか?
A:ある計算を一番早く、正しくした者のデータをみんなで合意する(ビットコインの場合&データの中身についての話は省略)。そして、合意したブロックを一定時間ごとに繋げていく。
注意点
1:ある瞬間に、正しいデータが複数提案される(これをフォークといいます)ことがある。
2:その場合、より長くなった方を正しいデータとして合意し、繋げていく。短い方(その他のブロック)は無効になる。
ここで一番の問題点は「2:その場合、より長くなった方を正しいデータとして合意し、繋げていく。短い方(その他のブロック)は無効になる。」です。つまり、一時期は正当な取引であると合意されていたものが、時間が経つと無効になる、覆される可能性があるのです。これが決済の世界なら「ファイナリティーがない決済」になりますね。もちろんこれでは困るわけです。じゃあブロックチェーンではどうするか。ここで一気に話を戻していきます。
ブロックチェーンにおける”ファイナリティー”
「時間の経過とともにその時点の合意が覆る確率が0へ収束する」
ブロックチェーンでは「一定時間」ごとにネットワークで合意されたデータを繋いでいき、それらが後で「無効・覆る可能性」が限りなく0に近くなっていく(0%にはならない)ことでデータの正当性を担保しています。「ファイナリティを得る」、つまり「時間が経つにつれて、合意したものが覆る可能性が減っていく」ということになります。
じゃあどのくらいのペースで限りなく0に近くなっていく(収束)していくのでしょうか。例であげたビットコインでは6ブロック(10分×6ブロック=60分)待つことが推奨されています。実際にビットコインの最初の論文でその数式を見ると以下のようになっています。
出典:http://www.kk-kernel.co.jp/qgis/HALTAK/FEBupload/nakamotosatoshi-paper.pdf
※Pが大文字だったり小文字だったりするのは何故なんでしょう?わかる方いらっしゃいましたら教えてください(*_*;
とりあえず計算結果だけを見てみましょう。後のブロック(この場合zブロック)から追いつく=覆される確率は、ブロックが重なっていくごとに確率0へ近づいていっていることがわかりますね。もちろんp,qの値に依存いてしまいますが、ここではブロックが繋がっていけばいくほど、一度決まった合意が覆されにくくなっていっているんだとわかっていただければ十分です。実際この論文の結論では以下のように述べています。
良心的なノードが CPU パワーの過半数をコントロールす る限り、プルーフ・オブ・ワークを使って記録された公開型の取引履歴を攻撃者が変えようとすることが、コンピュータ的に加速度的に実質上実行不可能になっていく P2P ネットワークを提案した。
このような状態を「時間の経過とともにその時点の合意が覆る確率が0へ収束する」と述べているんですね。
まとめ
ブロックチェーンとは:応答を返さない、誤った応答を返す可能性がある不特定多数の参加者を含むネットワークにおいて、時間が経つにつれてその合意内容が覆される確率が限りなく0に近くなっていくプロトコル、実装のこと
となりますね。ただし、これは狭義の意味での定義と注意書きされています。さらに、協会でも一意に定義するのは非常に難しく、今後変わっていく可能性もあると述べています。ここまで、長ったらしく説明してきましたが、あくまで参考程度にしてくれということですね(笑)
今回で(1)は終わりましたが、まだ(2)の定義が残っております。次回からは、こちらの説明をしていきたいと思います。
では今日はここまでです!お疲れ様でした!!ここまでお読みいただきありがとうございましたm(_ _)m
//論文は妥協して原論文ではなく和訳を用いました。しかも画像を切り貼りしただけ。ごめんなさい(/_;)
また、何かおかしなところがありましたらご指摘頂けると幸いです。
参考資料
・ブロックチェーンのおいて確定を意味する言葉「ファイナリティー」
・第7章 決済の実行 : 日本銀行 Bank of Japan
・ブロックチェーンの基礎:ブロックチェーンの定義、種類、技術
日本ブロックチェーン協会の定義から、ブロックチェーンを理解しよう① ~ ビザンチン障害編 ~
はい、4記事目にして新シリーズが始まります。その名も「日本ブロックチェーン協会の定義から、ブロックチェーンを理解しよう」です(長いわ!というツッコミは受け付けません)。
個人的に大事だと思う、抑えてほしい点のみをピックアップして説明しました。でも何か気に食わないんですよね。自分が書いたのに。
じゃあどうしようと考えついたのが今回の企画ということです。めちゃくちゃ詳しい方々が議論に議論を重ねて作り出した定義を理解すれば、きっとそのブロックチェーンの真髄が理解できるはず!と意気込んでいます。では早速、協会のホームページに掲載されているブロックチェーンの定義を読み解きながら理解を深めていきたいと思います。以下が定義です。
1)「ビザンチン障害を含む不特定多数のノードを用い、時間の経過とともにその時点の合意が覆る確率が0へ収束するプロトコル、またはその実装をブロックチェーンと呼ぶ。」
2)「電子署名とハッシュポインタを使用し改竄検出が容易なデータ構造を持ち、且つ、当該データをネットワーク上に分散する多数のノードに保持させることで、高可用性及びデータ同一性等を実現する技術を広義のブロックチェーンと呼ぶ。」
狭義のブロックチェーン(定義1)は、オリジナルを意識し、それが備える本質的で不可分な特徴を捉え、言語化しました。
広義のブロックチェーン(定義2)は、昨今〜今後の技術の展開を鑑み、オリジナルが備える特徴であっても、別の実装方式や別の目的への展開などにおいて、置換や変化が行われていく広がりを許容しながらも、特徴を捉えられるよう、言語化しました。
なるほど、わからん。カタカナ多いし、聞いたことのい言葉もいっぱい。もうちょっとわかりやすくしろよ!!という声がどこからか聞こえてきそうですね。とりあえず難しそう、ということはよくわかります。ただ泣き言を言っていても仕方ありませんので地道に頑張りましょう。
もはやどこから理解すればいいのか悩むところですが、とりあえず順番に見ていきましょう。
1)「ビザンチン障害を含む不特定多数のノード
いきなりなぞですよね、この「ビザンチン障害」ってやつ。色々調べてみた結果、簡潔に表すならこんなこんな感じでしょうか。
ビザンチン障害:応答を返さない(オミッション障害)、誤った応答を返す(コミッション障害)障害のこと。
これは分散合意問題というもので出てきます。この問題は「不特定多数の参加者がいるネットワーク内で、ただ一つの情報に『合意』できるか」ということです。今世界中のインターネット利用者はどれくらいいるかご存知ですか?もちろんある程度は予測がつきますが、「正確に」何人かを知っている方はいらっしゃるでしょうか。そう、たぶんいません。なぜならその時々でパソコンを開いている人もいれば、いない人もいますね。新たに携帯を買った人も、失くした人もいます。このように何人いるかを正確に測定することが非常に困難なため「不特定多数の参加者」という前提がつくことになります。このような状況でただ一つの情報(提案)を全員で「合意したい(決定、共有したい)」場合を考えたとき、それはできるのかということです。さらに、その中には故障している機器もあり間違った応答を返す危機が含まれる場合があります。
応答を返さないだけならまだしも、誤った応答が帰ってきた場合、それが本当に間違っているのかを判断するのは非常に困難です。一体どうしましょう。でもピンときた方もいらっしゃるかもしれません。そう、前回の記事(ブロックチェーンってなに?に答えよう - 卒論から始まるBlockchain)で紹介した例題。まさしく同じような状況ではないでしょうか。これがビザンチン障害を例にしたもの(ビザンチン将軍問題)です。まさしく例題通りですね。
例題
今、5人の王様(A,B,C,D,E)がいると仮定します。
ある時外国から侵略がありました。この敵、めちゃくちゃ強そうです。なのでそれぞれが単独で戦っても勝ち目はなく、みんなで戦うしかありません。(じゃないとみんな駆逐される)そんな中、各王様は2つの戦略を思いつきました。
1,待ち伏せ策 2,猛突進策
どちらかの策に決めたいですが、残念ながら以下の制約があります。このような制約の中で、どちらか一方の策に決めるにはどうすればいいでしょうか?
・一同に会して話合うことはできない
・各王様は手紙でのみ、やり取り可能(SkypeやLineなど通信インフラは整っていない)
・一人裏切り者の王様がいる。もちろん誰かはわからない。
ビザンチン障害に置き換えると
・一同に会して話会うことが出来ない&手紙でのみやり取り可能=個人間(P2P)でしか情報交換、連絡できない
・裏入り者=機器の故障、停止状況
という状況に置き換えられます。そんな状況で一つの作戦に合意する(決定・共有する)にはどうすればいいでしょうか?ということでした。そこでどうしたか。お互いがお互いの情報を確認しあうことで解決出来るよ!!となりました。じゃあこれをインターネットでもそのまま置き換えてみましょう。つまり定義で書かれている「ビザンチン障害を含む」とは、このような解決が難しい(難しかった)障害も含んで定義します、ということですね。
ちなみにこのような状況で正しく合意がするには、全体の総数はどのくらい必要でしょうか。(送信情報は途中で紛失、改変されることなく宛先へ届く。各プロセスから全てのプロセスに通信路があり、情報が到着しないことをタイムアウトにより発見できる。遅延時間に上限があり、同期的であるとする。)
正解は n≥3t+1 です。(n:ネットワークの総数, t : 故障機器数)
またこの中で正常に動く機器は m≥2t+1(m :正常に動く機器の総数, t : 故障機器数)
必要になります。例題に当てはめると、
裏切り者:1人 正直者:3人(2×1+1)以上 総数:4人(3×1+1)以上
裏切り者:2人 正直者:5人(2×2+1)以上 総数:7人(3×2+1)以上
という構成ならば一つの提案に「合意」することが可能です。逆に、ネットワーク参加者の1/3以上が故障していた場合、全体で1つの正しい合意を得ることは出来ないということがわかります。悪い人ばかりではどのみち世界は成り立たないわけですね(´-ω-`)
ビザンチン障害:応答を返さない(オミッション障害)、誤った応答を返す(コミッション障害)障害のこと。
何となくここは理解できたでしょうか。
あとは「ノード(node)」ですが、これは簡単。つなぎ目という意味があるように、ネットワークに参加しているコンピューターやプログラムをさします。
これで最初に提示した「ビザンチン障害を含む不特定多数のノード」の意味は理解出来たでしょうか。いや~、長かった。とりあえず今日はここまでです!お疲れさまでした!!ここまでご一読いただき、ありがとうございましたm(__)m
//我ながら重いシリーズになりそうだなと思っています。頑張ってやりきりたい(;´Д`)