ビットコイン・インスティテュート

BIP 86 — シングルキー P2TR 出力の​鍵導出

  BIP: 86
  Layer: Applications
  Title: Key Derivation for Single Key P2TR Outputs
  Authors: Ava Chow <me@achow101.com>
  Status: Deployed
  Type: Specification
  Assigned: 2021-06-22
  License: BSD-2-Clause

概要

本書は、HD ウォレットの鍵がシングルキー P2TR(BIP 341)出力において Taproot 内部鍵として用いられる場合の導出方式を提案する。

著作権

本 BIP は 2-clause BSD ライセンスの下で公開される。

動機

シングルキー P2TR トランザクションの利用にあたっては、HD シードのバックアップのみを保有するウォレットでもシングルキー Taproot 出力を復元できるよう、共通の導出方式を持つことが有用である。特定のスクリプトタイプに固定の導出パスを必要としない解決策も現れてはいるが、多くのソフトウェアウォレットやハードウェア署名装置は、依然として導出パスやスクリプト情報を持たないシード形式のバックアップを用いている。そのため、実装を容易にするべく、本書は BIP 49 および 84 で用いられているのとほぼ同じアプローチを踏襲する。

仕様

本 BIP は、BIP 32 のマスター秘密鍵を基点として複数の決定性アドレスを導出するために必要な、2 つの手順を定義する。

公開鍵の導出

ルートアカウントから公開鍵を導出する際、本 BIP は BIP 44、49、84 で定義されているのと同じアカウント構造を用いるが、 スクリプトタイプ用の purpose 値のみが異なる。

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

purpose パスの階層には 86' を用いる。 それ以外の階層は BIP 44、49、84 で定義されているとおりに用いる。

この導出パスパターンで導出された鍵は、以降本書内で derived_key と呼ぶ。

アドレスの導出

BIP 341 は次のように述べている。「支出条件がスクリプトパスを必要としない場合、出力鍵はスクリプトパスを持たない代わりに、使用不能なスクリプトパスにコミットすべきである。これは、出力鍵ポイントを 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

トランザクションにおけるスクリプトとウィットネスは、BIP 341 で定義されているとおりである。

witness:      <signature>
scriptSig:    (empty)
scriptPubKey: 1 <32_byte_output_key>
              (0x5120{32_byte_output_key})

後方互換性

本 BIP は設計上、後方互換性を持たない。 非対応のウォレットはこれらのアカウントを一切検出できず、ユーザーは何かがおかしいと気付くことになる。

しかし本 BIP は BIP 44、49、84 と同じ方式を用いているため、実装が困難になることはないはずである。

テストベクトル

mnemonic = abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about
rootpriv = xprv9s21ZrQH143K3GJpoapnV8SFfukcVBSfeCficPSGfubmSFDxo1kuHnLisriDvSnRRuL2Qrg5ggqHKNVpxR86QEC8w35uxmGoggxtQTPvfUu
rootpub  = xpub661MyMwAqRbcFkPHucMnrGNzDwb6teAX1RbKQmqtEF8kK3Z7LZ59qafCjB9eCRLiTVG3uxBxgKvRgbubRhqSKXnGGb1aoaqLrpMBDrVxga8

// Account 0, root = m/86'/0'/0'
xprv = xprv9xgqHN7yz9MwCkxsBPN5qetuNdQSUttZNKw1dcYTV4mkaAFiBVGQziHs3NRSWMkCzvgjEe3n9xV8oYywvM8at9yRqyaZVz6TYYhX98VjsUk
xpub = xpub6BgBgsespWvERF3LHQu6CnqdvfEvtMcQjYrcRzx53QJjSxarj2afYWcLteoGVky7D3UKDP9QyrLprQ3VCECoY49yfdDEHGCtMMj92pReUsQ

// Account 0, first receiving address = m/86'/0'/0'/0/0
xprv         = xprvA449goEeU9okwCzzZaxiy475EQGQzBkc65su82nXEvcwzfSskb2hAt2WymrjyRL6kpbVTGL3cKtp9herYXSjjQ1j4stsXXiRF7kXkCacK3T
xpub         = xpub6H3W6JmYJXN49h5TfcVjLC3onS6uPeUTTJoVvRC8oG9vsTn2J8LwigLzq5tHbrwAzH9DGo6ThGUdWsqce8dGfwHVBxSbixjDADGGdzF7t2B
internal_key = cc8a4bc64d897bddc5fbc2f670f7a8ba0b386779106cf1223c6fc5d7cd6fc115
output_key   = a60869f0dbcf1dc659c9cecbaf8050135ea9e8cdc487053f1dc6880949dc684c
scriptPubKey = 5120a60869f0dbcf1dc659c9cecbaf8050135ea9e8cdc487053f1dc6880949dc684c
address      = bc1p5cyxnuxmeuwuvkwfem96lqzszd02n6xdcjrs20cac6yqjjwudpxqkedrcr

// Account 0, second receiving address = m/86'/0'/0'/0/1
xprv         = xprvA449goEeU9okyiF1LmKiDaTgeXvmh87DVyRd35VPbsSop8n8uALpbtrUhUXByPFKK7C2yuqrB1FrhiDkEMC4RGmA5KTwsE1aB5jRu9zHsuQ
xpub         = xpub6H3W6JmYJXN4CCKUSnriaiQRCZmG6aq4sCMDqTu1ACyngw7HShf59hAxYjXgKDuuHThVEUzdHrc3aXCr9kfvQvZPit5dnD3K9xVRBzjK3rX
internal_key = 83dfe85a3151d2517290da461fe2815591ef69f2b18a2ce63f01697a8b313145
output_key   = a82f29944d65b86ae6b5e5cc75e294ead6c59391a1edc5e016e3498c67fc7bbb
scriptPubKey = 5120a82f29944d65b86ae6b5e5cc75e294ead6c59391a1edc5e016e3498c67fc7bbb
address      = bc1p4qhjn9zdvkux4e44uhx8tc55attvtyu358kutcqkudyccelu0was9fqzwh

// Account 0, first change address = m/86'/0'/0'/1/0
xprv         = xprvA3Ln3Gt3aphvUgzgEDT8vE2cYqb4PjFfpmbiFKphxLg1FjXQpkAk5M1ZKDY15bmCAHA35jTiawbFuwGtbDZogKF1WfjwxML4gK7WfYW5JRP
xpub         = xpub6GL8SnQwRCGDhB59LEz9HMyM6sRYoByXBzXK3iEKWgCz8XrZNHUzd9L3AUBELW5NzA7dEFvMas1F84TuPH3xqdUA5tumaGWFgihJzWytXe3
internal_key = 399f1b2f4393f29a18c937859c5dd8a77350103157eb880f02e8c08214277cef
output_key   = 882d74e5d0572d5a816cef0041a96b6c1de832f6f9676d9605c44d5e9a97d3dc
scriptPubKey = 5120882d74e5d0572d5a816cef0041a96b6c1de832f6f9676d9605c44d5e9a97d3dc
address      = bc1p3qkhfews2uk44qtvauqyr2ttdsw7svhkl9nkm9s9c3x4ax5h60wqwruhk7

参考文献

  • BIP32 - Hierarchical Deterministic Wallets
  • BIP43 - Purpose Field for Deterministic Wallets
  • BIP44 - Multi-Account Hierarchy for Deterministic Wallets
  • BIP49 - Derivation scheme for P2WPKH-nested-in-P2SH based accounts
  • BIP84 - Derivation scheme for P2WPKH based accounts
  • BIP341 - Taproot: SegWit version 1 spending rules