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) BIP44で定義されたものと同じ公開鍵を用い、通常のP2PKHアドレスに加えてP2SHアドレスもそこから導出する。
1.2) 同じアカウントルートを用いつつ、そこから分岐して異なる外部・内部チェーンのルートを導出し、セグウィットアドレス専用の公開鍵を導出する。
- セグウィットアドレス専用の専用アカウントを作成する。
案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)
著作権
本文書はパブリックドメインに置かれる。
