Develop with pleasure!

福岡でCloudとかBlockchainとか。

P2WPKHベースのアカウント導出スキームを定義したBIP-84

HDウォレットでSegwitのアドレスを導出する仕様について、今まではP2SHでネストしたP2WPKHの導出スキームを定義したBIP-49のみだったが↓

techmedia-think.hatenablog.com

今回ネイティブのP2WKHのアドレスをHDウォレットで導出するスキームがBIP-84としてTrezorのPavol Rusnakから提案された。

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

仕様自体はシンプルでP2WPKHのアドレスを導出する区分としてBIP-44のpurposeの階層の値をこのBIPの値84を使った強化導出にするだけで、導出スキーム自体は既存のスキームと変わりない。

概要

このBIPではP2WPKH(BIP-173)のsegregated witnessトランザクションのシリアライゼーションフォーマットを使用するHDウォレットの導出スキームを定義する。

動機

P2WPKHのトランザクションを作る場合、共通の導出スキームを持つ必要がある。これによりユーザーは同じマスタードシードを持つもしくは単一アカウントを異なるHDウォレットでシームレスに扱うことができるようになる。

このBIPと互換性のあるウォレットを使用すれば、ユーザーはsegregated witnessアカウントを検出し適切に処理することが保証される。

考慮事項

BIP-49の考慮事項と同じ。

仕様

このBIPはBIP-32のルートアカウントに基づき、複数の決定性アドレスを導出するために必要な2つのステップを定義する。

公開鍵の導出

このBIPでは、ルートアカウントから公開鍵を導出するためBIP-44やBIP-49で定義されているのと同じアカウント構造を使用するが、トランザクションシリアライズ方法が異なることを示すためpurposeの値に異なる値を使用する点が唯一異なる。

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

パス階層のpurposeには84'を使用する。他の階層はBIP-44とBIP-49と同じものが使われる。

アドレスの導出

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

witness:      <署名> <公開鍵>
scriptSig:    (空)
scriptPubKey: 0 <20バイトの公開鍵ハッシュ>
              (0x0014{20バイトの公開鍵ハッシュ})

拡張鍵バージョン

拡張鍵をシリアライズする際、この方式では、代替version byteを使用する。拡張公開鍵は0x04b24746を使用しzpubというプレフィックスを生成し、拡張秘密鍵0x04b2430cを使用しzprvというプレフィックスを生成する。Testnetでは、0x045f1cf6vpub0x045f18bcvprvを使用する。

追加の登録済みversion byteはSLIP-0132にリストされている。

後方互換

このBIPのには考慮事項に記載されているように後方互換性はない。互換性のないウォレットの場合、対象のアカウントが見つけられず何かおかしいことに気付くでしょう。

Test Vecotr

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

参照BIP

techmedia-think.hatenablog.com techmedia-think.hatenablog.com techmedia-think.hatenablog.com techmedia-think.hatenablog.com