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

BIP 84 — P2WPKH ベースの​アカウントの​ための​導出方​式

BIP: 84
  Layer: Applications
  Title: Derivation scheme for P2WPKH based accounts
  Authors: Pavol Rusnak <stick@satoshilabs.com>
  Comments-Summary: No comments yet.
  Comments-URI: https://github.com/bitcoin/bips/wiki/Comments:BIP-0084
  Status: Deployed
  Type: Specification
  Assigned: 2017-12-28
  License: CC0-1.0

概要

本 BIP は、SegWit トランザクションの P2WPKH(BIP 173)シリアライズ形式を用いる HD ウォレットの導出方式を定義する。

動機

P2WPKH トランザクションを使うには、共通の導出方式が必要である。 これにより、ユーザーは同じマスターシードや単一のアカウントを、異なる HD ウォレット間でシームレスに使い回せるようになる。

したがってユーザーは、SegWit 専用のアカウントを作成する必要がある。これにより、本 BIP に対応したウォレットだけがそのアカウントを検出し、適切に扱えるようになる。

考慮事項

本 BIP は、BIP 49 の「考慮事項」節に述べられているものと同じ論拠を用いる。

仕様

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

公開鍵の導出

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

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

purpose パスレベルには 84' を用いる。それ以外のレベルは BIP44 または BIP49 で定義されているとおりに用いる。

アドレスの導出

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

witness:      <signature> <pubkey>
scriptSig:    (empty)
scriptPubKey: 0 <20-byte-key-hash>
              (0x0014{20-byte-key-hash})

拡張鍵バージョン

拡張鍵をシリアライズする際、この方式では代替のバージョンバイトを用いる。拡張公開鍵は 0x04b24746 を用いて「zpub」接頭辞を生成し、拡張秘密鍵は 0x04b2430c を用いて「zprv」接頭辞を生成する。テストネットでは 0x045f1cf6「vpub」と 0x045f18bc「vprv」を用いる。

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

後方互換性

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

テストベクトル

  mnemonic = abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about
  rootpriv = zprvAWgYBBk7JR8Gjrh4UJQ2uJdG1r3WNRRfURiABBE3RvMXYSrRJL62XuezvGdPvG6GFBZduosCc1YP5wixPox7zhZLfiUm8aunE96BBa4Kei5
  rootpub  = zpub6jftahH18ngZxLmXaKw3GSZzZsszmt9WqedkyZdezFtWRFBZqsQH5hyUmb4pCEeZGmVfQuP5bedXTB8is6fTv19U1GQRyQUKQGUTzyHACMF

  // Account 0, root = m/84'/0'/0'
  xpriv = zprvAdG4iTXWBoARxkkzNpNh8r6Qag3irQB8PzEMkAFeTRXxHpbF9z4QgEvBRmfvqWvGp42t42nvgGpNgYSJA9iefm1yYNZKEm7z6qUWCroSQnE
  xpub  = zpub6rFR7y4Q2AijBEqTUquhVz398htDFrtymD9xYYfG1m4wAcvPhXNfE3EfH1r1ADqtfSdVCToUG868RvUUkgDKf31mGDtKsAYz2oz2AGutZYs

  // Account 0, first receiving address = m/84'/0'/0'/0/0
  privkey = KyZpNDKnfs94vbrwhJneDi77V6jF64PWPF8x5cdJb8ifgg2DUc9d
  pubkey  = 0330d54fd0dd420a6e5f8d3624f5f3482cae350f79d5f0753bf5beef9c2d91af3c
  address = bc1qcr8te4kr609gcawutmrza0j4xv80jy8z306fyu

  // Account 0, second receiving address = m/84'/0'/0'/0/1
  privkey = Kxpf5b8p3qX56DKEe5NqWbNUP9MnqoRFzZwHRtsFqhzuvUJsYZCy
  pubkey  = 03e775fd51f0dfb8cd865d9ff1cca2a158cf651fe997fdc9fee9c1d3b5e995ea77
  address = bc1qnjg0jd8228aq7egyzacy8cys3knf9xvrerkf9g

  // Account 0, first change address = m/84'/0'/0'/1/0
  privkey = KxuoxufJL5csa1Wieb2kp29VNdn92Us8CoaUG3aGtPtcF3AzeXvF
  pubkey  = 03025324888e429ab8e3dbaf1f7802648b9cd01e9b418485c5fa4c1b9b5700e1a6
  address = bc1q8c6fshw2dlwun7ekn9qwf37cu2rn755upcp6el

参照

  • 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
  • BIP141 - Segregated Witness (Consensus layer)
  • BIP173 - Base32 address format for native v0-16 witness outputs