Yumeville

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

サインアップがうまくいかないとき

令和3年4月16日

最新のHoloの開発情報に目を通した時、私は共有すべきまとまったストーリーを見つけるのに苦労しました。前回のDev Pulseからこんなことがあったんだよ」と言えるようなものがなく、その代わりに小さなアップデートがたくさんあるのです。しかし考えれば考えるほど、これこそが今回共有すべきメッセージだと気づきました。今、私たちは一貫して着実に進歩しています。コンポーネントは最適化され、書き直され、バグは発見され、中枢アプリケーションの開発は加速しています。ツイートを読みたくない方のために、主なポイントをご紹介します。

  • HoloPortオペレーティング・システムであるHPOSは、HoloChainのバージョンアップを行いました。これにより、今後予定されているすべての改良点の統合がより速くなります。これには、Chaperone/Envoy(ユーザーを選択したホストに接続するコンポーネント)とHoloPort/Holochain APIというHoloホスティングコンポーネントの更新作業が含まれています。
  • 今後の改善点の一つは、新しいプロキシサーバーです。これは、以前のものよりも大幅に高速化されています。Holochainの中枢開発者は現在、ゴシップが以前よりも遅くなることがあるというバグを解消しており、その後、テストに入る予定です。
  • もう一つの改善点は、SQLiteで構築された新しいデータベース層です。これはまだ最適化されておらず、現在のLMDBをベースにしたものよりも遅いのですが、これが最適化されて同等かそれ以上の速度になることと、ネットワーク全体をより効率的にする新しいHolochainの機能(シャーディングなど)が可能になることを期待しています。
  • ホスティングされたhAppsをホロポートにインストールする低レベルのコンポーネントが登場しました。(以前はhAppsはホロポートにハードコードされていました)
  • 分散型公開鍵基盤アプリケーションであるDeepKeyも、現在開発中です。知る限りのhAppの中で最も複雑な検証(バリデーション)コードを備えており、厳密なテストが必要です。そこで、モッキングフレームワークを導入し、ホストAPIを使用するすべての関数をユニットテストできるようにしました。
  • Elemental Chatの登録プロセスでは、招待コード機能が実装されているので、アルファテスターの数を管理しながら、ウェブの広い世界に開放することができます。この機能は、「メンブレンプルーフ」(ホロチェーンアプリのネットワークにノードが参加する際に必要な証明書)を必要とするHoloでホストされるhAppであれば、誰でも利用することができるようになります。
  • エレメンタルチャットの登録プロセスを厳密にテストしたところ、Holochainがセル(DNAのインスタンス)作成を処理する際にいくつかのバグがあることがわかりました。

最後の項目は興味深いもので、これらのバグがどこから起きているのかを説明すれば、下層レベルで何が起こっているのかを少しでも理解してもらえると思います。

今回のバグは、新しいウェブユーザーが割り当てられたHoloPortにそのユーザーの「セル」(Cell=細胞)をセットアップする際に発生します。セルとは、アプリのバイナリ(またはDNA)とエージェント(ユーザー、正確にはノード)IDを組み合わせたもので、アプリを使いたいエージェントは必ずセルを起動しておく必要があります。(実際、セルがなければ、つまりアプリのセルを生成したユーザーがいなければ、アプリは存在しているとは言えません)セルは、ユーザー(正確にはユーザーのコンピュータ上のUI)が、ソースチェーンにあるユーザー自身のデータや、DHTからの他の人のデータとやり取りするためのものです。

エージェンシーを守るために

ご存知のように、Holoホスティングは、P2Pでエージェントを中心としたHolochainの世界と、中央集権的なウェブの世界との妥協点であります。しかし、私たちが妥協しなかったのは、あなたの独立的不可侵性であり、ホロチェーンでは、あなたのソースチェーンにどのようなデータが入力されるかを選択する能力に最も強くこの概念が表されています。ソースチェーンは、あなたがあるホロチェーンアプリで行ったことの記録であり、だからこそ誰にもいじられたくないものでもあるのです。

このレベルのエージェンシーを維持するために、HoloPortはあるエージェントのソースチェーンに書き込みたくても、それができないようになっています。すべてのソースチェーンのエントリは、エージェントIDの秘密の部分であるエージェントの秘密鍵によって署名されなければなりません。その署名は、あなたの公開鍵(ソースチェーンに3番目に書かれている)と暗号的に照合されなければなりません。そして、その秘密鍵は、ログインするたびに生成され、ブラウザに安全に保存されます。これが、不正なHoloPortによるなりすましからあなたを守ってくれるのです。

Holochainアプリの仕組みは、何らかのアクション(例えば、ツイートの投稿)を実行する際に、UIがセル内の関数を呼び出し、ソースチェーンにいくつかのデータ書き込みを実行します。そして、Holochainのランタイムは、これらの書き込みをDNAの検証(バリデーション)ルールに照らし合わせて検証し、あなたの秘密鍵を使って署名を作成し、ストレージに書き込みを行います。

しかし、秘密鍵がエージェント自身のマシンにあって、そのエージェントのセルがホロポートにある場合、ちょっと工夫をしなければなりません。それは、HoloPortが、あなたに署名してほしいすべてのソースチェーンの書き込みからなる署名要求を、あなたのブラウザに送り返さなければならないということです。これは別のHTTPサイクルで行われます。

