この3部構成のシリーズでは、インターネットコンピュータプロトコル(ICP)上で動作するアプリケーションのデータ処理を大幅に改善する技術的成果を明らかにします。
このアップグレードは、ICPロードマップの中のStellaratorマイルストーンであり、現在全ネットワークに展開されています。Stellaratorは、チェーン上のデータ永続性におけるブレークスルーであり、データストレージのスケーラビリティと処理能力を大幅に向上させ、以前はシステム制約に悩まされていた複雑なデータリッチアプリケーションに新たな機会をもたらします。
この進展により、開発者は大規模なデータ処理を必要とする複雑なアプリケーションを構築でき、ブロックチェーン技術に新しい実用レベルをもたらします。
このシリーズの第2部では、Luc BläserがMotokoの強化された正交的永続性について紹介します。データ永続性に関する第1部を見逃した場合は、こちらをご覧ください。
シンプル、安全、迅速:Motokoの強化された正交的永続性
Motokoは、プログラマが安定したメモリを扱う負担を軽減するために、シンプルで安全かつ迅速なアップグレードメカニズムを提供するユニークな機能である強化された正交的永続性を導入しました。
Motokoは、アップグレードプロセス中にプログラムの状態を自動的に保持することができ、永続性を処理するために追加のコードは必要ありません。しかし、残念ながら、この機能の以前の実装は大規模または深くネストされたデータにスケールできませんでした。
この機能は、安全性、パフォーマンス、スケーラビリティの面で大幅に強化されており、重要な革新は、主メモリを消去するのではなく単に保持することで状態の移行を回避することです。
ランタイムシステムは、メモリサイズに関係なく、アップグレード時のデータの一貫性を非常に効率的に確保します。最終的に、32ビットから64ビットの主メモリに切り替え、最終的には大量の永続データに拡張します。
背景
コンテナのアップグレードはインターネットコンピュータ上の課題であり、通常はかなりの複雑性、オーバーヘッド、およびデータ損失のリスクを伴います。コンテナの主メモリ(WebAssemblyメモリとも呼ばれます)はトランザクション間で永続的ですが、過去にはアップグレード時に消去されていました。これは相当人工的なステップであり、メモリはすでにインターネットコンピュータ上にファイルバックアップがあります。
このような動作が発生する理由は、主流のプログラミング言語の実装が設計時に永続性を考慮していないためです。これらの言語は、再コンパイルまたは実行時にメモリ構造を制御できない方法で再配置し、以前のバージョンのメモリを使用して修正されたプログラムを実行することはできません。
したがって、プログラマはアップグレードプロセス中にデータを保存するために安定したメモリAPIまたは特別な安定データ構造を明示的に使用する必要があります。これは、揮発性の主メモリと永続的な補助ストレージを提供する従来のコンピュータアーキテクチャに似ていますが、その代償はソフトウェア開発の複雑性の増加です(オブジェクトデータベースマッパーなどを考えてみてください)。
違うのは、Motokoではコンパイラとランタイムシステムを完全に制御できるため、メモリレイアウトも完全に制御でき、Motoko内で正交的永続性をサポートし、アップグレード後も使用し続けることができます。
したがって、Motokoプログラマは、明示的な安定メモリ、専用の安定データ構造、または他のデータベースのような抽象を使用することなく、標準の言語概念内で任意のデータ構造(一階型)を便利に開発することができ、ランタイムシステムは必要なオブジェクトを自動的に保持します。
以前、Motokoランタイムシステムは、永続オブジェクトグラフを安定したメモリにシリアル化およびデシリアル化することで正交的永続性を実現していました。これにより、シリアル化/デシリアル化プロセスが非常に高価であり、指令制限を超える可能性があるため、アップグレードが阻害されるという深刻なスケーラビリティとパフォーマンスの問題を引き起こしました。これらの欠陥により、大規模なアプリケーションには実用的ではないため、Motokoにおける正交的永続性サポートの再設計の理由となりました。
インターネットコンピュータとMotokoランタイムシステムの変更により、高価なシリアル化およびデシリアル化を行うことなく、スケーラブルなアップグレードを実現しました。代わりに、アップグレードプロセス中に主メモリの永続性を保持し、正交的永続性のアドレス空間を64ビットに拡張し、将来的には64ビットの安定したメモリが提供するのと同じ容量に拡張します。
強化された正交的永続性
私たちの目標は、インターネットコンピュータ上のソフトウェア開発を簡素化し、プログラマが安定したメモリを扱う負担を軽減することです。そのため、Motokoはインターネットコンピュータ上の永続性を最適化し、シンプルで安全、かつ迅速なアップグレードを実現しました:
シンプル:正交的永続性(Motokoにおける安定した変数)を通じて、任意の一階型の可伝達到達構造は、アップグレードプロセス中に自動的に永続化され、安定したメモリや安定したデータ構造は必要ありません。
安全:ランタイムシステムはアップグレード時に型の互換性を厳格にチェックし、暗黙のマイグレーションを通じてさまざまなデータの変更をサポートします。より複雑なマイグレーションはカスタムコードによって実現でき、メモリレベルでのデータ損傷や誤解を防ぎます。
速い:アップグレードが超高速になりました。主メモリはアップグレード時に保持され、安定したメモリにコピーする必要がなく、主メモリは64ビットに拡張されており、将来的には安定したメモリと同じサイズに拡張可能です。
設計概要
強化された正交的永続性の前提条件として、インターネットコンピュータプロトコルは、アップグレードを通じて主メモリを保持し、WebAssembly Memory64提案に基づく64ビットの主メモリをサポートするように拡張されました。
カスタムコンパイラとランタイムシステム設計により、Motokoは動的ヒープ内にすべてのオブジェクトを割り当てるコンパイル不変のメモリレイアウトを定義し、十分なメタデータを付随させることで、新しいプログラムバージョンが以前のバージョンの状態を安全に取得できるようにしています。
したがって、WebAssemblyのパッシブデータセグメントは有用であることが証明され、静的プログラムデータ(例えばテキスト文字列)をランタイムシステム内で遅延割り当てすることができ、静的アドレス範囲を保持する必要がありません。
私たちはアップグレードプロセス中に増分ガベージコレクター(GC)の状態を保持します。これにより、GCの実行が完了するのを待つことなく、いつでもアップグレードを行うことができます。
厳格なメモリと型の安全性を確保するために、ランタイムシステムは現在のプログラムバージョンの型を保存し、新しいプログラムバージョンにアップグレードしようとする際にこの情報を使用してメモリの互換性をチェックします。
このチェックは型の数のみに依存し、オブジェクトの数には依存しないため、アップグレード速度は非常に速く、任意のメモリサイズに拡張可能であり、特定のデータ移行(安定した変数の追加または削除、型の昇格、バリアントオプションの追加など)は自動的にサポートされ、より複雑なマイグレーションは手動でプログラムしながら型の安全性を持続的に保護できます。
Motokoは、古い従来の永続性から強化された正交的永続性への自動データ移行を実現しました。将来的に徹底的なメモリレイアウトの変化が発生する可能性を考慮して(このような事態は稀であると予想されます)、Motokoは安定したメモリのシリアル化に基づく補助的永続性メカニズムとグラフィック複製アルゴリズムを含め、インターネットコンピュータプロトコルの指令制限に影響されない無限の確定的時間スライスを提供しています。
強化された正交的永続性、設計、実装、データ移行シナリオ、パフォーマンス評価に関する詳細な情報は、最近発表された論文(正交的永続性を使用したスマートコントラクトのアップグレードの実現)にあります。
生産展開
最初のステップとして、強化された正交的永続性はオプション機能として使用でき、コンパイラオプション'--enhanced-orthogonal-persistence'を通じて有効にできます。対応するパラメータは、dfx.jsonに次のように指定できます:
Motokoは、自動的に古い32ビットの従来の永続性から強化された正交的永続性に移行しますが、EOPから32ビットの従来の永続性への逆操作はサポートされていないことに注意してください。
現在のバージョンでは、64ビットに切り替えたにもかかわらず、インターネットコンピュータは4GBの主メモリしか提供していません。これは初期段階の保守的な措置に過ぎず、リスク回避のリリース方法に従い、まずは小さなところから始め、時間をかけて徐々に容量を増やしていきます。
実際、64ビットへの切り替えと4GBの初期制限により、初期段階の純メモリ使用量は32ビットよりも少なくなると予想されています(ポインタサイズが2倍に増加したため)。64ビットメモリアクセスの指令コストも増加しており、ハードウェアコストを保守的にカバーするために、将来的には低下する可能性があります。
しかし最も重要なのは、アップグレードが非常に速くなり、インターネットコンピュータの指令制限に達しなくなることです。最大のヒープ使用率でも、アップグレードのフックがもはや必要ないことを考慮してください。
次のステップは、フィードバックを収集し、システムを改善し、メモリの容量を拡張した後、強化された正交的永続性をデフォルトモードとして設定することです。
結論
Motokoの強化された正交的永続性により、インターネットコンピュータの開発者は、安定したメモリを気にすることなく、コアアプリケーションに集中できるようになります。
これにより、シンプルで安全な永続性を実現できるだけでなく、インターネットコンピュータのアップグレードとデータアクセスのコストを大幅に削減します。
強化された正交的永続性は、私たちが現在Motokoのために持っているように、カスタムコンパイラとランタイムシステムを通じてのみ実現可能です。
詳細情報
Luc Bläser、Claudio Russo、Gabor Greif、Ryan Vandersmith、Jason Ibrahimによる、正交的永続性を実現したよりスマートなコントラクトのアップグレード、VMIL 2024:
https://dl.acm.org/doi/10.1145/3689490.3690401
DFINITYフォーラム投稿 - 強化された正交的永続性のベータテスト:
https://forum.dfinity.org/t/beta-testing-motoko-s-enhanced-orthogonal-persistence-eop/35787
ドキュメント - Motokoの強化された正交的永続性:
https://internetcomputer.org/docs/current/motoko/main/canister-maintenance/orthogonal-persistence/enhanced
ドキュメント - Motokoにおける安定した変数、アップグレード、データ移行:
https://internetcomputer.org/docs/current/motoko/main/canister-maintenance/upgrades
フィードバックを受け取れることを嬉しく思います。DFINITY Developers XチャンネルまたはMotoko GitHubリポジトリでアイデアを共有してください。
明日、Kamil PopielarzとYvonne-Anne Pignoletと一緒に、Stellaratorの旅の第3部に参加して、エントリメッセージのスループットを向上させる方法を学びましょう。
あなたが気にかけているICコンテンツ
技術進展 | プロジェクト情報 | グローバルイベント
ICバイナンスチャンネルをフォローしてコレクション
最新情報を把握する