Generalized taproot(G'root)は、2018年にAnthony Townsによって提案されたPedersen Commitmentを使ってTaprootを実現するプロトコルの提案。
Taprootのscript-pathは、アンロック条件をマークルツリーにエンコードするMAST(Merklized Alternative Script Trees)という仕組みに依存しているが、G'rootは同様のことをマークルツリーを使わずに、Pedersen Commitmentで実現する。
Taprootのロックスクリプトのwitness programは、
Q = P + H(P, s)G
という公開鍵で構成される。この内P
は内部キー、s
がスクリプトツリーのルートハッシュから導出した値が含まれる。
key-pathによるアンロックは公開鍵Q
に対して有効な署名を提供し、script-pathによるアンロックはスクリプトツリー内のスクリプトとそれが含まれるルートまでのマークルパスとP
と、スクリプトを満たすwitnessが提供される。
G'rootの構成
Taprootの場合s
を導出するのに、各スクリプト条件をリーフノードとしたスクリプトツリーを構成するが、G'rootではツリーを構成するのではなく、各条件毎に以下のようなPedersen Commitmentを計算し、それを連鎖させていく。
A' = aG + sG2 + H(aG + sG2, B')G
G2
はG
とは別の楕円曲線上のジェネレーター、B'
は別のアンロック条件で構成されるPedersen Commitment。
A'にロックされたコインを使用する方法は、
- A'にスクリプト条件がない場合=つまり
s = 0
の場合のアンロック
A' = aG + H(aG, B')G
となるため、a + H(aG, B')
を秘密鍵として公開鍵A'に対して有効な署名を直接提供する。これはs = 0の場合のみ成立する。s != 0の場合、G2が残るので有効な署名は作れない。 - スクリプト
s
を使ってアンロックする場合
s
を公開し、公開鍵A' - sG2
に対して有効な署名と、スクリプトsを満たすwitnessを提供する。公開されたs
によりA' - sG2
でG2が無くなるので、a + H(aG + sG2, B')
を秘密鍵として有効な署名を作成することができる。 - 別のPedersen Commitment
B'
の条件を使ってアンロックする場合
aG + sG2
とB'
を公開し、B'
を満たすwitnessを提供する。
もう少し具体的な例を使うと、例えば以下の複数のアンロック条件を持つG'rootを構成する場合、
各条件ごとにに以下のようなPedersen Commitmentを作成する。
- D' = z
- C' = cG + yG2 + H(cG + yG2, D')G
- B' = bG + xG2 + H(bG + xG2, C')G
- A' = aG + H(aG, B')G
そしてG'rootのscriptPubkeyはA'
となる。A'
→B'
→C'
→D'
へのアンロック条件の連鎖を構成し、TaprootのMAST構造を代替する。
A'
をアンロックするためには、
A'
でアンロックする場合は、秘密鍵a + H(aG, B')
を使った署名をB'
でアンロックする場合は、aG
、B'
、x
を公開して、秘密鍵b + H(bG + xG2, C')
を使った署名とスクリプトx
を満たすwitnessをC'
でアンロックする場合は、aG
、B'
、bG + xG2
とC'
、y
を公開して、秘密鍵c + H(cG + yG2, D')
を使った署名とスクリプトy
を満たすwitnessをD'
でアンロックする場合は、aG
、B'
、bG + xG2
とC'
とスクリプト、スクリプトからz
までのマークルパスを公開し、スクリプトのwitnessを
提供する。使用確率の高いアンロック条件をA'
に近い位置に配置するのが、効率的。
※ z
の部分は、スクリプトツリーを使ってるので、MASTを使わないという訳ではない。