HD Walletは一つのMnemonicから複数通貨、複数アドレスの秘密鍵、公開鍵を扱うのに非常に便利な仕組みです。HDWalletの仕組みはBIP32で定義されており、複数種類の通貨を扱う仕組みはBIP44で定義されています。
BIP44では下記のように鍵を導出するパスに役割を持たせています。
m / purpose’ / coin_type’ / account’ / change / address_index
先頭の小文字mは秘密鍵、purposeはどのBIPに従うか設定し、coin_typeはSLIP-0044で定義されている通貨別の値を使います。
accountは基本的に複数の人用に使わなければ0を使い、changeはお釣りアドレスなら1、そうじゃなければ0を使います。address_indexは0から使用し、一度受け取りを行ったら1づつ増やして同じアドレスを使用しないようにします。
こうすることで複数通貨、複数アドレスを1つのMnemonicから導出することができます。次はNested SegWitとNative SegWitをHD Walletでどう扱うか解説します。
SegWitについては下記リンクを参照してください。
Nested SegWit
正式なSegWit実装でないHD Walletの実装にはBIP49を使用します。レガシーアドレスを使ったHD Walletの実装ではBIP44をそのまま使いますが、P2PKHとは送金と受け取りのロジックが異なるためHD Walletのパスを変更します。
BIP49ではP2WPKH nested in P2SHを対象としています。基本的にはpurposeだけ49`になり他はp同じです。P2WPKHをP2SHでラップするだけなので、アドレスは3始まりのP2SHアドレスになります。
アドレスを生成するときは下記scriptPubKeyに含まれる公開鍵ハッシュ20バイトをBech32のアドレスフォーマットに沿って生成します。
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)
Native SegWit
Native SegWitはSegWitの正規実装のことです。上記Nested SegWitのときと同様にNative SegWitはNested SegWitとアドレスフォーマットが異なるのでBIP84に従います。
アドレスを生成するときは下記scriptPubKeyに含まれる公開鍵ハッシュ20バイトをBech32のアドレスフォーマットに沿って生成します。
witness: <signature> <pubkey> scriptSig: (empty) scriptPubKey: 0 <20-byte-key-hash> (0x0014{20-byte-key-hash})
Bech32のアドレスフォーマットは下記リンクを参照してください。
髙妻智一
最新記事 by 髙妻智一 (全て見る)
- Polkadot(Substrate)のアドレスとトランザクションについて - 2023-03-09
- 【無料公開】「Goで始めるBitcoin」3章 Bitcoinノードとの通信 技術書典8 - 2020-03-08
- エンジニアがゼロから技術ブログを書くための方法をまとめました - 2019-05-25
コメントを残す