RippleでBIP44 HDWALLETを作成する
ledger wallet nano sでbip44ウォレットを使っていたのでニーモニックからアドレスを復元する互換ライブラリを開発してみた
この方法で作成されたリップルアドレスにはシークレットキーが存在しないのでシークレットキーを利用したサービスが利用できないので注意する必要がある
用意
npm で以下のモジュールをインストール
- bip39
- ripple-bip32
bip39は乱数の初期化ベクトル作るだけの仕組みでビットコイン全く関係ないからビットコインのモジュールそのまま使える
BIP仕様
- https://github.com/bitcoin/bips/blob/master/bip-0032.mediawiki
- https://github.com/bitcoin/bips/blob/master/bip-0039.mediawiki
- https://github.com/bitcoin/bips/blob/master/bip-0044.mediawiki
コイン種別
- コイン種別は144
- satoshilabsのslip-44で追加されている
- https://github.com/satoshilabs/slips/blob/master/slip-0044.md
サンプルコード
var bip39 = require('bip39');
var bip32 = require('ripple-bip32')
var mnemonic = 'armed bundle pudding lazy strategy impulse where identify submit weekend physical antenna flight social acoustic absurd whip snack decide blur unfold fiction pumpkin athlete';
var password = '';
var masterseed = bip39.mnemonicToSeed(mnemonic, password);
var hdnode = bip32.fromSeedBuffer(masterseed);
var getKeyPair = function(hdnode){
return {
"address" : hdnode.getAddress(),
"private" : hdnode.keyPair.getKeyPairs().privateKey,
"public" : hdnode.keyPair.getKeyPairs().publicKey,
}
}
// cointype=144=xrp
// m / purpose' / coin_type' / account' / change / address_index
console.log(getKeyPair(hdnode.derivePath("m/44'/144'/0'/0/0")))
console.log(getKeyPair(hdnode.derivePath("m/44'/144'/0'/0/1")))
利用場面
- 共通のカギから個別入金アドレス生成(destination_tagを普通は利用するのでニーズは低い)
- ledger walletのアドレスを復元
- https://www.ledgerwallet.com/r/f750?path=/products/ledger-nano-s%C2%A0%E2%80%A6
残高確認やトランザクションの送信
- ripple-libでrippledにつないでwebsocket経由でおこなう
- トランザクションの署名はbip32で作ったアドレスはripple-libのsecretkeyと互換性がないので別途ripple-sign-keypairsをインストールして署名する必要がある
関連ページ
なぜbip32で生成するとrippleのsecretkeyと互換性がないか
BIP32
mnemonic + password -> seed -> xprv -> privatekey -> wif
+-> xpub -> publickey -> address
ripple(AccountFamily)
secretkey -> privategenerator -> privatekey
+-> publicgenerator -> publickey -> address
上記図からsecretkeyと呼んでいるものはbitcoinにおけるseedとなっていてアドレスに対応した秘密鍵ではないことがわかる