🔑

MPCにおけるHDPathの使い方

2024/03/17に公開

tss-lib は、MPC(Multi Party Computation)を用いて、しきい値署名スキーム(TSS)を実装したライブラリです。TSS では、秘密鍵が複数のパーティに分散されており、これらの分散された鍵の一つ一つを KeyShare と呼びます。本記事では、tss-lib の ECDSA における HDPath を用いた子鍵の導出と、そのために必要な情報の共有方法について解説します。

MPC の概要についてはこちらの記事をどうぞ 😃
https://zenn.dev/sawatani/articles/3d243892a39a6a

HDPath を用いた子鍵の導出

tss-lib の ECDSA では、HDPath(階層的決定性パス)を用いて、親鍵から子鍵を導出することが可能です。(ソースコードのこの辺りです)
HDPath は、BIP32(Bitcoin Improvement Proposal 32)で定義された規格で、親鍵から子鍵を階層的に導出するためのパスを表します。

HDPath は、"m/0/0/0" のような形式で表現されます。HDPath を使用することで、同じ親鍵から複数の子鍵を体系的に導出することができます。これにより、多数のアドレスを管理する際の利便性が向上します。

tss-lib では、HDPath を用いた子鍵の導出に以下の情報が必要です。

  1. chainCode:親鍵から子鍵を導出する際に使用される、256 ビットの追加のエントロピーを提供するデータ。

  2. HDPath:親鍵から子鍵を導出するためのパス。

または、これらから計算された

  1. keyDerivationDelta:chainCode と HDPath から計算される値で、子鍵の導出に使用される。

下図は、KeyShare、HDPath、および chainCode を使って keyDerivationDelta を計算し、keyDerivationDelta と KeyShare を用いて KeyShare を調整することで、子鍵の導出に必要な調整された KeyShare を得るプロセスを示しています。この調整された KeyShare を使用して、子鍵による署名が可能になります。

導出に必要な情報の共有方法

アドレスを使い分けるためには KeyShare を持つ各パーティとこれらの情報を共有する必要があります。
いくつかの選択肢があり、ここでは次の3つを挙げてみます。

選択肢 1: chainCode と HDPath を署名の都度渡す

メリット

  • 署名ごとに chainCode と HDPath を渡すことで、柔軟性が向上します。

  • 事前の共有が不要であるため、初期設定が簡単です。

デメリット

  • 署名ごとに chainCode と HDPath を渡す必要があるため、傍受される可能性が増加します。

  • chainCode をどこで管理してバックアップするかが課題となります。

選択肢 2: chainCode を予め共有しておいて、署名の都度 HDPath を渡す

メリット

  • HDPath のみを渡すことで、通信量を減らすことができます。

  • HDPath だけを傍受されても chainCode が無ければ使い道がありません。

デメリット

  • chainCode を予め共有する必要があるため、初期設定が必要です。

選択肢 3: keyDerivationDelta を署名の都度渡す

メリット

  • keyDerivationDelta のみを渡すことで、通信量を最小限に抑えることができます。

  • chainCode と HDPath が通信されないため、システムの構造や関連性の機密性が向上します。

  • 各パーティが keyDerivationDelta を計算する必要がないため、全体の計算量が減少します。

デメリット

  • chainCode をどこで管理してバックアップするかが課題となります。

まとめ

tss-lib の ECDSA では、HDPath を用いた子鍵の導出が可能であり、これにより MPC での複数アドレス管理の利便性が向上します。子鍵の導出には、chainCode、HDPath、およびこれらから計算された keyDerivationDelta が必要です。導出された子鍵は、調整された KeyShare を使用して署名を行うことができます。

これらの情報を共有する方法には、それぞれメリットとデメリットがあります。通信量、セキュリティ、柔軟性などの要件を考慮して、最適な選択肢を決定することが重要です。

特に、選択肢 3 の keyDerivationDelta を署名の都度渡す方法は、通信量を最小限に抑えつつ、システムの構造や関連性の機密性を高めることができるため、多くの場合に適していると考えられます。

適切な情報共有の方法を選択することで、tss-lib を用いた MPC におけるセキュリティと効率性を高めることができるでしょう。

Discussion