チェーンキー暗号: Internet Computer を支える科学的ブレークスルー (日本語訳)

tokuryoo
DfinityJP
Published in
16 min readDec 30, 2021

Medium の DFINITY 公式の記事 Chain Key Cryptography: The Scientific Breakthrough Behind the Internet Computer (2021/5/18) の日本語訳です。

チェーンキー暗号は、Internet Computer を構成するノードを統合する暗号プロトコルの集まりです。

By Jan Camenisch, VP of Research & Crypto | DFINITY

Internet Computer は、世界初のウェブスピード、インターネット規模のパブリックブロックチェーンで、スマートコントラクトによりインタラクティブなウェブコンテンツをエンドユーザーのブラウザに直接安全に提供することを可能にします。これにより、開発者、組織、起業家は、安全で自律的なソフトウェアプログラムを公共のインターネット上に直接構築し、デプロイすることができます。DFINITY Foundation の長年にわたる献身的な研究開発により、この野心的なビジョンが実現しました。新しい暗号技術とコンピュータサイエンスを組み合わせることで、無限のストレージと無限の計算をオンチェーンで提供するブロックチェーンが誕生したのです。

世界トップクラスの暗号技術者、研究者、エンジニアの多くからなる熟練したチームが、分散化を可能にし、困難な技術的課題を解決するためにこの取り組みの先頭に立ちました。私たちは協力して、先進的なコンセプトを現実の世界に持ち込み、コンピューティングの世界全体に多大な影響を与える最先端技術を実装してきました。

Internet Computer は、最終的に数百万ノードの規模での運用が可能になります。チェーンキー暗号は、これを可能にする基本的なブレークスルーの1つです。チェーンキー暗号は、Internet Computer を構成するノードを統合する一連の暗号プロトコルから構成されています。チェーンキー暗号の最も顕著なイノベーションは、Internet Computer が単一の公開鍵を持つことです。これにより、スマートウォッチや携帯電話を含むあらゆるデバイスが、Internet Computer からの人工物の信頼性を検証できるようになるため、大きな利点となります。一方、イーサリアムのような従来のブロックチェーンでは、わずかな人工物の検証のために膨大なデータを必要とするため、このようなことは不可能です。

単一の公開鍵は、氷山の一角に過ぎません。チェーンキー暗号は、Internet Computer を動かし、その運用を可能にするエンジンです。下記を可能にします。

  • 新しいノードを追加して新しいサブネットを形成し、ネットワークを無限に拡張することができます。
  • 故障やクラッシュしたノードを停止することなく新しいノードに置き換えます。
  • サブネット内の多数のノードで障害が発生しても、サブネットを復活します。
  • Internet Computer プロトコルをシームレスにアップグレードし、ネットワークのバグ修正と新機能の追加を可能にします。

Internet Computer

チェーンキー暗号を理解するために、まず Internet Computer を詳しく見てみましょう。Internet Computer は、世界中にある多数のノードで構成され、Internet Computer プロトコル(ICP)が動作しています。このプロトコルは、これらすべてのノードを接続し、これらのノード上でキャニスタースマートコントラクトの実行を統合します。ソフトウェアキャニスターは、コードとステートの両方を含んだバンドルしたものであり、開発者により Internet Computer へデプロイされます。アプリケーションは単一のキャニスターで構成されることもあれば、キャニスターのサイズに制限があるため、互いに作用し合う多数のキャニスターで構成されることもあります。キャニスターは、Webページ、エンタープライズシステム、DeFi ユースケース、さらにはオープンなインターネットサービスなど、あらゆるものを実装することができます。

ユーザーが Internet Computer 上にデプロイしたアプリと対話すると、ICPを介してキャニスターへメッセージが送信されます。次に、Internet Computer は、そのメッセージの入力に対してキャニスターを実行し、最終的にユーザからの問い合わせに返すことができる出力メッセージを計算します。メッセージの実行により、キャニスターのステートはそのコードの命令に従って更新されます。

Internet Computer で計算された結果の堅牢性と正確さを実現するために、各キャニスターは単一のノードではなく、複数のノードで実行されます。これは、1つのノードでは単一障害点になってしまうからです。ハードウェアの故障でクラッシュしたり、インターネットから遮断されたり、最悪の場合、意図的に不正確な結果を報告したりする可能性があるからです。そこで、Internet Computer プロトコルは、キャニスターが複数のノードで実行され、これらのノードがどのメッセージをどの順番で処理するか、また、各計算結果の値について合意することを保証します。これにより、結果の正しさが保証され、ネットワークはあらゆる種類の障害に対して堅牢になり、キャニスターは永遠に稼働し続けることができるのです。

チェーンキー暗号

Internet Computer の利用者に送信された結果の正しさを保証するために、利用者が受信したメッセージが、他の場所からではなく、本当に Internet Computer から発信されていることを検証できることがさらに必要です。単一のノードでは信頼できないので、メッセージは、ユーザーが結果を問い合わせたキャニスターをホストするすべてのノードによって、共同で署名される必要があります。そこで登場するのがチェーンキー暗号です。すべてのノードは、リクエストの結果を含んでいるメッセージに共同で署名することを可能にする秘密鍵シェアを受け取ります。こうして作成された署名は、Internet Computer の公開鍵のみを使用して検証することができます。Internet Computer が数百万のノードと数千のサブネットという規模で構成されていても、ネットワークが必要とするのは、サブネットからの結果を検証するための単一の公開鍵だけであるという点が優れています。

