【CTO Tech blog】 ツーショットアダプター署名
- CTO Tech blog

アダプター署名と言えば、HTLCに代わるPTLCや、スクリプトレスなAtomic Swapを行う際に利用される暗号プリミティブ。簡単にSchnorr署名の例で説明すると*1、
鍵ペアをP = xG(P:公開鍵、x:秘密鍵、G:ベースポイント)として、メッセージmに署名する場合、通常のSchnorr署名の生成手順は、
- シークレットnonce kをランダムに選択し、
- パブリックnonce R = kGを計算
- s = k + H(P || R || m)xを計算(Hはハッシュ関数)
- (R, s)がSchnorr署名
署名の検証は、sG = R + H(P || R || m)Pが成立するかどうかを検証する。
アダプター署名というのは、補助ポイントT = tGを用いた不完全な署名データを指す。具体的には、署名をtを用いて
s' = t + k + H(P || R || m)x
と計算する。アダプター署名は(R s’, T)で構成され、この場合、s’Gは、
s'G = T + R + H(P || R || m)P
となる。アダプター署名(R, s’, T)を保持していて、その後有効なSchnorr署名(R, s)が開示されると、この2つからシークレット値t = s’ – sを計算できるというもの。
有効な署名が提供されると自分に必要なシークレット値が判明する、この特性がPTLCやAtomic Swapで活用できる。
ツーショットアダプター署名
Bitcoinで多数の参加者で構成されるペイメントプールの提案Bitcoin Clique↓の中で、新たに提案された暗号プリミティブがツーショットアダプター署名。
Bitcoinで多数の参加者で構成されるペイメントプールの提案Bitcoin Clique↓の中で、新たに提案された暗号プリミティブがツーショットアダプター署名。
ツーショットアダプター署名というのは、2つのアダプター署名を用いて、それぞれに対応する2つの有効な署名が公開された場合に、シークレット値が判明するというもの。2つの有効な署名のうち、公開されたのが1つだけであればシークレット値が漏れることはない。
2つのアダプター署名を用いてこれを実現するために補助ポイントの導出方法を工夫する。
アダプター署名を2つ作るので、当然補助ポイントも2つ用意する必要があるが、この補助ポイントをT1=t1G,T2=t2GT1=t1G,T2=t2Gとし、T=T1+T2=(t1+t2)GT=T1+T2=(t1+t2)Gとなるように構成する。
異なるメッセージm1,m2m1,m2に対して上記の補助ポイントを使用してアダプター署名を作成した場合、それぞれに対応する有効な署名が提供されるとそこから、t1,t2t1,t2の値が計算できるようになる。これらの値がわかるとTの離散対数t=t1+t2t=t1+t2が判明する。どちらか一方だけではtは計算できない。
Bitcoin Cliqueではプールからの退出時に不正を働こうとした場合にペナルティを与える仕組みとして、このツーショットアダプター署名の仕組みを利用してる。ツーショットアダプター署名自体は、Bitcoin Cliqueに限らず他にもいろいろ使えそう。