LISKの秘密鍵と公開鍵、アドレス生成方法とHD Walletについて




どうも高妻です。Twitterでプログラミングのことや暗号通貨のことをつぶやいているのでよかったらフォローしてください。  

Liskで使われる楕円曲線暗号 ed25519

Liskではed25519という楕円曲線暗号を使って、秘密鍵から公開鍵を生成します。

BitcoinとBitcoinからハードフォークしたBitcoinCash、LiteCoinなどはsecp256k1という別の楕円曲線暗号が使われています。

Lisk公式ドキュメントによる秘密鍵と公開鍵の生成方法

BIP39のMnemonicをSHA256でハッシュ化し、そのハッシュ値から秘密鍵と公開鍵を生成します。特徴的なのはMnimonicを直接ハッシュ化するところですかね。

BIP32のHD Walletの場合、seedというMnemonicとお互いに相互変換可能な値から鍵を生成します。

Liskの残高管理はEthereumと同じアカウントベースなのでHD Walletを意識した生成にはなっていないからだと思います。

https://lisk.io/documentation/lisk-protocol/security

この生成処理はlisk-elementsという公式リポジトリで実装されています。関数は下記です。

https://github.com/LiskHQ/lisk-elements/blob/development/src/cryptography/keys.js#L19

実際の処理はtweetnaclというライブラリが処理しています。v1.0.0より前ではjs-naclが使われていましたが、メンテナンスがされていないことと、React Nativeと互換がないため変更されたみたいです。

https://github.com/LiskHQ/lisk-elements/pull/687

アドレスの生成

Liskのアドレスは数字と最後につく大文字のLで構成されます。長さもLを含めて21文字以下となります。

アドレスは公開鍵をSHA256でハッシュ化した値の最初の8バイトを逆にした値の最後に大文字のLを付けたものがアドレスになります。

生成処理は下記lisk-elementsの関数になります。

https://github.com/LiskHQ/lisk-elements/blob/development/src/cryptography/convert.js#L60

LiskのHD Wallet実装について

LiskをBIPT32とBIP44に従ったHD Walletを実装しようとしているリポジトリがあります。これはLisk Coreの中の人など有志でやってるみたいです。

https://github.com/lisk-builders/lisk-hd-key

しかし、この実装は完璧にはBIP44に従っている訳ではないので注意しなければいけません。

issueでも指摘されていますが、derivation pathが全て強化鍵で生成されています。実際の実装を見てもそうなっているので2018年7月時点では確かです。

正確にはこのリポジトリで鍵生成の処理を行なっている訳ではなく、使用している下記ライブラリがそうなっているからですね。

https://github.com/alepop/ed25519-hd-key

このライブラリもBIP44を参考にしているだけで、SLIP-0010に従って実装しているので間違いではないです。

結論として、BIP44のchangeパス以下を拡張鍵になるように実装すればいいんですが、今の所LiskのHD Walletに需要がなさそうなので対応は遅れそうです。

必要になれば自分が実装するので欲しくなったら自分にメッセージください!

The following two tabs change content below.

高妻智一

2013年CyberAgent新卒入社 スマホゲームを作る子会社に所属し、サーバーサイドのエンジニアを担当。2年目の終わりから新規子会社の立ち上げに参加し、サーバーサイドのエンジニアリーダーとしてサービースのリリースから運用までを担当。 現在はTwitterなどSNSのテキスト解析を行うソーシャルメディア分析のサーバーサイドを開発中。言語はNode.js、Kotlinを使用。






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



コメントを残す

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