Yumeville

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

Holochain v0.0.103でのカウンターサインについて

令和3年08月21日

カウンターサイン

これがHolochain v0.0.103の大きなニュースです。ホロチェーンをフォローしている方は、暗号通貨の世界から来ている方が多いので、当然、新しい暗号通貨を作るためのプラットフォームとしてのホロチェーンに興味を持っていると思います。しかし、ホロチェーンで作られる暗号通貨が従来の暗号通貨のようには機能しないこともご存知でしょう。

では、ホロチェーンで作られる暗号通貨は、どのような仕組みになっているのでしょうか。

端的に言えば、カウンターサインと呼ばれる技術を使います。あるhAppのユーザーは全員、それぞれのソースチェーンを持っているので、すべてのトランザクションは、クロスチェーン(2つ以上にチェーン)・アトミック・スワップのようなものです(厳密には少し違いますが、これが一番近い比較でしょう)。

カウンターサインの概要を、アリスとボブを使って下記で説明します。複数の当事者が合意を必要とするあらゆる種類のトランザクションに使用できますが、今回は、誰もがよく知っている通貨取引を使用します。(他のユースケースとしては、法的な契約、所有権の移転(いわばNFT)、さらにはチェスのプレイヤーのランキングなどなど)

アリスはボブから自転車の購入代金として100クレジットを借りているとしましょう。アリスはボブに取引の詳細を送り、ボブはそれが正しい金額であることを認めます。これがユーザーである人間が直接関わる部分で、アリスとボブはアプリのUIを使い対話しています。

Alice shares the details of the transaction with Bob, who approves. The transaction details have an entry hash of #a63cffd.

トランザクションの詳細が合意されると、アリスとボブのhApp(ホロチェーンアプリ)は、自動的にカウンターサインのプロセスを開始し、それぞれのソースチェーンにトランザクションの署名とコミットを行います。このプロセスは、双方がオンラインであるときに素早く行われます。これが完了すると、アリスとボブは自分のソースチェーン上に、自分と相手の両方によって署名され、DHTに公開されたトランザクションのコピーを持つことになります。

(注:ここからは、「アリスとボブ」は実際にはアリスとボブのコンピュータを意味します)。

アリスは、自分とボブがそれぞれのソースチェーンの状態についてローカルで合意を得たという提案を生成します。これをプリフライトリクエストと呼びます。これには、当事者(アリスとボブ)、提案された取引のハッシュ、カウンターサインをするための時間枠が明記されています。このリクエストを作成した後、彼女はそれをボブに送ります。

Alice's computer sends a preflight request to Bob's computer. It contains the transaction hash, the counterparty IDs, and the time window.

ボブはアリスに、プリフライトリクエストに対する自分の署名と、現在のソースチェーンの状態を送信します。これを「プリフライトレスポンス」と呼びます。ボブのソースチェーンは、トランザクションが成功するか失敗するまで、この状態で「ロック」されます。その間に、アリスもプリフライト要求に署名します。

Alice and Bob both create preflight responses and lock their source chains; Bob shares his with Alice.

ここでアリスは、プリフライト要求に加えて、自分とボブの署名とソースチェーンの状態を含んだカウンターサインセッションを作成します。もう一度、アリスはそれをボブに送ります。

Alice shares a completed countersigning session with Bob.

アリスとボブの二人は、カウンターサインのセッションとトランザクションデータの両方を含む、カウンターサインされたエントリーをソースチェーンにコミットしようとします。

Alice and Bob both incorporate the countersigning session and the transaction data into an entry and begin to commit it.

二人のエントリーは、アリスが十分な残高を持っているかどうかをダブルチェックするバリデーション(検証)関数に渡されます。アリスとボブは、検証関数を合計で2回実行します。1回は自分の視点から、もう1回は相手の視点からです。

Alice and Bob both validate the new entry as if it were already on their, and each other's, source chains.

