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

この生成処理はlisk-elementsという公式リポジトリで実装されています。関数は下記です。
https://github.com/LiskHQ/lisk-elements/blob/development/packages/lisk-cryptography/src/keys.ts#L42
実際の処理はtweetnaclというライブラリが処理しています。v1.0.0より前ではjs-naclが使われていましたが、メンテナンスがされていないことと、React Nativeと互換がないため変更されたみたいです。
https://github.com/LiskHQ/lisk-elements/pull/687
アドレスの生成
Liskのアドレスは数字と最後につく大文字のLで構成されます。長さもLを含めて21文字以下となります。
16009998050678037905L
アドレスは公開鍵をSHA256でハッシュ化した値の最初の8バイトを逆にした値の最後に大文字のLを付けたものがアドレスになります。
生成処理は下記lisk-elementsの関数になります。
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を実際に稼働させてみて動作を理解するためのサンプルコードの解説もあります。
髙妻智一
最新記事 by 髙妻智一 (全て見る)
- Polkadot(Substrate)のアドレスとトランザクションについて - 2023-03-09
- 【無料公開】「Goで始めるBitcoin」3章 Bitcoinノードとの通信 技術書典8 - 2020-03-08
- エンジニアがゼロから技術ブログを書くための方法をまとめました - 2019-05-25
コメントを残す