次の方法で共有



March 2018

Volume 33 Number 3

ブロックチェーン - ブロックチェーンの基礎

Jonathan Waldman | March 2018

1999 年、ファイル共有ネットワーク Napster が誕生しました。これは、ピアツーピアのハイブリッド ネットワーク上でオーディオ ファイル (音楽を含むのが一般的) を簡単に共有できました (「ハイブリッド」というのは集中管理型ディレクトリ サーバーが使用されていたためです)。このようなファイル共有ネットワークで行われていたのは音楽ファイルの共有だけではありません。こうした共有ファイルのコピーはすべてのユーザーが保持できました。そのため、1 つのデジタル資産の完全なコピーがグローバル ネットワーク全体で数えきれないぐらい作成されることになります。コンピューターを使用しているユーザーであればだれでも利用できるこのテクノロジの手軽さは、由緒ある Tower Records を震撼させ、2006 年までに米国 89 店舗すべての閉店を余儀なくしました。

2008 年にはサブプライム ローンが崩壊し、長い歴史を持つ米国の強大な金融機関や保険会社が破産を申告したり、その瀬戸際まで追い詰められることになります。こうした状況は連邦政府に即時介入を求め、国内、さらには世界的金融危機発生の恐れを回避するよう迫りました。この重要な事態により、一般市民は銀行の集中管理型体制に不信感を抱くようになり、財務台帳を非公開にする危険性に世間の厳しい目が向けられることになります。2008 年 3 月には、Heartland Payment Systems のデータ侵害によって 1 億 3000 万件以上のクレジット カード番号が漏えいし、後にその多くが不正購入に使用されました。

これらの事件は、インターネットに接続されたデジタル世界に生きることの危険性を物語ります。デジタル世界では、取引手数料を得ようとする仲介者を利用することになり、デジタル攻撃、強欲さ、犯罪に対してユーザーは無防備な状態に置かれます。そのため、中間プロセスのない、利用可能なデジタル インフラストラクチャを作り出すことが学問上の課題になります。必要なのは、デジタル資産を所有者どうしの間でオープンかつ確実に転送する (コピーや共有ではなく) ことができ、堕落や誤りが起こりがちな中央機関が存在しない、安全で、信頼できるデジタル インフラストラクチャです。

ビットコイン ブロックチェーンの誕生

その誕生までの歴史的背景に応えるかのように、2009 年 1 月 3 日にそれは起こりました。新種のインフラストラクチャで 50 のデジタル通貨がマイニングされ、改ざん防止機構を備えた公開台帳にそれらが記録されました。この台帳が、インターネットに接続されたコンピューターから構成される分散型のピアツーピア ネットワーク上で複製されるインフラストラクチャです。これら 50 の暗号通貨はビットコインと呼ばれ、ジェネシス ブロックとして記録されました。これが、ビットコイン ブロックチェーンとして知られることになるネットワーク上での最初のリンクになります。

このブロックチェーンを基盤とする暗号通貨には特筆すべき点があります。それは、各取引を検証する信頼機関や統治組織 (銀行や政府など) が存在しないことです。さらに、こうした取引では中間プロセスが排除されます。つまり、ブローカーや機関などによる仲介が不要で、グローバル ネットワークを使用してデジタル通貨を全世界に転送できます。最新の暗号を利用するため、ブロックチェーンに含まれるデータは改ざんが防止され、匿名化されます。また、既知のブロックチェーンはそのピアツーピア ネットワークを構成するすべてのノード上で複製されるため、単一障害点がありません。それにより、可用性と信頼性に優れたテクノロジが実現されます。

ビットコインが開始されて以降、ブロックチェーン テクノロジは急速に発展を続けています。その実装の詳細は劇的に変わっており、ブロックチェーンの研究も活発で幅広く、複雑になっています。実際のところ、「ブロックチェーン」という用語はもはや特にビットコインや、一般的な暗号通貨のみに適用されるものではなくなりました。ブロックチェーンは、より高速かつスマートに動作するように洗練され、欠点がなくなってきています。実際、一部のブロックチェーン テクノロジでは、取引にカスタム ルールを適用できるスマート コントラクトをサポートするスクリプトを記述できます。このようにブロックチェーンは、ハッカーを防ぐプログラミング可能な新種のストレージ テクノロジへと変ぼうを遂げています。これが、IT プロフェッショナル、企業、金融機関などが、その真の可能性を追求することを強く求めている 1 つの理由です。

