カテゴリー
blockchain

ブロックチェーン(18)

コンピューターと多くの電力を消費して、総当たりで試行錯誤の結果として見つけられたナンス値は、「前のブロックに続くブロックに適合する値を見つけた」と他のノードに伝達すること以外に使い道はない(ナンス値はそもそも一回限りしか使えない)。

それで膨大な計算を行うために多くの電力が消費され、経済的に無駄のようにも思えるが、「誰も管理していない非中央集権型の通貨ネットワーク」という理想を実現するため、極めて重要な役割を担っている。

実際のところ、その電力のコストは、中央集権型のネットワークを使った銀行のシステムを維持するより、かなり低いと思われる。ただし、その電力の消費コストやそれ以外のマイニングにかかるコストを上回る報酬が平均的に得られることが保障されないと、マイナーはマイニングを持続的に行うインセンティブを経済的にもてない。

カテゴリー
blockchain

ブロックチェーン(17)

前回、暗号資産におけるマイニングとは新たなブロックを生成し、その報酬として仮想通貨を手に入れる行為だと述べた。

ビットコインのような暗号資産の新規発行とは、トランザクションを含んだブロックを生成する作業のことを指す。トランザクションデータは、ハッシュ値というデータで保管されている。また、取引の承認とは、トランザクションデータが書き換えられないように、つまり改ざんされないように、検証していく作業を指す。

マイニングは、ハッシュ値を計算するハッシュ関数と関係している。ハッシュ関数は、平文をハッシュ値に変換するのは容易だが、ハッシュ値からもとの平文を突き止めるのは難しいという、不可逆的な一方向関数という特徴をもつ。

マイニングの具体的な作業は、ブロック内のナンス部分を変更することでハッシュ値を切り替えていき、さまざまなハッシュ値を探索していく。その結果、ブロックのヘッダー部分のハッシュ値が特定の条件を満たす場合、マイニング作業が成功する。

マイナーがマイニングの結果、報酬を得るためには、他のマイナーよりも早く特定のナンス(ハッシュ値)を見つけることで、新しいブロックを生成しなければならない。

なぜ、このような電力を消費する行為を、ナンスを見つけるためにするかというと、マイナーが平等に作業に参加して(特定の誰かが必ず報酬を得るということになると、他の人々が参加しなくなる)、その結果を分散型ネットワークで共有することで、改ざんのしようがなくなるということになるからだ。そこで、改ざんするよりは、このマイニングに参加した方がコストが安くて報酬を得られる可能性があるので、皆はごまかすより、正々堂々とマイニングに参加するほうがよいと思うようになる。そのように設計されている。

カテゴリー
blockchain

ブロックチェーン(16)

ビットコインは、ブロックチェーンの技術を使っている。

ビットコインのシステムは、Peer to Peer型のコンピューターネットワークにより運営される。ビットコインが取引されるというのは、そのビットコインの所有権が、ある人から他の人に移ることだが、それをトランザクション(ビットコインの所有権移転: 取引)と呼ぶ。Peer to Peerで行うので、銀行間で現金を送金するようなことではなく、仲介者なしでユーザ間で直接に所有権移転が行われる。

このようなトランザクションはネットワークに参加しているノードによって検証され、ブロックチェーンと呼ばれる公開分散元帳に記録されていく。

ビットコインは、現在最も普及している暗号資産だが、世界最初の暗号資産というわけではなく、分散化されたネットワークで取引されはじめた暗号資産である。

ビットコインは、トランザクション処理作業に対する報酬という形で新規に発行される。 ネットワークに参加しているノード達が計算能力を提供することでトランザクションは検証され、公開分散元帳に記録される。

このトランザクションの検証と記録作業は、マイニングと呼ばれる。あたかも、金鉱で、金を採掘するイメージに似ているから、マイニングと呼ぶ。採掘者のことをマイナー(Miner)というが、マイナーはトランザクションの検証と記録作業の対価として、トランザクション手数料と新規発行ビットコインを報酬として受け取ることになっている。

カテゴリー
blockchain

ブロックチェーン(15)

ブロックチェーンにおけるブロックを生成する方法について述べる。

