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に需要がなさそうなので対応は遅れそうです。

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

おすすめ書籍

ビットコインとブロックチェーンの詳細をしっかりと学びたい方にはこちらの書籍が非常におすすめです。ウォレットの仕組み、楕円曲線暗号、P2Pプロトコル、公開鍵暗号などビットコインを支える技術について詳細に解説されています。また、サンプルコードを通して実際に手を動かして学べるので非常に濃い内容となっています。

こちらはブロックチェーンの初学者向けになります。ブロックチェーンの応用例の紹介から基礎的な理論まで分かりやすく図解で解説されています。また、ビットコインやEthereum、HyperLdger Fabricを実際に稼働させてみて動作を理解するためのサンプルコードの解説もあります。

The following two tabs change content below.

高妻智一

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






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



コメントを残す

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