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を使わないという訳ではない。