※noteの転記です。
この記事を書いている時点のLiskのパスフレーズからアドレスを生成する仕組みを記載しています。
既存の方法ではアドレス衝突の危険性が指摘されていますが、直近で問題になることはないので安心してください。
また、これについてはロードマップに変更予定が記載されています。
※Development Roadmap > Network Longevity > Replace address system
BIP39を使用しています。
BIP39のワードリストには言語ごとに2048ワードあります。
なので、12ワードのパスフレーズのパターンは重複含めると2048^12あることになります。
が、実際には12ワードの場合は128bitのエントロピーから生成されます。(ちなみに24ワードだと256bit)
鍵生成にはed25519を使用しています。
BIP39で作成されたパスフレーズをそのままSHA256でハッシュ化し、それをed25519を使って鍵生成する流れ。
例:パスフレーズが以下の場合
chicken problem whip mobile shield angry hard toast disease chronic code category
1. SHA256でハッシュ化
[結果]
32 18 0f 8e a1 80 7f f1 b0 11 dc 4e 88 48 0c 14 5b a1 de 5a d0 82 31 73 25 72 56 67 b1 bf 43 64
2. ed25519で鍵生成
[結果] ※公開鍵のみ記載
26 e0 a6 95 a2 96 a3 c2 43 98 92 59 66 65 92 17 8b 77 f0 8b 66 7b 65 e2 e5 f1 e9 c2 09 2b db 8c
ed25519で作った公開鍵をSHA256でハッシュ化した値の頭8バイトを取得。
それをひっくり返して10進数に変換した値にLを付ける流れ。
例:公開鍵が以下の場合
26 e0 a6 95 a2 96 a3 c2 43 98 92 59 66 65 92 17 8b 77 f0 8b 66 7b 65 e2 e5 f1 e9 c2 09 2b db 8c
1. 公開鍵をSHA256でハッシュ化
[結果]
f9 eb 38 75 59 65 31 36 07 94 f2 84 f5 f1 5e 67 02 6d e0 87 c6 87 45 c0 0f 55 5b 30 83 7d 0a 89
2. 頭8バイトを取得
[結果]
f9 eb 38 75 59 65 31 36
3. リバース
[結果]
36 31 65 59 75 38 eb f9
4. 10進数に変換
[結果]
3905013786800090105
5. 末尾にLを付与
[結果]
3905013786800090105L
1. BIP39でパスフレーズを生成
2. 生成したパスフレーズをSHA256でハッシュ化
3. ed25519で鍵(公開鍵&秘密鍵)を生成
4. 生成した公開鍵をSHA256でハッシュ化
5. ハッシュ化した値の頭8バイト取得
6. 取得した8バイトの値をリバース
7. 10進数に変換
8. 末尾にLを付与
という流れになります。
以上!