見出し画像

インターネット・コンピュータの技術的概要(和訳)2020/9/18

ブロックチェーンネットワークのインフラと、キャニスタースマートコントラクトによってWebサービスを自在に拡張する仕組みについて解説します。

世界初のウェブスピード、インターネット規模のパブリックブロックチェーンである「インターネットコンピュータ」の本格始動前の最後のマイルストーンが間近に迫っています。DFINITY財団は、9月30日に開催するSodiumのリリースに向けた仮想イベントで、インターネットコンピュータを制御するオープンアルゴリズムのガバナンスシステム「Network Nervous System」を公開する。また、このイベントでは、高度な暗号技術、コンセンサスプロトコル、トークン経済に関する詳細な技術資料が紹介される予定です。

この記念すべき日に先立ち、私たちは、ネットワークがどのように機能しているのかについて、非常に高いレベルの概要を提供したいと思います。

関連リンク:


Twitter:https://mobile.twitter.com/c3f_iu
まとめサイト:https://dfinity-c3f.softr.app/
イベント:https://c3f.connpass.com/event/


ネットワーク神経系(NNS:Network Nervous System)

インターネットコンピュータは、インターネットコンピュータプロトコル(ICP)と呼ばれるブロックチェーンコンピュータプロトコルをベースにしています。ネットワーク自体は、ビルディングブロックの階層構造で構築されています。最下部には、専用のハードウェアノードをホストする独立したデータセンターがあります。これらのノード・マシンを組み合わせて、サブネットを構築します。サブネットは、ユーザーによってアップロードされ、コードとステートの両方を含む相互運用可能なコンピュートユニットであるキャニスター・スマートコントラクトをホストしています。

ネットワーク構成要素の階層構造

ICPの特徴の一つは、ネットワークの制御、設定、管理を行うNNS(Network Nervous System)という要素です。

データセンターは、NNSに申請することでネットワークに参加し、NNSはデータセンターの導入を担当します。NNS自体はオープンなガバナンスですが、ネットワークへの参加許可はNNSが統括しています。いわば、インターネットにおけるICANNのような役割を担っており、BGPルータを走らせるための自治体番号の割り当てなどを行っています。NNSは、ノードマシンを監視して、インターネット・コンピュータ・ネットワークの統計的な偏差を調べ、性能不足や不具合を示す可能性があるなど、ネットワーク管理の幅広い役割を担っています。

また、NNSはネットワークのトークンエコノミクスにおいても重要な役割を担っています。NNSは新しいICPトークン(以前はDFNトークンとして知られていた)を生成して、NNS内で投票を行っているデータセンターやニューロンによって運営されているノードに報酬を与え、それによって提出された提案を決定しています。NNSがデータセンターやニューロンに報酬を与えるために新しいICPトークンを作成すると、インフレになるのです。

トークンエコノミクス

最終的には、データセンターのオーナーとニューロンのオーナーは、トークンを手に入れ、キャニスターのオーナーやマネージャーと交換することができます。キャニスターのオーナーやマネージャーは、このトークンを受け取ってサイクルに変換し、そのサイクルを使ってキャニスターを充電します。キャニスターが計算を行ったり、メモリを保存したりすると、サイクルが消費され、最終的にはさらにサイクルをチャージして稼働させなければなりません。これがデフレです。

サブネット

インターネット・コンピュータを理解するためには、ネットワーク全体の基本的な構成要素であるサブネットの概念を理解する必要があります。サブネットは、インターネット・コンピュータのネットワークでホストされているソフトウェア・キャニスターの明確なサブセットをホストする責任を負っています。サブネットは、NNSが制御する方法で、異なるデータセンターから引き出されたノードマシンをまとめることで作成されます。これらのノードマシンは、それらがホストするソフトウェアキャニスタに関連するデータと計算を対称的に複製するために、ICPを介して協働する。

サブネットはキャニスターのサブセットをホストする
サブネットは、データセンターから集められたレプリカノードで構成され、ホストされたキャニスターに関連するデータと計算を共同で複製します。

NNSは、サブネットを構築する際に、独立したデータセンターのノードを結合します。これにより、DFINITYが開発したビザンチンフォールトトレラント技術と暗号技術を用いたICPプロトコル演算で、サブネットの改ざん防止と停止を実現しています。サブネットはインターネット・コンピュータネットワーク全体の基本的な構成要素ですが、ユーザーやソフトウェアからは透過的です。ユーザーやキャニスターソフトは、キャニスターのIDを知るだけで、キャニスターが共有する機能を呼び出すことができます

