Yumeville

Holochain デベロッパーパルス No.97

Holochainに一部パーツのアップグレード

令和3年6月04日

最近、私が共有してきたことの多くは、Holoのホスティングに関するものでした。つまり、「happy(ハッピーとhappをかけた言葉) path(道)」なユーザーインタラクション(すべてが期待通りに動作しているという意味)と「サッドパス」なユーザーインタラクション(HoloPortがダウンしたり、ログインに失敗したりするつまりユーザーが悲しむような出来事)の両方を処理できるように、すべてのコンポーネントを本当に強固にすることです。しかし、ホロチェーン自体がどのように改善されているかについては、あまり時間を割いていませんでした。また、そのような話をしたとしても、たいていは前述のホロの作業をサポートするためのバグフィックスについてでした。

しかし、舞台裏では、ホロチェーンはいくつかの部品に大きなアップグレードを行っています。これは主に、次の段階であるElemental Chatのテストに向けて、高速化を図るためです。(もちろん、Elemental Chatのテストは、Holoホスティングとホロチェーンのためのテストです)

LMDBからSQLiteへ:無限のスケーラビリティへの道

Secure Scuttlebuttのような分散型ソーシャルネットワークからBitcoinのようなブロックチェーンまで、多くのピアツーピアネットワークは「ゴシッププロトコル」と呼ばれるもので構築されています。これはシンプルなプロトコルで、その名の通りに動作します。私はたくさんの人(正確には、コンピュータ)を知っていて、友人の一人が何かを私に共有すると、私はそれを他の知り合い全員と共有します。これがゴシッププロトコルです。このプロトコルでは、中央の権威者がいなくても、ネットワークを通じてメッセージが急速に広がります。

また、このプロトコルでは多くのネットワークトラフィックが発生します。ブロックチェーンでは、すべてのマシンが常時オンラインであり、すべての情報を知る必要があるため、それでよいのかもしれません。しかし、日常的なアプリケーションを動かすネットワークでは、ユーザーの帯域を尊重したいですし、ユーザーのマシンが常にオンになっていることも期待できません。実際ブロックチェーンでもゴシッププロトコルに手を加えて効率化を図っています)

ホロチェーンは、権限を持つ「近隣」という考え方に基づいています。各データにはアドレスが付与され、そのアドレスをカバーするアドレス範囲に責任を持つマシンのグループにのみそのデータは送信されます。つまり、従来のゴシップはデータの送受信が多いということです。データの権威者としては、隣人が自分とまったく同じアドレス範囲を担当していないことを考えると、隣人と何を共有すべきかを常に判断する必要があります。

マシンの電源が常にオン/オフされていると、さらに複雑になります(ユーザーのデバイスの場合はよくあることです)。しばらくオフラインになっていたマシンは、最新のゴシップを入手したいと考え、最後にオンラインになってからの新しい情報のダイジェストをピアに尋ねなければなりません。

つまり、”どの隣人の責任範囲がアドレス531993928の前から始まり、531993928の後で終わるのか?”や 、”昨日の朝08:37(UTC)以降、隣人Aliceの責任範囲112513216から241661317内で収集した新しいデータは何か?”といった質問を自分のデータベースにすることができなければなりません。このような質問はレンジクエリと呼ばれ、LMDBのようなキー/バリューデータベースでは答えるのが難しいのですが、SQLiteのようなリレーショナルデータベースではとても簡単です。

ホロチェーンのデータはすべて、キー(アドレス)とそのキーに付随する値だけなので、当初はLMDBが有効でした。LMDBはキー/値の検索がどのリレーショナルデータベースよりもはるかに速く、CPUやRAMにも優しいからです。しかし、中枢開発者がシャーディングを検討し始めたとき、LMDBのままでは大量のレンジクエリがパフォーマンスを著しく低下させることが明らかになりました。

副次的なボーナスとして、SQLiteではSQLCipherを使用してソースチェーンとDHTデータを静止状態で暗号化することができます。注:これは、あなたが仲間の公開データを読むことを妨げるものではありません。しかし、攻撃者があなたのコンピュータにアクセスした場合に、攻撃者がデータを盗むことを防ぐことができます)

その他のゴシップのアップグレード

前述したように、しばらくオフラインだったマシンがオンラインになったとき、キャッチアップのためにネットワークを駆使していました。しかし、現在では、マシンはブルームフィルターを使って、保持しているデータのリストを比較しています。この手法では、ノード間のメッセージのやりとりが増えますが、全体的なデータのやりとりは少なくなります。まだシャーディングが導入されていないにもかかわらず、すでに同期が高速化されています。

WasmerとRustの新バージョン

Holochainアプリの「ルール」を実行するために使用しているWebAssemblyエンジン「Wasmer」のバージョンが1.0になったので、アップグレードしました。メモリ管理が改善され、コンパイラとランタイムが高速化され、多くのバグが修正されています。また、HoloPort NanoのようなARM CPU上でHolochainをコンパイルして実行できるようになりました。

また、Wasmer 1.0では、Holoホスティングのためのコンピュートメータリングや、無限ループがホストのCPU容量を使い切ってしまうのを防ぐランタイムメモリバジェットも実装されます。

また、プログラミング言語「Rust」の新バージョンがリリースされたので、ホロチェーンもアップグレードしました。

これらのアップデートといくつかのバグフィックスにより、私たちの開発環境であるHolonixでのmacOSビルドの問題解決されました。

これから

Wasmer 1.0とRust 1.52はすでにホロチェーンに統合されており、SQLiteのアップデートと一緒にロールアウトされる予定です。また、Holonixの自動ビルドサーバーを研究していますので、コンパイルに1時間もかかることはありません。

SQLiteの統合作業は完了しており、キー/値検索のパフォーマンスの低下は、範囲検索のパフォーマンスの向上によって相殺されています。現在、1つのHoloPortで、20人のホストユーザーと1つのセルフホストインスタンスを含む自動化されたElemental Chatのテストが行われており、処理キューの詰まりに関するバグが明らかになっています。他に致命的なバグがなければ、近々すべてのHoloPortで、現在のLMDBベースのホロチェーンを置き換えることになるでしょう。

この作業がほぼ完了したので、中枢開発者たちはDHTのシャーディングに取り組むことができました。これまでのところ、「フルシンク」となっており、ブロックチェーンのように全員がすべてのデータを保存することになっています。これは、冗長性の面では良いのですが、パフォーマンスの面では良くありません。(コミュニティテスターは、Elemental Chatがすでにどれほど高速であるかを一貫して話していますが)今のところ、シャーディングに関わるタスクの約半分が完了しています。

シャーディングは、dAppsを高速でスケーラブルなものにするという我々の約束の一部でしたので、これが実現するのを見るのは楽しみです。

リマインダー:デベロッパーキャンプに登録しましょう!

次のコミュニティ主導のデベロッパーキャンプが9月に始まります。あなたが取り組むプロジェクトは、「ホロコモンズの悲劇」というゲームで、単一の真実の源がなくてもうまく機能するアプリをデザインする方法を理解するのに役立ちます。著者としては素晴らしいアイデアだと思います。

Dev Campsは今でも無料で、知識豊富な素晴らしいボランティアグループによって運営されています。

ホロチェーンの開発者コミュニティは、学習教材やオープンソースのライブラリ、ツール、アプリのエコシステムとともに成長しています。もしあなたがエコシステムが成熟するのを待っていたのなら、フォーラムやGitHubをチェックして、参加してみるのもいいかもしれません。これらは私のお気に入りのリソースです!

(写真提供者:Julian Hochgesang on Unsplash)