Develop with pleasure!

福岡でCloudとかBlockchainとか。

Generalized taproot(G'root)

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

G2Gとは別の楕円曲線上のジェネレーター、B'は別のアンロック条件で構成されるPedersen Commitment。

A'にロックされたコインを使用する方法は、

  1. A'にスクリプト条件がない場合=つまりs = 0の場合のアンロック
    A' = aG + H(aG, B')Gとなるため、a + H(aG, B')秘密鍵として公開鍵A'に対して有効な署名を直接提供する。これはs = 0の場合のみ成立する。s != 0の場合、G2が残るので有効な署名は作れない。
  2. スクリプトsを使ってアンロックする場合
    sを公開し、公開鍵A' - sG2に対して有効な署名と、スクリプトsを満たすwitnessを提供する。公開されたsによりA' - sG2でG2が無くなるので、a + H(aG + sG2, B')秘密鍵として有効な署名を作成することができる。
  3. 別のPedersen Commitment B'の条件を使ってアンロックする場合
    aG + sG2B'を公開し、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'でアンロックする場合は、aGB'xを公開して、秘密鍵b + H(bG + xG2, C')を使った署名とスクリプトxを満たすwitnessを
  • C'でアンロックする場合は、aGB'bG + xG2C'yを公開して、秘密鍵c + H(cG + yG2, D')を使った署名とスクリプトyを満たすwitnessを
  • D'でアンロックする場合は、aGB'bG + xG2C'スクリプトスクリプトからzまでのマークルパスを公開し、スクリプトのwitnessを

提供する。使用確率の高いアンロック条件をA'に近い位置に配置するのが、効率的。

zの部分は、スクリプトツリーを使ってるので、MASTを使わないという訳ではない。