この透明性は、インターネットの基本的な設計原理の延長線上にあるものです。インターネット上では、ユーザーがあるソフトウェアに接続したい場合、そのソフトウェアを実行しているマシンのIPアドレスと、そのソフトウェアがリッスンしているTCPポートを知るだけで良いのです。インターネット上のコンピュータでは、ユーザーがある関数を呼び出したい場合、キャニスターのIDと関数のシグネチャを知るだけでよいのです。インターネットがシームレスな接続性を生み出すのと同じように、DFINITYはソフトウェアのためのシームレスな世界を作り出し、許可を得たソフトウェアは、ネットワークの根本的な仕組みについて何も知らなくても、他のソフトウェアを直接呼び出すことができるのです。

インターネットコンピュータは、他の方法でもサブネットの透明性を確保することができます。NNSは、例えば、ネットワーク全体の負荷バランスをとるために、サブネットを分割・統合することができます。これは、ホストされたキャニスターにも透過的です。

NNSは、キャニスターを中断することなく負荷を分散させるために、サブネットを分割/マージすることができる

この例では、11のキャニスターをホストするABCという架空のサブネットがあります。NNSはそれを分割するように指示します。サブネットABCはキャニスター1-6を継続し、新しいサブネット、サブネットXYZが生まれ、キャニスター7-11を継続します。関係するどのキャニスターもサービスの中断を経験することはありません。

キャニスターをインターネットコンピュータにアップロードする場合、特定のサブネットの種類をターゲットにする必要があります。実はNNSをホストする特別なサブネットがあるのですが、そこにキャニスターをアップロードすることはできません。代わりに、"data"、"system"、"fiduciary "などのサブネット・タイプをターゲットにしなければならない

各サブネット・タイプによって、キャニスタに特定のプロパティと機能が与えられます。たとえば、キャニスタがデータ・サブネットでホストされている場合、呼び出しを処理することはできますが、他のキャニスタに呼び出しを行うことはできません。そのためには、システム・サブネットが必要です。もし、あなたのキャニスターがICPトークンの残高を保持したり、他のキャニスターにサイクルを送信したりできるようにしたい場合は、受託者(Fiduciaty)サブネットが必要です。このような理由から、ガバナンスキャニスターは受託者サブネットでのみホストすることができます

サブネットの種類によって、フォールトトレランスのレベルが異なる

サブネットの性能は、その根底にあるフォールトトレランス(耐障害性)に由来するところがあります。NNSが壊れたサブネットを修復するための新しい暗号技術など、基礎となる科学は非常にエキサイティングな分野であり、近いうちに一般公開したいと考えています。

キャニスター

サブネットの目的は、キャニスターをホストすることです。キャニスターは専用のハイパーバイザー内で動作し、一般に指定されたAPIを介して相互に作用しますキャニスターの内部には、WebAssemblyの仮想マシンとその中で実行されるメモリのページ上で実行できるWebAssemblyバイトコードがあります。通常、WebAssemblyバイトコードは、RustMotokoのようなプログラミング言語をコンパイルすることによって作成されます。そのバイトコードには、開発者がAPIと簡単にやりとりできるランタイムが組み込まれています。

インターネットコンピュータでは、キャニスターが共有する機能は、2つの方法のいずれかで呼び出す必要があります。それらは、アップデートコールまたはクエリコールとして呼び出すことができます。本質的な違いは、関数をアップデートコールで呼び出した場合、その関数がキャニスターのメモリ内のデータに加えた変更はすべて持続されるのに対し、関数をクエリコールで呼び出した場合、メモリに加えた変更は実行後に破棄される点である。

アップデートコールは持続的な変更を行い、ICPブロックチェーンのコンピュータ・プロトコルがサブネット内のすべてのノードで実行されるため、改ざんも防止される。予想されるように、呼び出しは一貫したグローバルな順序で実行され、完全に決定論的な実行環境内で同時実行を可能にするメカニズムを使用しています。アップデートコールはわずか2秒で完了します。

アップデートコールは永続的な変更を行い、改ざんを防止する

この例では、ユーザがキャニスター内でホストされている金融取引所に買い注文を出すとします。

