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

BIP 49 — P2SH 内包型 P2WPKH アカウントの​導出方​式

BIP: 49
  Layer: Applications
  Title: Derivation scheme for P2WPKH-nested-in-P2SH based accounts
  Authors: Daniel Weigl <DanielWeigl@gmx.at>
  Comments-Summary: No comments yet.
  Comments-URI: https://github.com/bitcoin/bips/wiki/Comments:BIP-0049
  Status: Deployed
  Type: Specification
  Assigned: 2016-05-19
  License: PD

概要

本 BIP は、セグリゲイテッド・ウィットネス(segregated witness)トランザクション向けの P2WPKH-nested-in-P2SH(BIP 141)シリアライズフォーマットを用いる HD ウォレットの導出スキームを定義する。

動機

P2WPKH-nested-in-P2SH(BIP 141)トランザクションを利用するには、共通の導出スキームが必要である。これにより、ユーザーは同一のマスターシードや単一のアカウントを、異なる HD ウォレット間でシームレスに使い回せるようになる。

したがってユーザーは、本 BIP に対応したウォレットのみがそのアカウントを検出し適切に扱えるようにするため、専用のセグウィットアカウントを作成する必要がある。

考慮事項

現行の BIP44 対応ウォレットに対しては、大きく異なる 2 つのアプローチが考えられる。

  1. ユーザーがすでに使用しているアカウントをそのまま使い続けられるようにしつつ、そこにセグウィットでエンコードされたアドレスを追加する。

1.1) BIP44 で定義されたものと同じ公開鍵を用い、通常の P2PKH アドレスに加えて P2SH アドレスもそこから導出する。

1.2) 同じアカウントルートを用いつつ、そこから分岐して異なる外部・内部チェーンのルートを導出し、セグウィットアドレス専用の公開鍵を導出する。

  1. セグウィットアドレス専用の専用アカウントを作成する。

案 1 の解決策には共通の欠点がある。ユーザーが BIP49 対応ウォレットのマスターシードを非 BIP49 対応ウォレットにインポート/復元した場合、アカウントは表示されるかもしれないが、一部の UTXO を見落とす可能性もある。

そのため本 BIP は解決策 2 を採用する。これはより目に見える形で失敗する。アカウントは表示されるか、まったく表示されないかのいずれかである。ユーザーは、異なるウォレットで同じシードを使用した後に残高を確認する必要がない。

仕様

本 BIP は、BIP 32 のルートアカウントに基づいて複数の決定性アドレスを導出するために必要な、2 つの手順を定義する。

公開鍵の導出

ルートアカウントから公開鍵を導出するために、本 BIP は BIP 44 で定義されたものと同じアカウント構造を用いるが、異なるトランザクションシリアライズ方式を示すために異なる purpose 値のみを用いる。

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

purposeパス階層には49'を用いる。それ以外の階層は BIP44 で定義されたとおりに用いる。

アドレスの導出

上で計算した公開鍵から P2SH アドレスを導出するには、BIP 141 で定義されたカプセル化を用いる。

    witness:      <signature> <pubkey>
    scriptSig:    <0 <20-byte-key-hash>>
                  (0x160014{20-byte-key-hash})
    scriptPubKey: HASH160 <20-byte-script-hash> EQUAL
                  (0xA914{20-byte-script-hash}87)

拡張鍵バージョン

拡張鍵をシリアライズする際、本スキームは代替のバージョンバイトを用いる。拡張公開鍵には0x049d7cb2を用いて「ypub」プレフィックスを生成し、秘密鍵には0x049d7878を用いて「yprv」プレフィックスを生成する。テストネットでは0x044a5262「upub」と0x044a4e28「uprv」を用いる。

追加の登録済みバージョンバイトは SLIP-0132 (https://github.com/satoshilabs/slips/blob/master/slip-0132.md) に記載されている。

後方互換性

本 BIP は、上記の考慮事項で説明したとおり、設計上後方互換性を持たない。非対応のウォレットはアカウントをまったく検出できず、ユーザーは何かがおかしいと気づくことになる。

テストベクター

  masterseedWords = abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about
  masterseed = uprv8tXDerPXZ1QsVNjUJWTurs9kA1KGfKUAts74GCkcXtU8GwnH33GDRbNJpEqTvipfCyycARtQJhmdfWf8oKt41X9LL1zeD2pLsWmxEk3VAwd (testnet)

  // Account 0, root = m/49'/1'/0'
  account0Xpriv = uprv91G7gZkzehuMVxDJTYE6tLivdF8e4rvzSu1LFfKw3b2Qx1Aj8vpoFnHdfUZ3hmi9jsvPifmZ24RTN2KhwB8BfMLTVqaBReibyaFFcTP1s9n (testnet)
  account0Xpub = upub5EFU65HtV5TeiSHmZZm7FUffBGy8UKeqp7vw43jYbvZPpoVsgU93oac7Wk3u6moKegAEWtGNF8DehrnHtv21XXEMYRUocHqguyjknFHYfgY (testnet)

  // Account 0, first receiving private key = m/49'/1'/0'/0/0
  account0recvPrivateKey = cULrpoZGXiuC19Uhvykx7NugygA3k86b3hmdCeyvHYQZSxojGyXJ
  account0recvPrivateKeyHex = 0xc9bdb49cfbaedca21c4b1f3a7803c34636b1d7dc55a717132443fc3f4c5867e8
  account0recvPublicKeyHex = 0x03a1af804ac108a8a51782198c2d034b28bf90c8803f5a53f76276fa69a4eae77f

  // Address derivation
  keyhash = HASH160(account0recvPublicKeyHex) = 0x38971f73930f6c141d977ac4fd4a727c854935b3
  scriptSig = <0 <keyhash>> = 0x001438971f73930f6c141d977ac4fd4a727c854935b3
  addressBytes = HASH160(scriptSig) = 0x336caa13e08b96080a32b5d818d59b4ab3b36742

  // addressBytes base58check encoded for testnet
  address = base58check(prefix | addressBytes) = 2Mww8dCYPUpKHofjgcXcBCEGmniw9CoaiD2 (testnet)

参考文献

  • BIP16 - Pay to Script Hash
  • BIP32 - Hierarchical Deterministic Wallets
  • BIP43 - Purpose Field for Deterministic Wallets
  • BIP44 - Multi-Account Hierarchy for Deterministic Wallets
  • BIP141 - Segregated Witness (Consensus layer)

著作権

本文書はパブリックドメインに置かれる。