Internet Computer をスケールさせるには、すべてのノードですべてのキャニスターを実行できません。そのため、ノードはいわゆるサブネットと呼ばれるものに分割され、様々なキャニスターはこれらのサブネットに分散されます。より正確には、Internet Computer にキャニスターをアップロードすると、キャニスターがインストールされるサブネットが割り当てられ、そのサブネットに参加するノードでのみ実行されるようになります。メッセージを認証するために、各サブネットは各サブネット自身の公開鍵を持っています。サブネットのすべてのノードは、そのサブネットの公開鍵に対応する秘密鍵のシェアを持っています。いわゆる閾値署名方式を使用すると、十分な数のノード(必要な閾値以上)が合意すれば、それぞれの鍵シェアを使用してメッセージに共同で署名することができます。メッセージの署名は、サブネットの公開鍵を持つユーザーによって検証できます。すべてのサブネット公開鍵は順番に、Internet Computer の単一の公開鍵で署名されます(これがどのように行われるかは後述します)。

つまり、チェーンキー暗号は、48バイトの公開鍵1つ、つまり Internet Computer の公開鍵を知っていれば、レスポンスの検証や Internet Computer の計算が十分に可能なのです。これとは対照的に、イーサリアム上のスマートコントラクトの結果を検証するために、オープンなイーサリアムクライアントは400ギガバイトをダウンロードする必要があります。さらに悪いことに、必要なダウンロードサイズは時間とともに直線的にしか増加しません。必要な容量は、1年前は200ギガバイト程度でしたが、1年で2倍になっています。

無限のスケールアウト

Internet Computer が数千のサブネットを持つ規模になると、各サブネットに対応する数千の個別公開鍵も持つことになります。これらの公開鍵と対応する秘密鍵シェアは、ノードが追加されたり、容量を増やすために新しいサブネットを形成されたり、様々な理由でノードが故障して交換されたり、通信を遮断する攻撃者だったり、それを操作しようとしたりノードを危険にさらしたり、任意の方法でプロトコルから逸脱させたりする といった環境下で、安全に生成、管理、維持されなければなりません。

ノードが共同でメッセージの署名を生成するには、標準的な閾値署名アルゴリズムで十分です。すべての鍵の生成と維持のために、DFINITYチームは新しい暗号技術を発明したので、高いレベルで説明していきます。組み立てた手順は大きく分けて2つあります。(1) 新しいサブネットの形成とそのための鍵の材料の生成は、Internet Computer の Network Nervous System(NNS)が行い、これはgenesisで作成された最初のサブネット上で動作するキャニスターによって実装されます。(2) 新しいサブネットを形成するノードがNNSから鍵の材料を受け取って新しいサブネットを運用開始すると、サブネットは Internet Computer プロトコル に従って自ら鍵を管理・維持するようになります。

この2つの手続きは、閾値署名、公開鍵暗号、非対話ゼロ知識証明 を含む、多くの暗号プリミティブから構成されています。まず、Internet Computer が新しいサブネットの鍵を生成する方法を説明しましょう。より正確には、NNSサブネットが新しいサブネットの公開鍵と、新しいサブネットを実行するように指定されたノードに対応する鍵シェア を生成する方法を説明します。閾値署名スキームにおける通常の鍵生成アルゴリズムは、単一の信頼できるディーラーを想定しています。しかし、Internet Computer では、悪意のあるノードを許容する必要があるため、この仮定は保証されません。ICPが実装するソリューションは、1)複数のディーラーを使用する、2)指定された複数のノードのために正しいシェアを暗号化したことを証明する、3)彼らが生成した鍵を 単一の公開鍵およびそれに対応する秘密鍵シェア へ結合する、というものです。

チェーンキー暗号は、一人のディーラーが誠実である限り、安全な鍵の材料を生成することができます。この基準は、NNSサブネットの3分の1以上のノードがディーラーとして機能する場合に満たされます。彼らはそれぞれ公開鍵を生成し、新しいノードが Internet Computer に登録する際に利用可能にした暗号鍵で秘密鍵シェアを暗号化し、さらに彼らがこのすべてを正しく行ったという、我々のオーダーメイドで設計した非対話ゼロ知識証明を加えます。NNSサブネットは全体としてこれらの証明を検証し、それらが正しければ、すべてのディーラーが提供した情報を新しいサブネットのノードが利用できるようにします。これらの新しいノードは、それぞれの鍵シェアを復号化し、異なる複数のディーラーからのシェアを1つのシェアに結合します。(これは、鍵空間に存在する準同型(homomorphism)と呼ばれる数学的特性により可能です)。いったんノードがこれを行うことで、新しいサブネットを運用する準備が整います。