まず、ノンス(ナンス、ともいう。英語ではnonce)というものを理解する必要がある。ノンスとは、暗号通信で用いられる、使い捨てのランダムな値を指す。

なぜ、ノンスが必要か。暗号の送信者と受信者の間で、常に同じ暗号を使うと、もし送信した暗号が他者に盗まれてしまった場合、その他社は、送信者を装って受信者にその暗号を送ることで、受信者に何かを不正に要求することができる。それを防ぐために、暗号にノンスを加える。

例えば、ある暗号にノンスを加えるときにタイムスタンプを使うとする。例えば、通常使う暗号のあとに年・月・日・時・分からなるタイムスタンプをつける。例えば、201907222212。このようなノンスをつけることを受信者は第三者に知られないように安全に送信者から教えてもらう必要がある。

もし、他者が暗号 201907222212 というノンス付き暗号を盗んで、受信者におくっても、同じノンス付き暗号が2回使われるはずはないということで、それが不正な暗号であると受信者は判定できる。

もちろんこのノンスの付け方に法則性があることを他者が知ってしまうと悪用されてしまうので意味がなくなる。したがって、他者によって予測されてしまうようなノンスは使わない方がよい。

カテゴリー
blockchain

ブロックチェーン(14)

分散型ネットワークと分散型タイムスタンプについて、一通り基礎を説明した。

では、実際には、これらを使って、どのようにブロックを作っていくのかについて述べたい。

ブロックを作ることは、取引の記録をデータベースにつけていくわけだが、それをすべて、その場で行うと、膨大な作業量となることが想像できる。世界中にたくさんのコンピューターがあって、お互いに確認しながら、ハッシュ値が正しいかどうか、タイムスタンプが正しいかどうか、を調べていくわけである。

したがって、実際には、それらの作業をまとめて行うことになっている。

通常は1つのコンピューターが行った処理の時刻記録を行えばOKだが、分散型ネットワークであるブロックチェーンの場合、ネットワークに参加する複数のコンピューター(これをノード、node、という)で同時に記録する。そのため、それぞれのノードで少しずつ時刻にずれが生じていくという事態が起きる。nodeは、結び(目)と訳される。

分散型タイムスタンプでは、それぞれのノードでの時刻の平均をとって、それを一意的に定めて、混乱しないようにしている。

ちなみに、ブロックチェーンを応用したビットコインの場合、約10分ごとに作成されるブロックへタイムスタンプを押すことで、効率よくデータの順序を示すようにしている。

ブロック内の取引データをハッシュ値にしてタイムスタンプに組み込むことで、その時点においてデータが存在していたことを証明できるようになる。また、ひとつ前のブロックのタイムスタンプ自体も取引データとともにハッシュ値にされて、チェーンの連なりを作っていくので、前のブロックに戻って改ざんするのは極めて困難になる。ブロックの数が増えていってチェーンのような繋がりができていくことで、信頼性が増していく。

このように、分散型ネットワーク上で承認されたブロックは、多くの参加ノードで保持されることから、一つのノードによって、ブロックの改ざんを行うことは不可能になる。したがって、時刻認証局のような第三者機関を使わない場合でも、誰もが正しいと信頼できる分散型タイムスタンプが可能となる。

基本、唯一絶対の正しいものというのが存在することを信じるのは性善説であるが、そのような唯一絶対正しいものなど実際は存在しない。それよりも、多くの人々が正しいとお互い確認したことの方が絶対的に正しくはないかもしれないが、誰か特定の人間によってごまされるということがなく、ほぼ正しいので信頼できるという立場をとっているのが、分散型の特徴といえる。ある意味、民主主義的な発想といえる。

カテゴリー
blockchain

ブロックチェーン(13)

分散型タイムスタンプとは何か。

まず、タイムスタンプとは時刻を記録すること。何が先に起きて、何が後に起きたのかを記録することは、ブロックチェーンにおいて、どのブロックが先に作られ、どのブロックが後に作られたかを判別するために必要。

もちろん、その記録されるタイムスタンプが信頼できるものでなければならない。そこで、分散型。信頼できる第三者機関として、時刻認証局という組織が存在する。

ここでも暗号化と復号がかかわってくる。以下は、おさらい。

