Develop with pleasure!

福岡でCloudとかBlockchainとか。

P2TRの鍵導出仕様を定義したBIP-86

Taprootのアクティベートに向けて、単一の鍵でPay to Taproot(P2TR)にコインをロックする際の、鍵の導出仕様がBIP-86として定義された↓

https://github.com/bitcoin/bips/blob/master/bip-0086.mediawiki

単一の鍵なので、対象はTaprootのKey-Path使うケースで、鍵の導出仕様はこれまでのBIP-44(P2PKH), 49(P2SH-P2WPKH), 84(P2WPKH)と基本的に同じ。

HDウォレットでTaprootのInternal Keyを導出し、(BIP-341で推奨されているように)Script-PathによるアンロックができないようにそのInternal KeyのハッシュからScript-Path側の鍵を導出して、その2つの鍵を加算して、P2TRのscriptPubkeyを導出する方法になってる。

以下、BIPの意訳。

概要

このドキュメントは、TaprootのInternal Keyとして単一鍵のP2TR(BIP341)のアウトプットに関与する鍵を持つHDウォレットの導出方式を提案する。

動機

単一鍵のP2TRトランザクションを使用する場合に、共通の導出方式があると便利で、HDシードのバックアップのみを持つHDウォレットが単一鍵のTaprootアウトプットをリカバリーできるようになる。現在では、特定のスクリプトタイプに対して固定の導出パスを必要としないソリューションがあるが、多くのソフトウェアやハードウェア署名者は、導出パスやスクリプトの情報がないシードのバックアップを使用している。そのため、実装を容易にするため、BIP49およびBIP84で使用されているのと同じアプローチを主に使っている。

仕様

このBIPは、BIP32のマスター秘密鍵を基に複数の決定論的アドレスを導出するために2つのステップを定義する。

公開鍵の導出

ルートアカウントから公開鍵を導出するために、このBIPは、BIP44, 49, 84で定義されているものと同じアカウント構造を使用するが、purposeスクリプトタイプが異なる。

m / purpose' / coin_type' / account' / change / address_index

purposeパスの階層では86'を使用する。残りの階層はBIP44, 49, 84で定義されているものを使用する。

この導出パスパターンで導出した鍵は、このドキュメントではderived_keyと呼ぶ。

アドレスの導出

BIP341には、「使用条件にScript-Pathが必要ない場合、アウトプットの鍵は、Script-Pathが無い状態ではなく、使用できないScript-Pathにコミットする必要がある。これはアウトプットの鍵の点をQ = P + int(hashTapTweak(bytes(P)))Gとして計算することで実現できる」と記されている。したがって、

internal_key:       lift_x(derived_key)
32_byte_output_key: internal_key + int(HashTapTweak(bytes(internal_key)))G

トランザクションスクリプトとwitnessは、BIP341で定義されているとおり

witness:      <署名>
scriptSig:    (空)
scriptPubKey: 1 <32_byte_output_key>
              (0x5120{32_byte_output_key})

後方互換

このBIPは、設計上、後方互換性はない。互換性のないウォレットは、これらのアカウントを検出せず、ユーザーは何かが間違っていることに気づくだろう。

しかし、このBIPはBIP 44, 49, 84で使用されているのと同じ方法を使用するため、実装は難しくない。

Test Vector

BIP参照