しかし、関数を呼び出してから書き込みに署名するまでの間には、ユーザーがブラウザを閉じて、書き込みを承認してもらおうとするHoloPortの試みを中断させてしまうようなことが起こりうる可能性があります。(非常に短い時間ですが)
もしこのようなことが登録中に起こった場合、HoloPortがElemental Chatの招待コードと公開鍵をソースチェーン(ジェネシスエレメント)に書き込もうとしても、実際には有効なセルを作成することができなくなってしまいます。

そこで、Holo開発チームは、このエッジケースに対処するために取り組んでいる2つのことがあります。1つは、検証(バリデーション)に失敗したときにHolochainのコンダクターがロックされる問題を修正すること(これはよくあるバグで、技術者が解決中です)、もう1つは、ジェネシスエレメントが最初の試行で署名できなかったときに、勝手に回復することです。

悪質なエージェントをネットワークから排除する

Holochainでは、すべてのアプリケーション(正確にはhAppバンドル内のすべてのDNA)が、それぞれ独立したデータストア(DHT)を持つ、独立したネットワークがあります。そして、時にはそのネットワークへのアクセスを制限することも必要です。

このために、ソースチェーンの最初のいくつ目かに書き込まれる「メンブレン(膜)プルーフ」(新エージェントがネットワークに参加する際に必要な証明書のようなもの)という要素があります。これは、自分が参加しようとしているネットワークに自分は属するべきだという証拠を提供するものです。アプリによっては、単純な招待コードであったり、3人の既存メンバーが署名した暗号証明書のような複雑なものであったりします。このメンブレンプルーフは、セルを起動するときに必要なもので、ネットワークの残りの部分とそのデータへのアクセスを許可する前に、最初のブートストラップ・ピアによって検証されます。

Elemental Chatはメンブレンプルーフを実装したアプリケーションの一つで、サインアップ時に招待コードが必要となります。Holoのシングルサインオン(SSO)ダイアログには、招待コードを貼り付けることができるフィールドがあり、これがユーザーに割り当てられたHoloPortに渡されます。

しかし、招待コードを間違えるとどうなるでしょうか?認証(バリデーター)ネットワークは、あなたがDHTのデータを見る機会を得る前に、あなたを拒否しなければなりません。これは厄介なことです。なぜなら、参加する前に自分で自分を検証することになっていて、これにより不正なデータの公開を防ぐことができるからです。しかし、招待コードの検証にDHTデータへのアクセスが必要な場合、自己検証ができなくなる可能性があります。

この「鶏が先か卵が先か」のような問題は、メンブレンプルーフの検証を行うための最良の方法について、一連の議論を引き起こしました。これは、開発チームが定期的に直面するエンジニアリング上の課題の一例であり、データの整合性を確保する「正しい」デザインへのこだわりを維持しながら、ユーザーエクスペリエンスへの影響を考慮しなければならない課題です。彼らの会話を見ていると、自分までも頭が良くなったような気がすると同時に、Holochaineの内部構造についてまだまだ学ばなければならないことを痛感させられます。

最初のステップは、Elemental Chatの招待コードが無効な場合にHolochainがロックされるバグを修正することです。上記と同様に、これは単なる日常的な技術的問題です。現在、バグ修正と並行して進めているより重要なステップは、メンブレンプルーフ検証のための最も賢明な設計を特定することです。開発者にとって理解しやすく使いやすい設計で、正確性を確保し、不快なユーザーエクスペリエンスを最小限に抑えることができる設計でなければなりません。

現在最も可能性の高いデザインは、3つのステップで構成されています。

  1. エージェントのセルは、メンブレン・プルーフの基本的な健全性テスト(サニティ・チェック)・コールバック関数を呼び出します。このコールバックは、正しい構造をチェックしたり、入力された情報に誤字がないかを検出したりします。
  2. 検証をするために選択されたピアがメンブレンプルーフを適切に検証し、その過程でDHTデータを使用する可能性があります。
  3. エージェントは、ネットワークへのアクセスが許可されたかどうかを検出します。許可されなかった場合は、セルを破壊し、新しいエージェントID(アプリのメンブレン保護の設計に応じて、新しいメンブレン証明も生成)で再試行します。

このプロセスの目的は、ネットワークに参加しようとする前に、できるだけメンブレンプルーフで健全なユーザーが起こす可能性の高い正直なミスを出来るだけ多く検知することです。一方で、免疫システムが本当の悪質エージェントを識別し、誤って健全なエージェントが悪質エージェントと認識された場合には、再挑戦のチャンスを与えることもできるようにします。

では、ホストされているエレメンタル・チャットではどうなのでしょうか?

今頃は、待ちに待ったマイルストーンである、ウェブユーザー向けのElementalチャットのホスティングが遅れているのではないかと思っていることでしょう。

しかし、遅れているわけではないのです。これはソフトウェア開発サイクルの中では当然のことだと思っています。理論と現実の世界が出会うとき、常に両者を一致させるために調整するプロセスがあります。これは、理論だけでは隠れてしまいがちな奇妙なエッジケースをすべて洗い出していることを意味します。それぞれのエッジケースに対応していくことで、ホロネットワークでホストされるアプリ(およびHolochain全般)がより良いものになっていくと思います。

 

(写真提供者:Christian Lue on Unsplash)