以前、公開鍵暗号について述べたが、そのような仕組み、基盤のことをPKIとよぶ。Public Key Infrastructureの略である。公開鍵と秘密鍵の組み合わせによって暗号化と復号化を行う。公開鍵と秘密鍵はセットで同時につくられるが、公開鍵のみが誰でも手にできるものであり、秘密鍵は誰にも渡されず作った本人のみがもつ鍵である。暗号の受信者と送信者がいる場合、受信者が秘密鍵をもっていて、送信者に公開鍵を使うケースと、送信者が秘密鍵をもっていて受信者が公開鍵を使うケースがある。用途によって、どちらのケースになるかが決まる。

この PKI をつかって、タイムスタンプするプロトコール(作法)は、”Time Stamping Authority”(TSA)と呼ばれる認証局がクライアントから送信されるデータのハッシュを元に、元データのハッシュ値と時刻を合体させたデータであるタイムスタンプトークン(Time-stamp token)を作成、これをクライアントへ応答として返す一連のプロトコールのことである。

プロトコールとは、もともとは、国家間における(外交上の)儀礼、典礼、議定書などの意味で使われ、もしくは国家間の協定の意味でもあるが、ある意味、お作法ということで、このお作法を守らないと失礼になるということである。

このタイムスタンプという技術は、電子的な認証を行うためには極めて重要な技術であるので、ぜひ押さえておきたい。

カテゴリー
blockchain

ブロックチェーン(12)

分散型ネットワークのことを、Peer to Peer(ピア・トゥ・ピア または ピア・ツー・ピア)ネットワークともいう。Peerというのは、(年齢・地位・能力などが)同等の者、同僚、同輩、仲間という意味である。つまり、Peer to Peerは、仲間と仲間がつながっているという意味になる。toを、英語で発音が同じ2(two)に置き換えて、P2Pと省略して書くこともある。

P2P型ネットワーク

一方、クライアントサーバー型ネットワークは下記の通り。

クライアントサーバー 型ネットワーク。サーバー(図の中央)とクライアント(周りの6つのコンピューター)とは一対一の通信を行う。
カテゴリー
blockchain

ブロックチェーン(11)

さて、これまで暗号やハッシュ値のことを述べてきたが、ここからブロックチェーンの仕組みについて述べていきたい。

ブロックチェーンとは、データベースのことで、ブロックでつながっていると、以前説明した。

それぞれのブロックは、そのブロックが作られた時間と、そのブロックの前のブロックへのつながりが示されている。例えば、人間であれば、その人がいつ生まれたか、両親が誰であるのかの情報を体の中に保持しているようなものをイメージしてもらってもいい。

新しいブロックを作るには、ハッシュ値が使われる。このハッシュ値には、以前のブロックの情報が入っている。例えば、実際に存在しない人間を現在存在する人間の遺伝子をまったく使わずに無理やり作ったとする。そうすると、その人間の両親を探そうとしてもそのような両親はどこにもいないわけである。そこで、そのような両親を今度は無理やり作り出さなければならない。そのようなことは容易にわかるように、現在の技術ではほぼ不可能である。同様に、前のブロックの情報がハッシュ値として入っている現在のブロックの情報を勝手に変える(つまり、改竄、かいざん、する)ことは、ほぼ不可能である。

さて、これだけでは、ブロックの情報が正しいのかどうかを保証することができない。

ブロックチェーンでは、ブロックの情報が正しいことを、二つのことで保証しようとする。その一つは、コンピューター同士の一対一のつながりである分散型ネットワーク。もう一つは、正確な時間記録を行うための分散型タイムスタンプである。

何事もそうだが、集中すると、スピードは速くなるが、力が一か所に集まりすぎることがある。例としては、独裁国家がある。情報がすべて一か所に集まり、意思決定を一か所で行えば、スピードは速いが、情報が改ざんされてしまう恐れがある。独裁者は自分に不都合な情報を勝手に変えて、自身の権力を維持しようとするだろう。

分散すると、相互に牽制があり、一人が自分に不都合な情報を勝手に改ざんしようとしても、他の人々がそのような改ざんを受け付けない。