ブロックチェーンに対してこれまで傍観者の立場を取ってきたなら、今こそ追い付くときです。この入門コラムでは、特定のブロックチェーン テクノロジについて技術的な詳細を取り上げる予定はありません (各ブロックチェーンには独自のルール、機能、およびカスタマイズがあります)。しかし、ここで説明する概念は、多くの最新ブロックチェーン テクノロジを支える中核的な技術基盤を理解する後押しになるでしょう。

ブロックチェーンのしくみ

ビットコイン ブロックチェーンはブロックチェーン テクノロジの世界初の実例です。そのため、「ブロックチェーン」とビットコインは同義だと誤解されることがよくあります。しかし、最新のブロックチェーン テクノロジ サービスではデジタル通貨以外のデジタル資産が追跡されており、これらのブロックチェーンはビットコインのブロックチェーンとは動作が大きく異なります。また、ブロックチェーンは、貸方と借方を追跡することによって銀行台帳を仮想化するデータ構造であると同時に、暗号通貨の二重支払いを効果的に防ぐ創造的な暗号ソリューションも提供するという考え方が、ビットコイン ブロックチェーンによって一般に広まりました。こうした理由から、「デジタル台帳」と「二重支払い」という用語が暗号通貨のブロックチェーンと関連付けられるようになっています。しかし、これらはそれぞれ、所有権を追跡することと、デジタル資産に対して単一の移譲を強制することに広く当てはまる用語です。これらの用語を見たときに、暗号通貨に重点を置くブロックチェーン テクノロジのみついて言及しているとは思い込まないようにしてください。

基本的に、ブロックチェーンは改ざんを防止するデータ構造であり、所有者間でやり取りされる価値のある何かや関心の対象となる何かを追跡するものです。その「何か」には、あらゆる種類のデジタル資産が該当する可能性があります。たとえば、デジタル通貨、Word 文書、Microsoft Surface タブレットのシリアル番号などが該当します。実際、固有のデジタル フィンガープリントと関連付けられるアイテムなら、ブロックチェーンで追跡できます。ブロックチェーンは、デジタル資産の所有権について、コピーや共有ではなく転送を要求することで、いわゆる「二重支払い」の問題を解決します。しかし、ブロックチェーン テクノロジを興味深いものにしているのは、プロトコルを確立して、トランザクション ルールを強制し、さらにコンピューターから構成される分散ネットワーク上のノードが運用全体を自己管理できるようにすることです。そして、中央サーバーや信頼機関を介さずに迅速かつグローバルに (つまり国際的に) この偉業を達成します。このような将来性に興味をひかれた人たちは、ブロックチェーンのことを、仲介者を排除し、取引手数料を削減または不要にする方法だと考えています。そうなれば、企業にとっても消費者にとっても商取引の効率は高まるでしょう。

ブロックチェーンの中核を成すコンポーネント

ビットコイン ブロックチェーン ネットワークは公開されています。つまり、世界中のだれもが、どこからでも参加できます。しかし、Microsoft Azure でホストされているブロックチェーンなどの新しいブロックチェーン サービスは、パブリック ネットワーク、プライベート ネットワーク、または許可制ネットワークとして構成することができます。ブロックチェーンは分散化されていると見なされています。ただし、この用語は明確にする必要があるでしょう。Vitalik Buterin の説明 (bit.ly/2tEUYyT、英語) によると、「分散型ブロックチェーン」とは「政治的に分散」され (だれにも管理されていない)、アーキテクチャ的に分散されている (インフラストラクチャに中央の単一障害点がない) が、論理的には集中管理されている (共通して合意された 1 つの状態があり、システムが単一のコンピューターのように動作する) ことを意味します。 分散によって、フォールト トレランス、攻撃耐性、結託耐性 (この意味は後ほど Proof of Work について説明する際に明確にします) が実現されます。

パブリック ブロックチェーンの設計方法を理解するには、暗号ハッシュ、公開キー暗号化 (PKC)、バイナリ ハッシュ チェーン (特にマークル木)、および合意アルゴリズムについての知識が必要です。これらの概念を簡単に確認した後に、ブロックチェーンが、トランザクションのハッシュ チェーンを含むハッシュ チェーンであることを示します。この入れ子になったハッシュ チェーンの概念を把握すれば、ブロックチェーン テクノロジの基本設計を理解できるでしょう。