一方、クエリコールは、変更を持続させません。メモリに加えた変更は、実行後にすべて破棄される。クエリコールは非常に高性能かつ安価で、わずか数ミリ秒で完了する。これは、サブネット内のすべてのノードで実行されないためで、セキュリティレベルが低いということでもある

クエリコールはメモリの変更を破棄するが、性能は高く安価である

この例では、ユーザはカスタムニューズフィードを要求しており、ほとんど即座に生成されたばかりのコンテンツが返ってくる。

直交型パーシステンス
Internet Computerで最も興味深いことの1つは、開発者がデータを永続化する方法である。開発者は永続性について考える必要がなく、コードを書くだけで自動的に永続化が行われる。これは直交型パーシステンスと呼ばれています。インターネットコンピュータは、コードが実行されるメモリページを永続化するからです。

これがどのように機能するのか、不思議に思われるかもしれません。メモリページを変更できるアップデートコールに関して、キャニスターはソフトウェアアクターです。つまり、キャニスターの内部には、常に1つのスレッドしか実行できません

アップデートコールはデフォルトでインターリーブされる

キャニスタの内部では実行スレッドは 1 つしかありませんが、デフォルトではキャニスタ間の更新呼び出しをインターリーブすることができます。これは、アップデートコールがキャニスタをまたがる更新呼び出しを行い、それがブロックされると、実行のスレッドが新しい更新呼び出しに移動できるようになる場合に発生します。

クエリコールの同時実行

これに対して、クエリコールは、メモリに永続的な変更を加えることはありません。このため、キャニスター内部でクエリコールを処理するスレッドを、任意の数だけ同時に存在させることができます。これらのクエリコールは、最後に確定されたステートルートに記録されたメモリーのスナップショットに対して実行されます

最後に、キャニスターは新しいキャニスターを作成することができ、キャニスターは自分自身をフォークすることができることを述べなければ、キャニスターの議論は終わりません。WebAssembly バイトコードを指定するだけで、新しいキャニスターを作成でき、メモリページは空からスタートします。キャニスターが自分自身をフォークすると、新しく生成されたコピーが作成され、内部のメモリページまで同一になります。スケーラブルなインターネットサービスを実現する上で、フォークは非常に有効な手段です。

スケーラビリティ

次に、スケーラブルなインターネット・サービスについて、大まかな説明をします。キャニスターには、さまざまな種類の容量に上限があります。例えば、キャニスターはWebAssemblyの実装の制限により、4GBのメモリページしか保存できません。このため、数十億のユーザーにスケールアウトするインターネットサービスを作ろうとすると、マルチキャニスターアーキテクチャを使わざるを得ません

数十億のユーザーに向けたインターネットサービスのスケーリングアウト

何か特別なキャニスターを作り、そのコピーをたくさん作り、ユーザーコンテンツを異なるキャニスターにシャーディングして、スケールアウトできるインターネット・サービスを作れば十分だと思うかもしれません。しかし残念ながら、このアーキテクチャは多くの理由から単純すぎるのです。

確かに、キャニスターを追加するごとに全体のメモリ容量が増加します。また、キャニスターを追加するごとに、更新とクエリコールのスループットが全体的に向上するのも事実です。しかし、特定のユーザーのコンテンツに対するクエリコール要求をスケーリングすることはできません。また、キャニスターシャードを追加してシステムの容量を増やすたびに、ユーザーコンテンツのバランスを調整する必要があり、エッジアーキテクチャとしてはあまり優れているとは言えません。また、エンドユーザーの近くにあるレプリカからクエリコールを提供する方法も、明らかではありません。フロントエンドのキャニスターとバックエンドのキャニスターの両方が必要になりそうです。

ICは、1つのドメイン名を複数のフロントエンドキャニスターにマッピングすることができる

インターネットコンピュータは、エンドユーザーをフロントエンドキャニスターに接続するために、いくつかの興味深い機能を提供しています。その1つは、NNSを介してドメイン名を複数のフロントエンドキャニスターにマッピングすることを可能にする。エンドユーザーがそのようなドメイン名を解決したい場合、インターネットコンピュータは、フロントエンドキャニスターをホストするすべてのサブネットのレプリカノードの合計を調べ、最も近くにあるレプリカノードのIPアドレスを返す。この結果、エンドユーザーは近くのレプリカでクエリコールを実行し、固有のネットワーク遅延を低減してユーザー体験を向上させ、コンテンツ配信ネットワークを介さないエッジコンピューティングの利点を提供します。