コンピューターにおいても、いわゆる一つのサーバーと多くのクライアントをつなげるクライアントサーバーというネットワークだと、サーバーにあるデータが改ざんされると、すべてのクライアントコンピューターはその改ざんされたデータを表示してします。

しかし、すべてのコンピューターが独立して、必要に応じて、それぞれ他のコンピューターと接続して、そのデータが正しいかどうかを確認するようにすると、一つのコンピューターがデータを改ざんしようとしても、他のコンピューターがそれを受け付けない。

ブロックチェーンは、そのような分散型ネットワーク の仕組みを使っている。

カテゴリー
blockchain

ブロックチェーン(10)

ハッシュ関数をつかって、もともとの文(数字でも記号でもなんでもよい)を一定の長さの暗号文に変える。このハッシュ関数にはいくつかの特徴がある。

改竄(かいざん)検出。もともとの文が少しでも意図的に、もしくは無意図的に、変えられてしまうと、ハッシュ関数をつかって計算されるハッシュ値は、もともとの平文をハッシュ関数を使って計算したものとはまったく違ったものになる。たとえば、kazuo.nakamuraという元の文を、最後に小さなピリオドをつけて、kazuo.nakamura. とすると、ハッシュ関数を使って計算したハッシュ値は、もとのkazuo.nakamuraで計算したハッシュ値とはまったくことなるものになる。これによって、受信者は、kazuo.nakamuraが、それ以外のものに改竄されたと分かる。

kazuo.nakamura のハッシュ値を生成する(現在最もよく使用されているSHA-256という方式で)と、073B5A15BC50B5E2CC575E5D2EEE5926BDFF1FD8784E2499FAEE53F423E6912A

kazuo.nakamura. のハッシュ値を生成すると、476D08D58ABCB1F6C25320218D3451BFA084827C0D0E7843BAC92E8521EA5CD9

一般的に、改竄は相手が解らない程度に微妙であることが多いので、例えば、kazuo.nakamuraとkazuo.nakamura.では最後の小さなピリオドが付け加えられただけなのだが、それを簡単には比較しても区別できない、つまり改竄されたかどうかわからないことがある。それがハッシュ値を使えば、元の文のとても小さな違いも、ハッシュ値では大きく異なる数字・記号に置き換わるので分かりやすい。

次に、一方向性。狭い道路の一方通行を車で走らせると、もともとどこにいたのか分からないイメージである。つまり、元の文をハッシュ関数を使って、ハッシュ値に変換するわけだが、そのハッシュ値から元の文を推測する、もしくは逆変換することはできないということである。

最後に、衝突困難性。すべての異なるもともとの文は、ハッシュ関数によって、唯一無二のハッシュ値に変換されることが要求される。異なるもともとの文が、仮に、ハッシュ関数によって、まったく同じハッシュ値に変換されてしまうと、仮に、そのハッシュ値をもとの文に逆変換できたとしても、どれがもともとの文であるかがわからない。つまり、もともとの文と、ハッシュ値の間の関係は、一対一であるべきであるということである。

カテゴリー
blockchain

ブロックチェーン(9)

さて、多くの時間を暗号を説明するために割いてきたが、そろそろブロックチェーンの本題にもどらないといけない。

以前、ブロックチェーンとは、「ブロック」と呼ばれるデータの単位を生成し、それらのブロックを鎖(チェーン)のように連結していくことによりデータを保管するデータベースだと述べた。

それぞれのブロックは2つの線で結ばれ、基本、その前のブロック、その後のブロックとつながっている。場合によっては、その後に2つブロックに分かれてしまうこともあり、その場合は、分岐したという。英語ではフォークしたという。

ここで、各々のブロックは、その一つ前のブロックのハッシュ値を持っており、そのハッシュ値を遡ってたどることで、ブロックが、どのようにつながっているかをたどることができる。

ところで、ハッシュ値とは何か。

マクドナルドの、朝マックのサイドメニューにでてくる、ハッシュポテト。細かく刻んだジャガイモを混ぜて、油で揚げて茶褐色にした料理。ハッシュポテトは和製英語。英語で正しくはhash brownsという。

ハッシュ値は、元になるデータからハッシュ関数という関数をつかって、計算される規則性のない固定された長さの値のこと。ここで大事なのは、元になるデータは固定された長さではないこと。