暗号ハッシュ: 一方向暗号ハッシュ アルゴリズムには多様な種類がありますが、よく採用されているのは SHA-256 (https://ja.wikipedia.org/wiki/SHA-2) です。この一方向ハッシュ関数は、最大 (264-1)/8 バイトのメッセージを受け取り、32 バイトのハッシュ値 (64 文字の 16 進数) を返します。これは 10 進数では 0 ~約 1.16 x 1077 の範囲内になります。その数字の桁を大局的な視点で見ると、1 滴の水は約 5 x 1012 個のアトムで、観測可能な宇宙は概算で 1078 ~ 1082 個のアトムの範囲内になります。メッセージ内の任意の文字を微調整して SHA-256 ハッシュ値を再計算すると、まったく新しいハッシュ値が生成されます (実験するには、onlinemd5.com (英語) にアクセスし、ファイルまたはテキストの [Checksum type] を [SHA-256] に設定します)。

同じ入力が与えられると、SHA-256 アルゴリズムは常に同じ固定長の出力を生成します。ブロックチェーン テクノロジに関して、SHA-256 暗号ハッシュを使用した値は一種のデジタル フィンガープリントとしての役割を果たすだけの一意性がありながら、チェックサムとしても機能します。さらに、一方向ハッシュ関数をデコードすることは (事実上) できません。筆者の名前の SHA-256 値を考えてみましょう。これは、8F12D83BA54AC0EA7687AD4AFDE5E258BBFF970AA8D60C6588381784C502CA8E になります。このハッシュ値が与えられた場合に、これをアルゴリズムによって筆者の名前に戻す実用性のある方法は存在しません (あるハッキング手法では、「パスワード」のような一般的な文字列に対応する計算済みのハッシュ値をリストしたレインボー テーブルが使用されています。ただし、これはアルゴリズムを使ってハッシュを元に戻したことにはなりません。このような攻撃を阻止するために、「ソルト」値と呼ばれるランダムな文字を追加して、ハッシュ後の文字列を装飾するのが一般的です)。

SHA-256 ジェネレーターが手元にない場合は、図 1 の表を考えてください。この表には、さまざまな長さの文字列から常に 64 桁の 16 進数のハッシュ値が生成され、任意の特定の文字を少し変更するとまったく異なる結果になることを示しています。

図 1 さまざまな長さの文字列を SHA-256 アルゴリズムを使用してハッシュ化

入力文字 SHA-256 ハッシュ値
m 62C66A7A5DD70C3146618063C344E531E6D4B59E379808443CE962B3ABD63C5A
M 08F271887CE94707DA822D5263BAE19D5519CB3614E0DAEDC4C7CE5DAB7473F1
M1 2D214CA69B86C255BE416D42CCA977A59B34A7492873105522C35015FAB806F0
M2 0892A10ECE1F933EE98F5D554601B28F8437801D1AA1B77799E4035DDCB6950C
March 9D95A2CF0D7180B5089691163B188A7203B0CDE179346B8CFAA8AB6C2C3E6414
March 1, 2018 767328E7367048FA9DB37354CFA43DBB1691E8330DB54D54F52C1A444CA2E680
March 2, 2018 CCF33BF1C08B74EDE6A7C15C56EEC16269D83967670032ACDA6EE395361B7595

ハッシュ値はダブルハッシュされる場合があります。ダブルハッシュとは、最初のハッシュ値に 2 回目の SHA-256 アルゴリズムを適用することでを再度ハッシュすることです。図 1 の値をダブルハッシュすると、図 2 のような結果になります。

図 2 図 1 の値のダブルハッシュ化

入力文字 SHA-256 ダブルハッシュ値
m A5FCE7E78734EC317F83F9019C80FFAF2508689B06EFA02191495A7D21FECE9A
M 6F6DCF58526B0D29EE664A708A939B7CDAC124A6A8569FCACE46FEAD38868E2E
M1 6C5D08BE9FFBBABD24B5F19AFFE6590FD402D347A50B519A59D40E15DCC0A6CB
M2 B2307311CC5877D5A581EDC821F3BFD5F99EB4E3B1D1B4009D9545BCF07E2E1A
March B5410E155022AE6EB22CA21FADEDE65F0F7296DE14CA1D7A720A4937BD23AA5D
March 1, 2018 345DD725FEE80F8C5953A66C1495605E4ED01C4CE5AEF6C0A6D238999266A1A6
March 2, 2018 3E85B3D910BA77F88ECD5E24D1396457C532C73B89C032DED9AD0CBB4D4D9794

公開キー暗号化: ブロックチェーンの主な機能の 1 つに、デジタル資産の所有権の追跡があることを思い出してください。問題のデジタル資産は無価値のこともあれば、何百万ドルに相当する場合もあります。そのため、所有権テストではその所有者になりすますことができないようにする必要があります。デジタル領域でこのようなテストを実施するために、ブロックチェーンでは PKC を利用しています。PKC によって所有者が資産にデジタル署名することで、所有権を証明してその資産の転送を許可できるようになります。対称キー暗号化では 1 つの秘密キーがメッセージの暗号化と暗号化解除の両方に使用されますが、それとは異なり、PKC では非対称キー暗号化が使用されます。

ブロックチェーンではデジタル資産所有権に対する正確な検証アルゴリズムが不可欠なため、楕円曲線デジタル署名アルゴリズム (ECDSA) を利用する、強度の高い公開/秘密キーの組を生成する方法が採用されています。ECDSA の利点は、長さが短くても、標準アルゴリズムのデジタル署名アルゴリズム (DSA) で生成される同じ長さのキーよりも暗号強度の高いキーが生成される点です。必要な場合は常に、ユーザーは ECDSA を採用しているソフトウェア アプリケーションにアクセスして暗号キーの組を生成します。ユーザーは秘密キーのバックアップを保持しておかなければなりません。ブロックチェーン上に保存されたデジタル資産で保持されている値を転送または利用するには、そのキーが必要になるためです。秘密/公開キーの組のうち秘密キーにさえアクセスでれば、この 2 つのキーの間には数学的な関係性があるため、公開キーを再生成できます。ただし、公開キーから秘密キーを生成することはできません (つまり、1 つのキーのみをバックアップする場合は必ず秘密キーをバックアップします)。

これらのキーは通常 3 つのいずれかの方法で使用されます。1 つ目のユース ケース (図 3 参照) は、受信者のみが開くことのできる暗号メッセージを送ってもらいたい場合です。それを行うには、相手に公開キーを渡し、暗号化アルゴリズムを利用して暗号化テキスト (メッセージの暗号化バージョン) を生成するソフトウェアと、渡したキーを使用してドキュメントを暗号化するように依頼します。その後、暗号化テキストのみを送ってもらいます。相手は渡した公開キーを使用してドキュメントを暗号化するため、その暗号化解除には適切に関連付けられた秘密キーを使わなければなりません。

受信者のみが開くことのできる暗号化されたドキュメント/メッセージを送ってもらいたい場合に PKC を使用
図 3 受信者のみが開くことのできる暗号化されたドキュメント/メッセージを送ってもらいたい場合に PKC を使用

2 つ目のユース ケース (図 4 を参照) は、メッセージを暗号化し、その送信者が実際に自分であることを証明する必要がある場合です。それを行うには、秘密キーを使用してドキュメントの暗号化テキストを生成します。次に、その暗号化テキストを相手に送ります。相手は送信者の公開キーを使用してその暗号を解除します。送信者の公開キーを使った場合に限り、そのドキュメントの暗号化を解除できるため、相手は、そのドキュメントが送信者の秘密キーで暗号化されており、その秘密キーが悪用されている場合を除いて、そのドキュメントが送信者から送られたものであると推測することができます。

暗号化されたドキュメント/メッセージを相手に送り、その送信者が実際に自分であることを保証する必要がある場合に PKC を使用
図 4 暗号化されたドキュメント/メッセージを相手に送り、その送信者が実際に自分であることを保証する必要がある場合に PKC を使用

3 つ目のユース ケースは、PKC を利用して、デジタル署名プロセスを通じてデジタル資産の所有権を証明することです。このユース ケース (図 5 参照) では、Bill が法的拘束力を持つドキュメントの Word 文書を作成し、これを Susan にメールで送る必要があるとします。Susan は Bill から受け取ったドキュメントのコピーが実際に Bill から送られたものであり、途中で改ざんされていないことを確認する必要があります。Bill はまずその Word 文書の SHA-256 ハッシュを作成し、その値を H(W) として記録します。次に、秘密キーを使用してそのドキュメント ハッシュを暗号化します。その結果は Enc(H(W)) になります。それから、その (オプションで暗号化された) Word 文書と Enc(H(W)) 値 (ドキュメント W に対する Bill のデジタル署名) を Susan に送信します。

PKC と暗号化ハッシュを併用したドキュメント/メッセージへのデジタル署名
図 5 PKC と暗号化ハッシュを併用したドキュメント/メッセージへのデジタル署名

Susan は受け取った Word 文書のコピーから H(W) 値を再計算し、Bill の公開キーを使用して Enc(H(W)) 値の暗号化を解除します (図 6 参照)。Susan が計算したハッシュと暗号化を解除した H(W) 値が等しければ、Susan は Bill がそのドキュメントに署名しており、受け取ったコピーは Bill が署名したものとまったく同じものであると結論付けることができます。

ドキュメント/メッセージが想定した相手により署名されていることを検証するための PKC と暗号化ハッシュの併用
図 6 ドキュメント/メッセージが想定した相手により署名されていることを検証するための PKC と暗号化ハッシュの併用

ハッシュと PKC を利用することで、ブロックチェーンではデジタル資産に関する所有権の履歴がトランザクション全体で保持されます。トランザクション データ オブジェクトは相互にリンクされ、ハッシュ チェーンと呼ばれるデータ構造を形成します。これが機能するしくみは、関数 (H) を使用してハッシュされ、次に所有者の秘密キー (s) を使用して署名されているメッセージ (m) で各トランザクション レコードが構成されるというものです (「public key」 (公開キー) の「p」と混同しないように、「secret」の「s」を使用して秘密キーを表すのが一般的です)。 これにより、次の署名 (sig) が生成されます。

sig = signature(H(m), s)

デジタル資産をある所有者から別の所有者に転送すると、そのデジタル署名が確認され、新しい所有者によってデジタル署名されて、ハッシュ チェーン上に新しいノードとして登録されます。実装の詳細はブロックチェーン テクノロジとバージョンに応じて大きく異なりますが、基本的な概念はいずれも同じです。たとえば、図 7 に示すように、デジタル資産の所有者である Bill が、自身の秘密キーを使用してその資産を Susan に転送するとします。Susan のトランザクション レコードでは Bill の公開キーを使用して Bill の署名が確認されます。その後、Susan の公開キーを使用してそのデジタル資産に署名することで、Susan が新しい所有者になります。これにより、新しいトランザクション レコード、つまりトランザクション ハッシュ チェーン上に新しいリンクが作成されます。

デジタル署名を使用してデジタル資産の所有権を転送するトランザクション ハッシュ チェーン。各トランザクション レコードではハッシュ チェーン上の前のトランザクションに対する暗号化された後方リンクを保持
図 7 デジタル署名を使用してデジタル資産の所有権を転送するトランザクション ハッシュ チェーン。各トランザクション レコードではハッシュ チェーン上の前のトランザクションに対する暗号化された後方リンクを保持

このトランザクションのハッシュ チェーンは暗号で保護され、改ざんが防止されます。Transaction 0 に変更が加えられると、Sig0 が変更され、それにより Transaction 1 に格納されたハッシュ値と、ハッシュ チェーン上のそれ以降のすべてのトランザクションを更新することが必要になります。

これらのトランザクション オブジェクトにデータが含まれているとします。各トランザクションに格納されるデータはブロックチェーン実装ごとに異なるため、本稿の目的に合わせて基になるデータを抽象化しています。というのも、ハッシュ チェーンは暗号でリンクされたトランザクションのチェーンだということを理解するのが主なポイントになるためです。つまり、前所有者のトランザクション レコードのハッシュ値でリンクされます (暗号通貨のブロックチェーンでは、各トランザクション オブジェクトに、タイムスタンプやオプションの取引手数料などのメタデータに加えてデジタル通貨の入出力リストも格納されます。これらの暗号通貨の入力と出力によって、財務台帳を正確にモデル化するために必要なトランザクションの詳細が提供されます)。

マークル木: 一部のブロックチェーンでは、別の種類のハッシュ チェーンを使用してトランザクションをひとまとめにしています。それがバイナリ ハッシュ チェーン、つまりマークル木です。完全なマークル木は、ルート以降の各レベルで 2 枝に分かれているため二分木構造と見なされています (図 8 参照)。

マークル木はマークル ルート ハッシュを生成する一種の二分ハッシュ木。このデータ構造では完全な再計算を行わずに効率的にリーフ ノードを追加して新しいマークル ルートを計算することが可能
図 8 マークル木はマークル ルート ハッシュを生成する一種の二分ハッシュ木。このデータ構造では完全な再計算を行わずに効率的にリーフ ノードを追加して新しいマークル ルートを計算することが可能

マークル木を設定する作業では、各トランザクション オブジェクトに格納されているデータの SHA-256 ハッシュを計算して、一連のリーフ ノードを作成します (ビットコイン ブロックチェーンでは各マークル ノードをダブルハッシュします。SHA-256 アルゴリズムに脆弱性が発見されたとしても、ダブルハッシュによってハッシュ結果の暗号値を強固にできます)。マークル木では偶数個のリーフ ノードが必要です。奇数で開始した場合は最後のリーフ ノードを複製するのが慣例です。次に、リーフ ノードの各ペアを一緒にハッシュして新しいハッシュ値を生成します。図 8 では、Leaf A に Transaction A のハッシュが HA として示されています。Leaf B では Transaction B のハッシュが HB として示され、以降も同様です。このパターンは最後のルート ノードに到達するまで各ツリー レベルで継続されます。ルート ノードのハッシュ値は、ツリー内の他のすべてのハッシュ値を合計した暗号ハッシュ値です。任意のリーフ ノードのデータに変更を加えると、再計算されたマークル木のルート ハッシュ値が変更されます。

このマークル二分ハッシュ木構造にはいくつかの利点があります。たとえば、マークル木全体をゼロから構築することなく、トランザクション内のデータを更新して新しいマークル ルート ハッシュを簡単に計算できます。たとえば、(図 8 で強調表示されている) Transaction E を変更する場合、必要な作業はツリーを効率的にマークル ルートまで探索し、レベルごとに新しいハッシュを 1 回計算することだけです。したがって、まず新しいリーフ ハッシュ HE を計算します。次に、HEF を HE および HF から計算し、HEFGH を HEF および HGH から計算します。その後、新しいマークル ルート ハッシュを HABCD および HEFGH から計算します。マークル ルート ハッシュの更新では 4 回の計算しか必要ありませんでした。一方、マークル木をゼロから構築するには 15 回の計算が必要でした。

ブロックチェーンの構築

ブロックチェーンを構築するには (図 9 参照)、トランザクションを格納したバイナリ ハッシュ チェーン データ オブジェクトを、改ざん防止機構のあるだれでも使用可能なデータ ストアに何らかの方法でコミットしなければなりません (これがパブリック ブロックチェーンであることに注意してください。つまり、ネットワーク上のすべてのノードが読み取りまたは書き込みを行うことができます)。マークル木構造はトランザクションを格納し、改ざんが防止されるため、ブロックチェーンとしての役割を果たせそうに見えるでしょう。しかし、いくつか問題があります。Bill が自分のデジタル資産を Susan に送信するには、Bill は、デジタル資産の転送要求を処理するエージェントとして機能するサービスまたは Web サイトを信頼しなければなりません。また、ハッシュ構造を維持するサーバーも信頼する必要があります。新しいトランザクションを処理する中心的なノードや、処理を委任する中央機関がなければ、任意のノードが Bill の保留中のトランザクションを処理する可能性があります。高い処理能力を備えた悪意のあるノードや支配的なノードでは、無効なトランザクションや不正なトランザクションが生じる可能性があり、それが善良なノードに伝播する恐れがあります。これを解決するために、ネットワークでは Bill のトランザクションに対してランダムなノード割り当てを試みることもできるでしょう。しかし、それでは再び管理が集中化されることになり、乱数ジェネレーターで実際にランダム性が適用されていることを信頼する必要があります。この問題を解消するために、ブロックチェーンでは合意アルゴリズムが使用されています。これについては次で説明します。

トランザクション ハッシュ ツリーを格納したブロックで構成されているブロックチェーン (ブロックチェーンのブロックは前のブロックに後方リンクされ、Proof of Work アルゴリズムを使用して検証される)
図 9 トランザクション ハッシュ ツリーを格納したブロックで構成されているブロックチェーン (ブロックチェーンのブロックは前のブロックに後方リンクされ、Proof of Work アルゴリズムを使用して検証される)

合意アルゴリズム: ブロックチェーン テクノロジでは、ブロックの追加方法と管理方法を示すプロトコルに従うことによって、集中管理されたデータ ストアと信頼機関の問題を回避しています。それを実現するために、ブロックチェーンで構築される合意アルゴリズムが適用されます。合意アルゴリズムにはさまざまな種類がありますが、ここでは Proof of Work (PoW) アルゴリズムのしくみを説明します。

PoW のベースになっている考え方は、ネットワーク上のノードは、計算の難しい問題を解くために必要なコストを負担し、時間をかけることで、その名誉ある目的を証明する必要があるというものです。そのようなシステムに参加し、ルールに従って役割を果たすようノードを誘導するために、このネットワークではインセンティブが提供されます。多くの場合はお金です。つまり、ノードの管理者はブロックチェーンにブロックを追加すると報酬が支払われます。その報酬を得るには、ノードですべてのトランザクションを検証し (トランザクションがブロックチェーンの特定のルールに従っていることを確認するため)、次に暗号パズルを解かなければなりません。

中央機関なら、新しいトランザクションのバッチを処理するためにランダムにノードを割り当てることができると前述しました。そうしたアプローチでは集中管理された乱数ジェネレーターが必要になり、これには欠陥があったり、ハッキングや無効化されたりする恐れがあります。しかし、ノードに難しいパズルを与えて解くように促せば、望ましい効果が得られます。真っ先にそのパズルを解くノードを事前に特定しておくことはできません。これにより、ネットワーク上で一種のノードくじが実現します。中央機関は必要ありません。それがブロックチェーン テクノロジの重要な革新の 1 つです。ブロックチェーンは分散化されているため、「結託耐性」があるとも前に述べました。 PoW は時間を要し、計算能力の点でコストがかかるため、単独のノードやグループのノードがネットワーク上で結託することで、他のピア ノードのよりも優先的にブロックチェーンによるメリットを得ることは実質的に不可能です (あるノードのグループが計算能力の 51% を占めた場合に、結託を提案する「51% 攻撃」が行われるリスクはありますが、PoW 合意アルゴリズムを採用することで、そのような攻撃は実行不可能になります)。

トランザクションのブロックを構築するため、ノードはネットワーク上に保存された未処理トランザクションを取得し、マークル木を構築してマークル ルート ハッシュを計算します。そのため、ブロックの候補には、マークル ルート ハッシュ値、現在のタイムスタンプ、および PoW 難易度 (また、場合によっては追加のヘッダー データ) が含まれたブロック ヘッダーと共に、トランザクションのリストが格納されます。その後、PoW パズルを解く必要があります。その際には、256 ビット ブロック ハッシュ値全体のダブルハッシュを計算し、次に nonce と呼ばれる 32 ビットの数値を特定します。この数値は前者の値に連結でき、その結果の 288 ビットの数値についてハッシュを計算すると、先頭にゼロが複数並ぶ特定の数値が得られます。32 ビットの nonce は 0 ~ 232 (4,294,967,295) の範囲になるため、単純に nonce の推定を試みるのではなく、nonce 0 から開始し、SHA-256 ハッシュを生成して、先頭にゼロが複数並ぶ目標数値になっているかどうか (つまり、最終的なハッシュが目標数値を下回っているかどうか) を判断するのが一般的です。そうなっていない場合、ノードは nonce 値をインクリメントして再試行します。ノードがパズルを解かずにすべての nonce 値を試した場合は、ブロック ハッシュ値を再計算します。これにより異なるブロック ハッシュ値の生成が保証されます。ブロック ヘッダー内のタイムスタンプがブロック ハッシュ計算に含まれているためです。ノードはいつでも、新しいブロックに追加する未処理のトランザクションについて、別のバッチを選択できます (または、最終チェック後に出現していた可能性のある新しい未処理のトランザクションを追加できます)。これにより、マークル ルート ハッシュ値が変更され、その結果、タイムスタンプと共に、新たに計算されたブロック ハッシュ値が変更されます。ブロック ハッシュが再計算されるたびに、ノードでは 40 億以上の nonce すべてを反復処理します。

やがて、ネットワーク上のあるノードがその暗号パズルを解くことでしょう。そうなった場合、そのノードはノード自身のブロックチェーン コピー (すべてのノードはブロックチェーンのコピーを保持します) の末尾にその新しいブロックを追加してから、その新しいブロックをネットワーク上の他のすべてのノードに伝播することで、他のノードが各自のブロックチェーン コピーを更新できるようにします。ノードから新しいブロックが伝播されても、他のノードは新しいブロックが有効であると単純に信頼することはありません。それぞれのノードは各自でそのブロックを検証し、証明します。検証するために、ノードは単純に PoW パズルのソリューションを確認します。その確認では、nonce 値が連結されたブロックの SHA-256 ハッシュを計算し、その答えから、そのブロックの PoW 難易度値によって指定された先頭に複数の 0 が並ぶ数値のハッシュが生成されることを検証します。

ちなみに、一部のブロックチェーンでは、規定された間隔で新しいブロックがブロックチェーンに追加されるように、PoW 難易度値がプロトコルにより継続的に調整されています。このような継続的な調整が必要になる理由は、ネットワーク上では絶えずノードが現れては消えていることで、ノードの平均計算能力が常に変化しているためです。PoW には、ブロックチェーンにブロックを追加するためのインセンティブがあること思い出してください。そのため、賞金を得るために、ノードの管理者がハードウェアを強化することがよくあります。ビットコイン ブロックチェーンでは、1 ブロックあたり 10 秒の平均速度でブロックが継続的に追加されるように、2016 ブロックごとに難易度値が微調整されています。

分岐が発生することもあります。それは、大規模なネットワークでは新しいブロックの伝播に時間がかかるためです。伝播中に、別のノードによってその PoW パズルが解かれ、新しいブロックがそのブロックチェーン コピーに追加されて、ネットワーク上のブロックチェーンに伝播する可能性があります。受信する側のノードは必ず、有効なブロックをそれぞれのブロックチェーン コピーに追加します。各ブロックは暗号で前のブロックにつながれているため、2 つの異なるノードによって 2 つの新しいブロックが発行されると、ブロックチェーンの末尾にある同じブロックにリンクされた分岐が発生します。しかし、これは問題ありません。時間の経過と共に、ノードは、プロトコルによって「最長のチェーン」と見なされたブロックチェーンの末尾に新しいブロックを追加するようになります。 たとえば、分岐が発生した場合に、最新のブロック タイムスタンプがあるチェーンが最長のチェーンとして定義されるとしましょう。時間と共に、長さの点で 1 つの分岐が優勢となり、見捨てられた (短い) 分岐のブロックは削除されて、そのトランザクションは未処理トランザクションのプールへと戻されます。

まとめ

今回は、ノードによる分散ピアツーピア ネットワーク上で、暗号でリンクされたブロックから構成されるパブリック ブロックチェーンを構築する方法を紹介しました (その各ブロックには、暗号でリンクされたトランザクションから構成される固有のハッシュ チェーンが格納されます)。ブロックチェーン テクノロジの基礎を取り上げながら、単独の実装には重点を置かず、代わりにすべてのブロックチェーンで共有される一般的な技術的特徴に重点を置くようにしました。この題材についてもっと詳しく知りたい場合は、ビットコイン、イーサリアム、リップルなど、具体的なブロックチェーン テクノロジを選び、その特定の実装についての詳細を習得することをお勧めします。自分でブロックチェーンを使って実験するには、Azure でホストされるブロックチェーン サービスを https://azure.microsoft.com/ja-jp/solutions/blockchain/ で参照してください。


Jonathan Waldman は、マイクロソフト テクノロジにその誕生以来から携わっており、ソフトウェア人間工学を専門とする、マイクロソフト認定プロフェッショナルです。彼は Pluralsight 技術チームのメンバーで、現在は団体や民間企業のソフトウェア開発プロジェクトをリードしています。連絡先は、jonathan.waldman@live.com (英語のみ) です。

 この記事のレビューに協力してくれたマイクロソフト技術スタッフの James McCaffrey に心より感謝いたします。


この記事について MSDN マガジン フォーラムで議論する