バリデーションのすべてがうまくいけば、あと少しでソースチェーンにコミットできる状態になります。次に、アリスとボブは、エントリーと自分のヘッダーを、DHTのある部分、つまりエントリーのアドレスの近傍に公開し、そこで第三者に検証してもらいます。

Alice and Bob share their entry and header with the neighbourhood responsible for validating the entry.

エントリーのアドレスの近傍のノードがアリスとボブの両方のヘッダーを収集したら、両方のヘッダーのコピーをアリスとボブに送信します。

The neighbourhood collects and returns both headers to Alice and Bob.

アリスとボブは、相手がエントリーに署名したことを確認できたので、トランザクションはこれでほぼ完了です。最後にもう一つのステップがあります。二人は最終的にエントリーをそれぞれのソースチェーンにコミットし、ヘッダをDHTのさらに2つの部分、つまり自分たちの近傍に公開します。これにより、将来の取引相手が二重支出の試みをチェックすることができます。

Alice and Bob commit the entry to their source chains and share the headers with their neighbours.

これでお金が振り込まれ、アリスとボブのソースチェーンのロックが解除され、ボブはアリスに自転車を渡します。

Alice rides off on her new bike, waving goodbye to Bob.

複雑に聞こえるかもしれませんが、それはその通りです。ただ、朗報であるのは、これらのプロセスのほとんどがホロチェーンコンダクターによって処理されていることです。開発者は、プリフライトリクエストプリフライトレスポンスの署名、カウンターサインセッションカウンターサインされたエントリー、そして新しいホスト関数accept_countersigning_preflight_requestについて知っているだけで十分です。残りの部分は柔軟に対応できます。開発者は自分に合った方法でカウンターサインセッションに必要なこれらを作成、配布、収集することができます。また、読者が定義したアプリのエントリータイプは、作成と更新の両方で、カウンターサイン付きトランザクションの一部となることができます。

注:カウンターサインは、恐るべき二重払い攻撃をキャッチする「チェーンフォーク検出」とは関係がないので、二重払い攻撃を防ぐ力はありません。これはDHTの仕事であり、DHTはチェーンのフォークを検出するために必要なすべての証拠を収集し、悪いノードを事後的に排除します。また、ホロチェーンの開発者たちは、二重払い攻撃の予防可能なソリューションに取り組んでいます。

並列ネットワーク機能

DHTのgetcall_remoteremote_signalなどのネットワーク関数は、ブロッキングコールと呼ばれ、完了するまで他のコードの実行を停止します。多くのDHTデータを取得したり、多くのピアのデバイス上で同じ関数を呼び出したりする必要がある場合、今まではループして、それぞれの呼び出しを連続して行わなければならないことになっていました。これにはかなりの時間がかかります。

getget_detailsget_linkget_link_detailsには複数のDHTハッシュを、call_remoteには複数のエージェントIDを指定できるようになりました。ホロチェーンは、これらの作業を並行して行い、成功値と失敗値のリストを一度に返すようになりました。

修正・変更点

互換性を破る変更点:ヘッダーのタイムスタンプは、常にその前のヘッダーのタイムスタンプよりも新しくなります。これまでは常に “newer than or equal to “でした。
互換性を破る変更点:コンダクターの設定にpassphrase_serviceディレクティブが必要になりました。
互換性を破る変更点:sys_time はDurationの代わりにTimestampを返すようになりました。
バグ修正:DNAを並行してインストールできるようになりました。
HolochainはLair 0.0.3を使うようになりました。LairはSQLiteにエントリを保存し、与えられたパスフレーズを使って暗号化します。このため、コンダクターの設定でパスフレーズのサービス指示が必要になりました。

もうすぐ2つ新ホロチェーンバージョンがリリースされます

今後2~3週間の間に、コア開発チームはHoloChain v0.0.104とv0.0.105をリリースする予定です。これらの変更点は以下のものを含む予定です。

来週は著者の私が休暇で不在なので、これらのリリースの一つを発表するのが遅れるかもしれません。最新の変更点を知りたい方は、GitHubレポの変更履歴をご覧ください。

(写真提供者:Cytonn Photography on Unsplash)