ハードウェアウォレットの引っ越し（或いは、HDウォレットのアドレスを見失わない方法）

# 前置き

なんらかの理由で、ハードウェアウォレットで管理しているWalletアドレス（以下単にアドレスという）を他の方法で管理したかったり、ハードウェアウォレット間で移動したかったりする場合がある。
そんなとき「基本的にはニーモニックフレーズさえなくさなければ問題ないよな」と思うのだが、MyEtherWallet（MEW）に接続してアドレスを確認すると、特に番号の振っていない大量のアドレスが表示されるので「媒体を移動したりすると、表示順が変わったりしてお金の入ってるアドレスが発見できなくなって詰むのでは？」と思ったことがある。今ではその心配はなくなったが、心配がなくなるまでの経緯を思い出してみる。


# いろいろな方法でアドレス確認

## Ledgerデスクトップアプリ

ハードウェアウォレットのLedgerNanoSをLedgerのデスクトップアプリで開くと、唯一つのアドレスが表示される。

<img width="200" alt="スクリーンショット 2018-06-22 14.12.32.png" src="https://qiita-image-store.s3.amazonaws.com/0/254378/e6320e89-09d6-a546-7b2b-90d7d8a1743d.png">

## MyEtherWallet（MEW）＋LedgerNanoS

同じNanoSをMEWに接続してみると

![スクリーンショット 2018-06-22 14.18.07.png](https://qiita-image-store.s3.amazonaws.com/0/254378/73171c55-95ed-5da8-d1d4-a897d7228bdb.png)



いちばん上に、Ledgerのデスクトップアプリで表示されていたアドレスが出てくる。
（「さらにアドレスを表示」を押すと、際限なくアドレスが5個ずつ表示される。）
LedgerNanoSで管理されている無数のアドレスにはインデックスが付いているので、順番がごっちゃになってお金を入れたアドレスがどこにいったかわからなくなる、ということはない。
先ほどのデスクトップアプリでは、ある特定のパスにあるインデックスが0のアドレスを表示する仕様になっているようだ。

## MyEtherWallet（MEW）＋ニーモニックフレーズ

次に、同じNanoSのニーモニックフレーズ（Ledgerではリカバリーフレーズと呼ばれている）をMEWに入力し、アドレスを表示してみる。

![スクリーンショット 2018-06-22 14.24.02.png](https://qiita-image-store.s3.amazonaws.com/0/254378/8ab98bcf-2c2f-5608-33ae-67600a988ad9.png)


表示されているアドレスがさっきと違うので一瞬びびるが、HD derivation pathが違っているので、それをさっきと同じ「m/44'/60'/0'」にしてあげると

![スクリーンショット 2018-06-22 14.18.07.png](https://qiita-image-store.s3.amazonaws.com/0/254378/50f4eb8a-d0f8-9030-2afc-c809ed70c426.png)



先ほどと同じアドレス群が表示されるので安心する。

## Mnemonic Code Converter

お次は、以下の「Mnemonic Code Converter」というサイトで、アドレスを確認してみる。
https://iancoleman.io/bip39/

NanoSで生成されたニーモニックフレーズを入力して

![スクリーンショット 2018-06-22 14.39.44.png](https://qiita-image-store.s3.amazonaws.com/0/254378/a47f7a59-9859-0822-7e0b-08fb7d8d89e4.png)


アドレスを表示すると
……全然違うアドレス群が表示されるが（スクショは割愛）、先ほどと同じ過ちは犯さないということで、derivation pathを確認。
「m/44'/0'/0'/0/0」となっている。
なるほど、これはBIP44の規格で、LedgerNanoSはBIP32の規格を利用しているのだった。

（デスクトップアプリではBIP44は使用していない、という旨がLedgerのdocumentに書いてある。以下のWarning参照。）
http://ledger.readthedocs.io/en/latest/background/hd_use_cases.html#coin-types

「Mnemonic Code Converter」ではデフォでBIP44のアドレスを表示するようになっているので、BIP32に切り替え、さらにBIP32 Derivation Pathに「m/44'/60'/0'」を入力してアドレスを確認する。
あれ、まだ違う。……「Coin」の設定がBTCになっていたので、ETHに変更する。すると以下が表示された。

![スクリーンショット 2018-06-22 14.54.59.png](https://qiita-image-store.s3.amazonaws.com/0/254378/a1de7c48-a54f-0b89-b80c-6b96e350b00a.png)


たしかに、先ほどと同じアドレス群が表示されている。
デスクトップアプリやMEWではパスは表示されていなかったが、いちばん上の「0xXXXXXXXXXXXXXXXXXXXXXXXXXXX5Ed」というアドレスのパスは「m/44'/60'/0'/0」のようだ。この辺、明示されていないので不安になる。


# 結論

HDウォレットの場合

- ニーモニックフレーズ
- 規格（BIP32, BIP44 or other） 
- derivation path（BIP44規格なら m / purpose' / coin_type' / account' / change / address_index）

を保持しておけばアドレスが一意に定まる。（規格はderivation pathを見ればわかるので、実質ニーモニックフレーズとderivation pathだけとも言える。）
これで、ウォレットの引っ越しも安心して行える。上記さえなくさずに所持しておけば、LedgerNanoSからTrezorに引っ越してもよいし、紙とMEWだけで管理してもよい。（Trezorへの引っ越しも成功したが、スクショ撮り忘れたので今回は割愛。）


# 参考

本記事では省略したが、HDウォレットの仕組みについては一通り知っておくとよいかもしれない。

HDウォレットについてはBIP32
https://github.com/bitcoin/bips/blob/master/bip-0032.mediawiki

ニーモニックフレーズについてはBIP39
https://github.com/bitcoin/bips/blob/master/bip-0039.mediawiki

BIP32の拡張、マルチアカウント化HDウォレットについてはBIP44
https://github.com/bitcoin/bips/blob/master/bip-0044.mediawiki