HD WalletでBitcoinのSegWitアドレスを扱うにはBIP49とBIP84を使う

Bitcoin SegWit




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については下記リンクを参照してください。

BitcoinのSegWitアドレスの種類P2WPKH、P2WSH、P2WPKH nested in P2SHについて

 

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のアドレスフォーマットは下記リンクを参照してください。

BitcoinのSegWitアドレスフォーマットBech32のデータ構造について

The following two tabs change content below.

髙妻智一

2013年CyberAgent新卒入社 スマホゲームを作る子会社に所属し、サーバーサイドのエンジニアを担当。2年目の終わりから新規子会社の立ち上げに参加し、サーバーサイドのエンジニアリーダーとしてサービースのリリースから運用までを担当。 2018年仮想通貨のスマホウォレットを提供するGinco Incにブロックチェーンエンジニアとして入社。






よく読まれている関連記事はこちら




コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です