Develop with pleasure!

福岡でCloudとかBlockchainとか。

GraftrootとG'rootを組み合わせたEntroot

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と支払いポリシーのツリーが

  • 単一の公開鍵によるアンロック
  • 単一の公開鍵とスクリプトによるアンロック
  • (単一の公開鍵とスクリプトを開示した上で)リンクしている別の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のどの条件ブランチを使っても新たなアンロック条件を追加できるということ。