この機能を最大限に活用するためには、フロントエンドのキャニスターとバックエンドのデータバケットキャニスターを含む古典的なアーキテクチャが必要です。この例では、ウェブブラウザがプロフィール画像をロードすることを希望しています。

まず、Webブラウザは、近傍のノードとサブネットワーク上で動作しているフロントエンドキャニスターにマッピングされます。次に、ウェブブラウザは、その近くのノードに写真を取得するためのクエリコールリクエストを送信します。

次に、フロントエンドキャニスタは、写真を保持するデータバケットキャニスタに対して、キャニスタ横断クエリコール要求を行います。

データバケットキャニスターが返すクエリコール応答が、写真などの静的コンテンツを含む場合、そのデータをキャッシュに格納することができる。そのような場合、フロントエンドキャニスターのクエリコールを実行しているレプリカノードは、クエリコールレスポンスをそのクエリキャッシュに入力することができます。

もちろん、クエリコール・キャッシング・メカニズムは、フロントエンド・キャニスタのコードに対して完全に透過的です。ユーザが呼び出したフロントエンドキャニスタが必要な情報をすべて収集すると、クエリコール応答またはHTTPエンドポイントを通じて、コンテンツを返すことができます。

時間の経過とともに、ノードのクエリキャッシュは静的コンテンツを蓄積し、近くのユーザーが興味を持つようなデータを生成し、より速く、より良いユーザーエクスペリエンスをユーザーに提供します。このように、インターネットコンピュータのネイティブエッジアーキテクチャは、コンテンツ配信ネットワークの利点を提供しますが、開発者が特別なことをする必要はなく、また、別のプロプライエタリサービスの助けを得る必要もありません。

更新の呼び出しについては、古典的なアーキテクチャは異なるアプローチを取ります。更新が失われるといった問題を防ぐために、ユーザのコンテンツやデータの更新をシリアライズすることが必要です。一般的に、これはユーザーを特定のフロントエンドキャニスターにマッピングすることで、例えばユーザー名をハッシュ化することで実現されます

Webブラウザやスマートフォンで動作するUX/UIは、コンテンツやデータの変更を調整する責任があるフロントエンドキャニスターを決定すると、その標準インターフェースにアップデートコールを送信してコンテンツやデータを変更することができます。

このフロントエンドキャニスターは、通常、必要な変更を行うために、さらにキャニスター間のアップデートコールを行います。

オープンなインターネット・サービス

最後に、フロントエンドキャニスタとバックエンドデータバケットキャニスタの2レベルアーキテクチャを用いた、オープンなインターネットサービスの設計について説明します。まず、フロントエンドキャニスタのコードを書くときは、BigMapという既存のライブラリクラスを使って簡単に書くことができます

"オープンなインターネットサービス "をデザインする

BigMapは数エクサバイトのデータを保存することができ、たった1行のコードでオブジェクトを書き込むことができるのです。このアーキテクチャは、フロントエンドキャニスターとデータバケットキャニスターをフォークさせて、あるキャニスターに割り当てられたオブジェクトの責任を2つのキャニスター間で分割することで、透過的かつ動的にスケールアウトすることができます。

最後に、真のオープン・インターネット・サービスを実現するために、すべてのキャニスターの責任をオープントークン化されたガバナンスキャニスターに割り当てることになります。あなたが起業家であれば、初期にこれらのガバナンストークンの一部を販売することで、開発資金を調達することになるでしょう。そして、あなたはおそらく、あなたのインターネットサービスの初期参加者にガバナンストークンを与えることでインセンティブを与え、より良いネットワーク効果を得るためのスキームを設計するでしょう - そして、勝利を得るのです。


私たちDFINITYは、この新しいパブリックブロックチェーンが、インターネットをその自由でオープンなルーツに戻しながら、ウェブの創造的能力を強化することに、とてつもなく興奮しています。Sodiumのローンチイベントに参加して、インターネットコンピュータの背後にある技術の詳細を学び、DFINITY Canister SDKをダウンロードしてコードを書き始めましょう。

Start building at sdk.dfinity.org and join the developer community at forum.dfinity.org.


この記事が気に入ったらサポートをしてみませんか?