この記事は「A Journey into Stellarator: Part 2」を引用翻訳しています。
Motokoの強化された直交永続性
著者:Luc Bläser
この3部作のシリーズでは、Internet Computer Protocol (ICP)上で実行されるアプリケーションのデータ処理能力を大幅に向上させる技術的成果について明らかにします。
このアップグレードは、現在ネットワーク全体に展開されているICPロードマップのStellaratorマイルストーンを指します。Stellaratorはオンチェーンデータ永続性におけるブレークスルーであり、データストレージのスケーラビリティと処理を大幅に向上させ、これまでシステムの制約によって制限されていた複雑なデータ集約型アプリケーションの新しい機会を解放します。
この進歩により、開発者は大規模なデータ処理を必要とする高度なアプリケーションを構築できるようになり、ブロックチェーン技術に新しいレベルの有用性をもたらします。
このシリーズの第2回では、Luc BläserがMotokoの強化された直交永続性について説明します。データ永続性に関する第1部を見逃した方は、こちらでご覧いただけます。
シンプル、安全、そして高速:Motokoの強化された直交永続性
Motokoは強化された直交永続性を導入します。これは、シンプルで安全、そして同時に高速なアップグレードメカニズムを提供することで、プログラマーをステーブルメモリの扱いから解放することを目指す独特の機能です。
Motokoは常に、永続性を処理するための追加のコードなしで、アップグレード間でプログラムの状態を自動的に保持することができました。残念ながら、この機能の以前の実装は、大規模または深くネストされたデータにスケールしませんでした。
この機能は現在、安全性、パフォーマンス、スケーラビリティの面で大幅に強化されています。主要な革新は、メインメモリを単に保持し、消去しないことで、ステーブルメモリへの状態の転送を回避することです。
ランタイムシステムは現在、メモリサイズに関係なく、非常に効率的な方法でアップグレード時のデータの一貫性を保証します。最後に、将来的に大量の永続データにスケールするために、32ビットから64ビットのメインメモリに切り替えます。
背景
キャニスターのアップグレードは、Internet Computerにおける課題の多い側面であり、しばしば相当な複雑さ、オーバーヘッド、そしてデータ損失のリスクを伴います。キャニスターのメインメモリ(WebAssemblyメモリとも呼ばれる)がトランザクション間で永続化されるにもかかわらず、過去にはアップグレード時に消去されていました。これは、メモリがInternet Computer上ですでにファイルバックアップされていることを考えると、かなり人工的なステップでした。
この動作の理由は、主流のプログラミング言語の実装が永続性を考慮して設計されていないためです:再コンパイル時やランタイム時にメモリ構造を制御されない方法で再配置し、以前のバージョンのメモリを持つ修正されたプログラムの実行を単純に再開することができません。
その結果、プログラマーはアップグレード間でデータを保持するために、ステーブルメモリAPIまたは特別なステーブルデータ構造を明示的に使用しなければなりませんでした。これは、揮発性のメインメモリと永続的な二次ストレージを提供する従来のコンピュータアーキテクチャと同様で、ソフトウェア開発の複雑さが増加します(オブジェクトデータベースマッパーなどを考えてみてください)。
対照的に、Motokoでは、コンパイラとランタイムシステム、そしてメモリレイアウトを完全に制御できます。これにより、アップグレードにも対応するMotokoでの直交永続性のサポートが可能になります。
結果として、Motokoのプログラマーは、明示的なステーブルメモリ、専用のステーブルデータ構造、またはその他のデータベースのような抽象化を使用することなく、標準的な言語概念で任意のデータ構造(第一級型の)を便利に開発できます。ランタイムシステムは必要なオブジェクトを自動的に永続化します。
以前は、Motokoのランタイムシステムは、永続的なオブジェクトグラフをステーブルメモリとの間でシリアライズおよびデシリアライズすることで直交永続性を実装していました。このプロセスは非常にコストがかかり、命令制限を超える可能性さえあり、最終的にアップグレードを妨げるため、深刻なスケーラビリティとパフォーマンスの問題を引き起こしました。これらの落とし穴により、大規模なアプリケーションには実用的ではありませんでした。このため、Motokoの直交永続性サポートを再設計しました。
Internet ComputerとMotokoのランタイムシステムを変更することで、二次的なステーブルメモリ空間との間の高価なシリアライズとデシリアライズなしで、スケーラブルなアップグレードを可能にしました。代わりに、メインメモリをアップグレード間で単に永続的に保持します。同時に、直交永続性のアドレス空間を64ビットに拡張し、(将来的に)64ビットのステーブルメモリが提供する容量と同じまでスケールできるようにしました。
強化された直交永続性
私たちの目標は、Internet Computer上のソフトウェア開発を簡素化し、プログラマーをステーブルメモリを扱う負担から解放することです。このため、Motokoは同時にシンプル、安全、そして高速なアップグレードを可能にすることで、Internet Computer上の永続性に最適化されています:
シンプル:直交永続性(Motokoのステーブル変数)により、任意の第一級型の推移的に到達可能な構造が自動的にアップグレード間で永続化されます。ステーブルメモリやステーブルデータ構造は必要ありません。
安全:ランタイムシステムはアップグレード時に型の互換性を厳密にチェックし、暗黙的な移行による複数の種類のデータ変更をサポートします。より複雑な移行はカスタムコードで実装できます。これにより、メモリレベルでのデータの破損や誤解釈を防ぎます。
高速:メインメモリはアップグレード時に単に保持されるため、アップグレードは超高速になります。ステーブルメモリとの間のコピーは必要ありません。メインメモリは64ビットに拡張され、将来的にはステーブルメモリと同じくらい大きくスケールできます。
設計の概要
強化された直交永続性の前提条件として、Internet Computer Protocolは、アップグレード間でのメインメモリの保持とWebAssembly Memory64提案に基づく64ビットメインメモリのサポートを拡張しました。
特注のコンパイラとランタイムシステムの設計により、Motokoは、すべてのオブジェクトが動的ヒープに割り当てられる不変のメモリレイアウトを定義し、新しいプログラムバージョンが以前のバージョンの状態を安全に引き継ぐことを可能にする豊富なメタデータを伴います。
WebAssemblyのパッシブデータセグメントは、静的なアドレス範囲を予約する必要なく、ランタイムシステムで静的なプログラムデータ(テキストリテラルなど)の遅延割り当てを可能にするため、有用であることが証明されています。
私たちは、インクリメンタルガベージコレクタ(GC)の状態さえもアップグレード間で永続化します。これは、GCの実行完了を待つことなく、いつでもアップグレードができることを意味します。
厳密なメモリと型の安全性を確保するために、ランタイムシステムは現在のプログラムバージョンの型を保存し、新しいプログラムバージョンにアップグレードしようとする際にこの情報を使用してメモリの互換性をチェックします。
このチェックは型の数にのみ依存し、オブジェクトの数には依存しないため、アップグレードは非常に高速で、任意のメモリサイズにスケールします。ステーブル変数の追加や削除、型の昇格、バリアントオプションの追加などの特定のデータ移行は自動的にサポートされ、より複雑な移行は型の安全性を継続的に保護しながら手動でプログラムすることができます。
Motokoは、古典的な永続性から強化された直交永続性への自動データ移行を実装します。将来的な根本的なメモリレイアウトの変更(これは稀なケースになると予想される)を可能にするため、Motokoには、ステーブルメモリシリアライゼーションとグラフコピーアルゴリズムに基づく二次的な永続性メカニズム、およびInternet Computer Protocolの命令制限に制約されない無制限の決定論的タイムスライシングも含まれています。
強化された直交永続性、その設計、実装、データ移行シナリオ、およびパフォーマンス評価の詳細については、最近公開された論文「Smarter Contract Upgrades with Orthogonal Persistence」をご覧ください。
本番環境への展開
第一段階として、強化された直交永続性は、コンパイラオプション'--enhanced-orthogonal-persistence'で有効化できるオプトイン機能として利用可能です。対応する引数は、dfx.jsonで以下のように指定できます:
json
Copy
{ "main": "your-program.mo", "type" : "motoko", "args" : "--enhanced-orthogonal-persistence", }
Motokoは古い32ビットの古典的永続性から強化された直交永続性への移行を自動的に行います。ただし、EOPから32ビットの古典的永続性へのダウングレードという逆方向はサポートされていないことにご注意ください。
現在のバージョンでは、64ビットへの切り替えにもかかわらず、Internet Computerは4GBのメインメモリのみを公開しています。これは最初のステップとしての保守的な措置であり、リスク回避的な立ち上げに従い、まず小規模に開始して時間とともに容量を徐々に増加させていきます。
実際、64ビットへの切り替えと4GBの開始制限により、この初期段階では(ポインタサイズが2倍になるため)32ビットと比較してネットメモリ使用量は少なくなることが予想されます。64ビットメモリアクセスの命令コストも、ハードウェアコストを保守的にカバーするために増加されています。これは将来的に削減される可能性があります。
しかし最も重要なのは、アップグレードが非常に高速になり、最大ヒープ使用時でもInternet Computerの命令制限に達することがなくなる点です(アップグレードフックが不要になることも考慮に入れています)。
次のステップとして、フィードバックを収集し、システムを潜在的に改良し、メモリ容量を拡大した後、強化された直交永続性をデフォルトモードにすることを計画しています。
結論
Motokoの強化された直交永続性により、Internet Computerの開発者はステーブルメモリを心配することなく、コアアプリケーションに集中できます。
これはシンプルで安全な永続性を可能にするだけでなく、Internet Computer上でのアップグレードとデータアクセスのコストを大幅に削減します。
強化された直交永続性は、現在Motokoが持っているような特注のコンパイラとランタイムシステムでのみ実現できるものです。
詳細情報
Luc Bläser, Claudio Russo, Gabor Greif, Ryan Vandersmith, Jason Ibrahim著「Smarter Contract Upgrades with Orthogonal Persistence」、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://internetcomp
Comentarios