サブネットを運用する際、そのノードは秘密鍵シェアをメンテナンスする必要があります。これは、ノードが故障して交換する必要がある場合 または ノードが攻撃者によって侵害されることで、それぞれの秘密鍵シェアが漏れる可能性があるため、必要です。どちらの場合も、秘密鍵シェアは交換されなければなりません。この目標に向けて、残りのノードは秘密鍵シェアを再共有することができます。このように、各ノードは他の多くのノードからオリジナルの秘密鍵シェアの共有を受けることになります。秘密シェアの数学的特性により、これらの ”シェアの共有” は秘密鍵の通常の共有に組み換えることができます。このように生成された新しいシェアは、秘密鍵の新たな共有に相当します。したがって、鍵の生成と同様に、各ノードは秘密鍵シェアの共有を得るオリジナルの秘密鍵の共有を行い、サブネットを実行するために指定されたノード(おそらく異なる)の集まりのためにこれらのシェアを暗号化し、正しく行われる非対話ゼロ知識証明書を追加することになります。こうして新しいノードの集まりは、このようなシェアをいくつも受け取り、証明が検証されれば、シェアを復号して1つの鍵シェアに結合します。このプロセスの後、新しいノードの集まりは、古いシェアがあればそれを削除し、その後、サブネットの運用を継続することができます。この再共有化処理により、1)新しいノードが必要な秘密鍵シェアを入手すること、2)攻撃者の手に渡ったシェアは陳腐化し、価値が無くなることが保証されます。

サブネットの操作には鍵とキャニスターのステートが必要

先ほど説明したように、チェーンキー暗号はNNSのサブネットを無限にスケールアウトさせることができます。どのノードをどのサブネットに割り当てるかを決め、初期の秘密鍵シェアと合わせて全サブネットの公開鍵を生成し、証明します。そのため、実際にユーザーが必要とするのは、NNSサブネットの公開鍵だけであり、サブネットから得られるレスポンスの証明書を検証することができるのです。

ネットワークが進化するために非常に重要なチェーンキー暗号のさらなる側面について説明しましょう。まず、秘密鍵シェアとは別に、実行中のサブネットに参加する新しいノードは、そのサブネットに割り当てられたすべてのキャニスターの現在のステータスも必要とすることに注目してください。これは、ノードがキャニスターへのメッセージを処理してステータスを更新し、サブネットに完全に参加できるようにするために必要です。参加ノードは、すでにサブネットを運用しているそのピアノードにステータスをリクエストできます(ステート同期プロトコルを介して)。ただし、ノードが故障している可能性もあるため、参加ノードはピアノードから受信したステータスの信憑性と正確性を検証できなければなりません。このため、他のノードはすべてのキャニスターのステータス(のルートハッシュ)に閾値署名します。

残念ながら、非対話的な鍵の再共有とステートの認証は高価な操作であるため、すべてのブロックに対して行うことはできず、一定の間隔、例えば200ブロックごとにしか行うしかありません。そのため、サブネットでは、ノードがサブネットに参加するのに必要なすべての情報を束ねた、いわゆるキャッチアップパッケージを定期的に作成しています。キャッチアップパッケージは、その名の通り、新しいノードをサブネットに参加させるだけでなく、既存のノードがネットワークから切り離された場合などにも、動作を再開させることができます。

キャッチアップパッケージの威力

キャッチアップパッケージは、基本的にサブネットの実行において明確に定義されたステートを提供するので、最終的にはより多くのことを可能にします。したがって、サブネットがキャッチアップパッケージを生成したときはいつでも、以前の状態をすべて削除することができるので、Internet Computer は、すべてのステートが永遠に維持される典型的なブロックチェーンよりもはるかにストレージ効率がよくなっています。

2つ目の特徴として、キャッチアップパッケージにより、Internet Computer は、ノードの大半がクラッシュした場合でもサブネットを復活させることができます。1つのノードが生き残っている限り、キャッチアップパッケージで復旧し、新しい鍵の集まりを生成し、新しいサブネットでキャッチアップパッケージのステートからキャニスターの実行を継続することができます。

第三に、キャッチアップパッケージは、Internet Computer の負荷分散を可能にします。あるサブネットにインストールされたキャニスターが非常に人気があり、単一のサブネットが提供できる以上のリソースを必要とすると仮定すると、Internet Computer はノードに対して、サブネットを2つのサブネットに分割し、それぞれが同じキャッチアップパッケージから継続しつつ、半分のキャニスターのみを維持するように指示することができます。

最後に、キャッチアップパッケージは、Internet Computer プロトコル 自体をアップグレードすることも可能です。ここでのアイデアは、次のキャッチアップパッケージが生成された後に、サブネットのノードに異なるバージョンのプロトコルを実行するように指示するものです。これにより、プロトコルのバグを修正したり、新しい機能を追加したりすることが可能になります。Internet Computer が永遠に稼働し続けるために、おそらく最も重要な機能です。

_____

Intenet Computer を支える技術の詳細については、今後のリリースにご期待ください。

sdk.dfinity.orgでビルドを開始し、forum.dfinity.orgで開発者コミュニティに参加しましょう。

--

--