このガイドでは、ブロックチェーンで構成するキーとなる技術要素とその概要を見ていきます。
ブロックチェーンの構造を見るのに、とてもわかり易いサイト(Anders Brownworth氏のサイト)があるので、このサイトを使いながら理解を深めていきましょう。
ブロックチェーンのデータ構造
ハッシュ(hash)暗号
ハッシュとは任意の長さの文字列を特定の長さの文字列に変換する暗号方式です。変換する際には、一方向の変換のみが可能で暗号結果から元のデータを作ることはできません(不可逆性)。
ハッシュ暗号には様々な種類のものがありますが、Ethereumの場合だと、keccak256という方式が採用されています。先述のサイトのハッシュのデモページでは、SHA256方式が使われています。いずれも256bit=32byteのデータです。
以下の画像の「データ」のところが任意のインプット文字列で、暗号結果が「ハッシュ」の箇所になります。結果の値は、0〜9とa〜fの文字で表現されます(16進数)。
インプットとなる文字列を修正すると、結果の値も変化します。
ブロック
ブロックチェーンは、英語では、Block(塊が)-Chain(繋がっているもの=鎖)、と分解できます。要するにブロックが鎖のように複数つながって、できているものです。では、ブロックとは何か?
ブロックはデータの塊の単位のことで、大まかに言えば、ブロックチェーンの場合、画像のような構造をしたデータの塊をブロックと呼んでいます(デモページ)。
では、ブロックのフィールドは、それぞれどのような意味を持っているのでしょうか?
- ブロック: # … ブロックはそれぞれ番号を持っています
- ノンス … ノンスはブロックのデータが正しいことを検証するために用いられるデータです
- データ … 実際のデータが入ります
- ハッシュ … 上記までの値をハッシュ暗号方式で変換した値です
このデータがブロックチェーンに書き込まれるには、条件を満たず必要があります。条件とは、ハッシュが”0000″からはじまるような値になるノンスの値であること、です。73608の場合は、ハッシュ値がdba3…となっており、条件を満たしていません(なのでわかりやすく赤い背景になっています)。
「掘る(マイニング)」ボタンを押すと、合致するノンス値を探そうとします。結果は、60616で、この場合は、ハッシュ値が0000から始まっており、条件を満たしています。
ブロックチェーン
ブロックチェーンは上記のブロックのようなデータ構造をしたブロックが多数繋がっているものになります。では、つながりは、どう表現されるのでしょうか?(デモページ)
次の画像に、「前」と記載がありますが、これは一つ前のブロックのハッシュ値になります。
ここで、試しに4番目のブロックのデータを変更すると次の画像のようにハッシュ値が変わってしまいます。また、4番目のハッシュ値が変わったことにより、5番目のハッシュ値も変わってしまいました。つまり、4番目と5番目のブロックのハッシュ値がいずれも0000から始まらないハッシュ値となり、条件に適合しなくなってしまいました。
- 仮に前のブロックのデータが変更された場合、前のブロックのハッシュ値も変更となる。結果として現在のブロックのハッシュ値も変わってしまう。
- 途中のブロックのデータを変更した場合、以降のブロックすべてのデータについて計算し直す必要がある。
前に説明した、ブロックチェーンの”不変性”は、この特徴によるものです。つまり、ある時点のデータを修正しようとすると以降のデータをすべて変更する必要があります。
分散性
ここまでは、ブロックチェーンのデータ構造を見てきましたが、これらのデータは、多数のコンピュータによって分散して、保持されています(それぞれのノードで同一のデータを保持しています)。(デモページ)
上記の画像で、仮にピアBのデータが不正に書き換えられたとしましょう。その場合のピアA、ピアBそれぞれの5番目のブロックのハッシュ値を見てみると、値は異なっているようです。つまり、ピアBの値だけが異なっており、明示的に悪意のある行動がされているということが検知できます。このような場合、ピアBはネットワークから除外されます。
参考)
デモページの4つ目では、データとして各取引(誰から誰にいくら分のトークンを送金したか)が含まれています。この中のいづれかを変えた場合でもこれまで見てきた例と同様に誤った値や再計算が必要である状態が検知されます。
公開暗号方式を用いた署名
公開鍵暗号方式
公開鍵暗号方式とは、公開鍵と秘密鍵という2種類の鍵によって、データ送受信における安全性を高める仕組みです。たとえば、AさんがBさんにメッセージを送りたい場合
- Bさんは秘密鍵と公開鍵を作成する
- AさんはBさんの公開鍵を取得し、それでメッセージを暗号化する
- Aさんは暗号文を送る
- Bさんは暗号文を秘密鍵で復号化する
公開鍵は秘密鍵から作成されます(デモページ)。
公開鍵暗号方式を用いた署名
ブロックチェーンでは、公開鍵暗号方式を用いて、「署名」というものを作成します。取引データを送信する場合、送信者は、自分の秘密鍵でメッセージを暗号化し、署名を作成します。(デモページ)
データの受信者は、メッセージと公開鍵、署名を受け取り、受け取ったメッセージが改ざんされているかどうかを検証します。次の画像の例では、署名した際とは異なるメッセージで受信されており、結果的に検証はNG(背景が赤)となっています。この際の公開鍵は、署名された際の秘密鍵とペアになるものです。
上記のメッセージが取引データになっても同様の仕組みで動きます。ただし、ここでは、Fromに記載されているものが公開鍵と同じものになります。
検証の結果が問題なかった場合、該当の取引データ(トランザクション)はネットワーク中に伝播され、やがてネットワーク全体に広がっていきます。
ここまでの内容をブロックチェーンに適用した例が、最後のデモページになります。
仮に一番最後のブロックの一番最初のトランザクションの総金額を7ドルから変更した場合、ブロック全体がNGになるのと同時に該当のトランザクションの署名も赤く表示されます。これは、トランザクションデータと署名の値が合致しないためにエラーとなっていることを示しています。
ご意見をお聞かせください!
この記事、または、web3チュートリアル全体について、是非、あなたのご意見をお聞かせください。
アンケートはこちらからご回答いただけます。
無料相談承ります
オンラインでの無料相談を承っています。ご希望の方は、お問い合わせフォームよりご連絡ください。
ITの専門家があなたのご質問にお答えいたします。
Comments