Waves ウォレットを知る

少し詳しくなったWaves Platformについて、
ビットコインなんかではよく紹介されている暗号的な話を真似てみる。

動機

説明はされているが、 正しく理解できなかったのです。
こういうのは動いているものが正なので、実装を追って分かったことをまとめておく。

Base58

その他の暗号通貨、仮想通貨と同じくバイト列の表現にBase58を使用している。
使っているのはビットコインの文字セット(下記)である。

123456789ABCDEFGHJKLMNPQRSTUVWXYzabcdefghijkmnopqrstuvwxyz

アドレスの導出

次の手順でシードからアドレスを導出している

  1. seed の生成
  2. seed から account seed を生成
  3. account seed から秘密鍵を生成
  4. 秘密鍵から公開鍵を生成
  5. 公開鍵からアドレスを生成

seed の生成

seed は任意の長さのバイト列(ただの乱数)。
ライトクライアントではutf-8エンコードされた文字列をseedとしている(ブレインウォレット)。 物理的なバックアップや手入力がしやすいみたい。

account seed を生成

seedの先頭に4バイトの整数(ビッグエンディアン)を付けたもの、のhash chainダイジェスト値が account seed。
付与する整数は基本的には0で、同じseedから複数個のaccount seedを生成する場合、都度増やす。

一つ目: account_seed1 = hash_chain(0x00000000 + seed)
二つ目: account_seed2 = hash_chain(0x00000001 + seed)

フルノードでは複数のアドレスを生成できるが、そのときの生成手段がたぶんこれ。

hash chain

説明では

blake2b256(keccak256(bytes))

と記載されているが、実際は下記(順番が逆)

keccak256(blake2b256(bytes))

別のところではちゃんとこっちで書いてあったので、単なる誤記と思われる。

account seed から秘密鍵を生成

これも 説明では

Curve25519

としか書いてないが、実際は

Curve25519-sha256

とでも言うべきもの。
account seedのsha256ダイジェスト値からcurve25519秘密鍵を生成している。
Wavesフルノードの実装においては下記の通り

  1. WavesフルノードはScorexというブロックチェーンフレームワークを使っている
  2. Scorexの暗号処理はscryptoとしてフレームワークの外に出してある
  3. scryptoのcurve25519実装では、秘密鍵生成関数の中で入力シードのSHA256ダイジェストを計算し鍵生成のシードとしてる

やらかした感をやや感じるのはたぶん気のせい。

秘密鍵から公開鍵を生成

Curve25519での基本仕様。
公開鍵は秘密鍵から生成される。

公開鍵からアドレスを生成

説明の通り、以下を連結したもの。

  1. 0x01
  2. CHIAN-ID (address scheme)
  3. 公開鍵のhash_chainダイジェスト値の先頭20バイト
  4. チェックサム (上記三つのhash_chainダイジェスト値の先頭4バイト)

CHAIN-IDというのは、Mainnetの場合は’W’(0x57)、Testnetの場合は’T’(0x54)となる。
CUSTOMネットとする場合は設定ファイルのaddress-scheme-characterに設定した値とする。

ハッシュ関数補足

BLAKE2 も Keccak もsha-3の公募に提出されたもの。
KeccakがSHA-3として採用され、BLAKE2は最終候補まで残った。
ただし、SHA-3として採用される際に演算パラメータが変更されており、純粋なKeccakとSHA-3は演算結果が異なる。
Wavesが使っているのは、純粋なKeccak。

Keccak、BLAKE2共に公式サイトにリファレンス実装(c言語)が公開されている。

Curve25519補足

Curve25519自体は、Ed25519で使う鍵ペアの生成アルゴリズムという理解で良いのかな?
32バイトのシードから公開鍵と秘密鍵を生成する。

公式サイトに実装がある。

pywavesの中(で使っているcurve25519ライブラリ)では Curve25519については下の実装を使っていた。

Curve25519-SHA256 ?

検索したら、とりあえずこれが見つかった。
SSHにおいて良い方法とし提案されたみたい?

その他

アドレス生成はローカルで完結するので、間違えても大丈夫。
アプリやサービス開発などトランザクションを検証する必要がある場合はCUSTOMたてた方が良いかもね。
Waves(ネイティブ資産)を自由に扱えるし、やり直しも効くので。


See also