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では、0x045f1cf6
でvpub
、0x045f18bc
でvprv
を使用する。
追加の登録済み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