Pieter WuilleとAnthony Townsの議論から、GraftrootとG'rootを組み合わせたEntrootというプロトコルが公開されてる↓
https://gist.github.com/sipa/ca1502f8465d0d5032d9dd2465f32603
Graftrootとは?
Graftrootは、Gregory MaxwellがTaprootを発表した後に追加で提案されたプロトコル。
Taprootは、
- (集約公開鍵である場合もある)単一の公開鍵を使ったkey-pathによる支払い
- アンロック条件がエンコードされたマークルツリーを利用するscript-pathによる支払い
をサポートしているが、これはいずれも予め決められたアンロック条件を使った支払いになる。
Graftrootは、key-pathの鍵を使って、任意のスクリプトに署名し、そのスクリプトと署名を提供することで、後から任意の支払い条件を追加できるようにするというプロトコル。
G'rootとは?
G'rootについては、まず先日書いた投稿を参照↓
techmedia-think.hatenablog.com
Condition Point
G'rootでは、楕円曲線の2つめのジェネレーターG2を利用したPedersen Commitment
Q = P + H(s)G2
を利用していたが、ここではそれを少し改良して、G2の代わりにハッシュ値を誰もその離散対数を知らない曲線上の点にマッピングするハッシュ関数hash-to-curve(Hc()
)を使用する↓
Q = P + Hc(s)
hash-to-curveの一番簡単な実装は、生成したハッシュ値を楕円曲線のx座標として曲線上の点に変換するというもの(該当するx座標の点がない場合は、値をインクリメントしていく)。G2でなくhash-to-curve使うのは楕円曲線の乗算よりも高速だから。
Entroot
↑のEntrootの説明では、G'rootを再公式化して説明しており、このCondition Pointの使用や、支払いポリシーを3つのノードタイプを持つツリーとして定義しており、基本的に各Condition Pointと支払いポリシーのツリーが
を表現できるようになっている。
Entrootは上記の評価ルールに4つめのアンロック条件=Graftrootの評価ロジックを追加しようというもの。
G'rootでは、スタックで公開されたアイテムを使って、hash-to-curveの要素を削除する。つまりQ - Hc(s)
して出てきたP
に対する署名検証を行う。そして、スクリプトs
の評価を行う。
この時、署名対象のメッセージは、通常その支払いトランザクションのsig hashであるが、もしスタックに別のCondition Point(Qgraft)が含まれている場合、かつそれを署名対象のメッセージとしてPに対して有効な署名が提供されていた場合、Condition Point(Qgraft)が次の評価ポイントとして評価されるようになる。
つまり、任意の評価条件=Condition Pointに対して、現在のアンロック条件によって有効な署名が提供されていれば、それをアンロック条件として評価するルールを追加しようというもの。
G'rootとの組み合わせで変わること
元々のGraftrootの提案では、key-pathの鍵を使って署名して任意のアンロック条件を追加するというものだった。
しかし、G'rootのロジックに加えると、key-pathの鍵に限定されずに、G'rootのアンロックブランチのいずれかの条件を満たせれば、誰でも任意のアンロック条件を追加できるようになる。元のTaprootの文脈でいうと、key-pathだけじゃなくてscript-pathのどの条件ブランチを使っても新たなアンロック条件を追加できるということ。