やH TapTweak はタグ付きハッシュで、ハッシュ値の計算をする際に それぞれ、”TapBranch”、”TapTweak”をタグとして付与することでコンテキストを明示している。 4 マークルブランチで提供されるスクリプト A B C D E AB = H TapBranch (A + B) CD = H TapBranch (C + D) CDE = H TapBranch (E + CD) ABCDE = H TapBranch (AB + CDE) t = H TapTweak (P + ABCDE) スクリプトで構成したマークルツリーの ルートハッシュをTaprootのscriptPubkeyに使用する リーフノードの値の計算は↓ H TapLeaf (leaf version + Script A) ※ leaf versionで、スクリプトを 評価する際に適用するルールを指定。 現在は0xc0固定で、BIP-342(TapScript)のルー ルが適用される。
tを生成したいずれかのリーフスクリプトを使ってコインをアンロック可能 A B C D E AB = H TapBranch (A + B) CD = H TapBranch (C + D) CDE = H TapBranch (E + CD) ABCDE = H TapBranch (AB + CDE) t = H TapTweak (P + ABCDE) B = H TapLeaf (Leaf version + Script B) の条件を使ってコインをアンロックする場合、 • Script B • 点(公開鍵)P • Script Bがtを構成するリーフの1つであることを証明する AおよびCDEのハッシュ値 • Script Bをアンロック可能な要素 を提供することでコインがアンロック可能になる。 Leaf version(negation bit 含む)、Pおよび各ハッシュ値は Control Blockと呼ばれる1つの要素としてスタック上にプッシュされる。 ※ 公開されるスクリプトは Bのみで、他のアンロック条件は公開される ことがないため、アンロックに必要な公開情報を最小限に留めることが でき、プライバシーの向上、チェーン上のスペースの節約になる。 ※ Control Blockにハッシュ値以外にPath(左右どちら)を表すデータが無いが、これはリーフ、内部ノード含め辞書順にソートされた 形でツリーが構成しているため。計算したノード値と Control Blockのハッシュ値の大小を比較して左右どちらのデータなのか判断している。
スタックから削除される。 ※ annex aは署名時のメッセージに含まれるが、現時点ではそれ以外何も作用しない。 3. スタックに要素が1つだけ残っている場合は、Key-Pathを使用したアンロックとして処理される。 a. 要素は署名として解釈され、公開鍵QとTaprootのメッセージダイジェストに対して有効か検証される。 4. スタックに2つ以上の要素が残っている場合、Script-Pathを使用したアンロックとして処理される。 a. 最後から2つめの要素が評価対象のスクリプト b. 最後の要素がControl Block = [Leaf version(1 byte) & negation bit, P(32 bytes), [hash values]]。 c. Leaf versionを検証 d. スクリプトとP、[hash values]からマークルツリーを復元しtを算出。 e. negation bit & 1 == 1の場合Q = -Qとする。(QはP+tGでY座標を固定できないため) f. 算出したtを使ってQ == P + tGを検証 g. 残りのスタック要素を使ってスクリプトを評価 Control Block Script B ...
TapTweak (P)Gのようなアウトプットを作成するのが推奨される。 敵対者がM = M0 + tGを作成し、他のユーザーの公開鍵Aと集約したInternal Key P = A + Mを作成した場合、 A + M0とPとして提供しtGでScript-Pathによるアンロックが可能になるため。 • 公開鍵宛やマルチシグの送金など Key-Pathは使用せずScript-Pathのみをサポートするする場合、 Pは未知の離散対数を持つ公開鍵とする。 H = point(H(G)) = Gのハッシュ値をx座標とする点。 • P2SHでラップして使うことはできない。 • annexは、将来の拡張用のフィールドで現在は無視される(が、トランザクションダイジェストの計算には使わ れる)ため、現時点ではセットしない方がいい。 • スクリプトからツリーを構成する際は必ずしも、 バランスの取れた二分木にする必要はなく、 条件の使用確率によったハフマンツリーを構成した方が効率的。 C A B t D E