BLS署名とIDベース暗号でステートレスなDLC
以前の記事で、BLS署名によるアナウンスメントフリーなDLCについて紹介しました。当時はこの仕組みを深く理解できていなかったので、今一度調べてみました。このBLS署名とDLCについて日本語での解説記事が分かりやすかったです。以下に自分の備忘録としてまとめました。
シュノア署名の場合、秘密鍵、公開鍵、ランダム値から署名を生成します。そして、DLCでは(A, R)を暗号鍵、sを復号鍵としてアダプター署名を生成します(アダプター署名は検証可能な形で署名を暗号化したもの)。オラクルがある将来時点でメッセージm(例えば、BTC/USDのスポット)を署名すると復号鍵が出現するようなイメージです。
シュノア署名
-----------------------------------
秘密鍵 a
公開鍵 A = a * G
メッセージ m
ランダムな値 k
R = k * G
-----------------------------------
計算 s = k + Hash(R, m)*a
署名 (R, s)
BLS署名の場合、ランダム値を使わないことが特徴です。
BLS署名
-----------------------------------
秘密鍵 a
公開鍵 A = a * G
メッセージ m
ランダムな値 なし
-----------------------------------
計算 s = Hash(m)*a
署名 s
シュノア署名の場合、ランダム値を事前にオラクルがイベントとしてコミットしているのに対して、BLS署名ではそれに対応するものがありません。そこで登場するのがIDベース暗号となります。
IDベース暗号は、公開鍵を好きな文字列IDとして選ぶことができる暗号です。メールアドレスを公開鍵としたりできます。例えば、AさんはBさんのメールアドレスとランダム値を使ってメール本文を暗号化してBさんへ送信します。Bさんは鍵生成局へBさんのメールアドレスに対する秘密鍵の生成を要求します。鍵生成局はマスター鍵からBさんのメールアドレスに対応した秘密鍵を生成してBさんへ送付します。Bさんはその秘密鍵を使ってAさんからのメールを復号します。
このIDベース暗号の秘密鍵の生成方式はBLS署名と同じ構造をしています。これが重要!
このIDベース暗号を使い、イベントとしてのIDを任意に決めてそれを公開鍵QID(暗号鍵)とします。DLCの参加者はアダプター署名を生成してその復号鍵※1をさきほどの公開鍵で暗号化します※2。そしてオラクルがある将来時点でのイベントの結果(例えば、BTC/USDのスポット)に対してBLS署名をします。この署名がIDベース暗号における秘密鍵dID(復号鍵)となります。この秘密鍵を使ってアダプター署名の復号鍵を復号し、さらにこの復号鍵でアダプター署名を復号することで、最終的なトランザクション(CET)を生成できます。
※1シュノア署名ベースの場合はこの復号鍵はオラクルが署名するsとなるが、BLS署名の場合はアダプター署名の作成者が任意に作る。
※2この復号鍵を伝えずに暗号文が正しいかを証明する方法がないため、「ym-cipher」と「BF-cipher」という二つの暗号文を作成する。また、これらの暗号文が「cut-and-choose」という技術を使う。
BLS署名だけでは公開鍵QID(暗号鍵)をイベントごとに任意に生成することができません。IDベース暗号を使うことでBLS署名の公開鍵を任意のイベントIDとして選べるようにしています。これがBLS署名にステートレスなDLCの正体でした。
余談ですが、IDベース暗号においてDLCの当事者は自身が有利になるイベントに対する秘密鍵の要求をオラクルにすればいいのでは?って思いましたが、オラクルは任意のイベントに対して署名を生成するのではなく、そのイベントの結果に対して署名するだけなんですね(シュノア署名ベースのDLCでも同様ですね)。DLCの当事者は将来時点でそのイベントの結果にオラクルが署名をするという仮定の上に成り立っています。
複数の暗号技術を組み合わせてこんな仕組みを考えるなんてすごいですね~!