Mastering Ethereum

前回(4章 暗号)

5章 ウォレット

  • 概要
  • 非決定性(ランダム)ウォレット
  • 決定性(シード)ウォレット
  • HDウォレット
  • BIP系

「イーサリアムウォレットはイーサやトークンを保管してる?」

 

 

「いや、鍵を保管(管理)してるだけだよ」

非決定性ウォレット

k = f8f8a2f43c8376ccb0871305060d7b27b0554d2ccf41b2705608452f315

作成された個々の鍵はお互いに関連を持たない

毎回生成

鍵(秘密鍵)は乱数から独立して生成

16進数でランダムに生成した秘密鍵(k)の例

(256bitを4bit毎に16進数エンコードされた64桁)

キーストア(keystore)、ランダムに生成された秘密鍵が1つ含まれるjson encode file。passphraseで暗号化

非決定性ウォレットは、「使い捨て」のような方法で新しいアドレス毎に新しいウォレットファイルを作成するため、取り扱いが面倒

{
    "address": "001d3f1ef827552ae1114027bd3ecf1f086ba0f9",
    "crypto": {
        "cipher": "aes-128-ctr",
        "ciphertext":
            "233a9f4d236ed0c13394b504b6da5df02587c8bf1ad8946f6f2b58f055507ece",
        "cipherparams": {
            "iv": "d10c6ec5bae81b6cb9144de81037fa15"
        },
        "kdf": "scrypt",
        "kdfparams": {
            "dklen": 32,
            "n": 262144,
            "p": 1,
            "r": 8,
            "salt":
                "99d37a47c7c9429c66976f643f386a61b78b97f3246adca89abe4245d2788407"
        },
        "mac": "594c8df1c8ee0ded8255a50caf07e8c12061fd859f4b7c76ab704b17c957e842"
    },
    "id": "4fcb2ba4-ccdb-424f-89d5-26cce304bf9c",
    "version": 3
}

試行するパスフレーズ毎に262,144回のハッシュを適用して確認しなくてはいけなくなる(例)

総当たり/辞書攻撃、レインボーテーブル攻撃から防御

パワーストレッチングアルゴリズムの鍵導出関数(KDF)を使用

キーストア形式

端的には秘密鍵はパスフレーズで直接暗号化はされない

決定性ウォレット

シードのバックアップがあれば、ウォレット内の全ての資金とスマートコントラクトを保護できる(ウォレットのインポートとエクスポートに最適で異なるウォレット間での鍵の移行が容易)

インデックス番号または「チェーンコード」等の他のデータと組み合わせて複数の秘密鍵を生成

シードは、ランダムに生成された数値

全て1つのマスター鍵もしくはシードから導出された秘密鍵が入ったウォレット

シードがあれば生成した全ての鍵を復元可能

元のシード(seed)があれば、再び鍵を生成することが可能

ウォレット内の全ての鍵は互いに関連

全ての鍵はシード(seed)と呼ばれる1つのマスター鍵から生成される

決定性ウォレットには鍵の導出(key derivation)方法が
いくつかある

ツリー構造から導出された鍵がHDウォレットには含まれる

ビットコインのBIP-32標準で定義されている階層的決定性(HD)ウォレットが決定性ウォレットとして最も標準

階層的決定性(HD)ウォレット(BIP-32/BIP-44)

親鍵が子鍵群を生成、各子鍵は孫鍵群を生成 -> 鍵の生成の連鎖

2. ユーザーが対応する秘密鍵にアクセスすることなく公開鍵群を生成することができる

1. ツリー構造を用いることで用途を使い分けられる

メリット

3. 復元/移行が容易

正しい順序でwordをまとめると秘密鍵を一意に再生成できる、一連の単語を使用する

安全なバックアップと復元のため、秘密鍵をエンコードする方法

シードとニーモニックコード(BIP-39)

ニーモニック(mnemonic)

BIP-39で標準化されている

元のシード(seed)があれば、再び鍵を生成することが可能

決定性ウォレットを生成するシードとして使用される乱数をエンコードした単語のリストのこと

ニーモニックコードワード(BIP-39)

実際にウォレットアプリを入れてみる(例)
初期設定時に12〜24個の単語のリストを出力
可読性やバックアップの点で利便性

BIP-39はニーモニック標準の実装方式の一つ(他にもある)

BIP-39の標準化プロセスでウォレットにより自動的に生成

ニーモニックワードの生成

エントロピー源から始まり、チェックサム追加、単語のリストにマッピング

ニーモニックワードは128〜256bitの長さを持つエントロピー

ニーモニックワードからシードの生成

鍵ストレッチ関数PBKDF2を用いてより長い(512bit)シードを導出するために使用

端的には、
鍵は拡張可能、拡張「親」鍵から「子」鍵を導出できる

HDウォレット(BIP-32)とPath(BIP-43/44)

ほとんどのHDウォレットはBIP-32規格に準拠

鍵が持つツリー構造の階層関係、拡張鍵と強化鍵

鍵の拡張には、鍵自体とチェーンコードを追加する

チェーンコードは、子鍵を生成するために各鍵と混合される256bitのバイナリ文字列

子の公開鍵の生成には、

1. 子の秘密鍵から直接生成する

2. 親の公開鍵から生成するか

の2種類

HDウォレット、秘密鍵を使わずに親の公開鍵から子の公開鍵を生成できる、有用な特徴

よって、拡張公開鍵を用いることで、HDウォレットの持つブランチにある全ての公開鍵(公開鍵のみ)が取得可能

強化子公開鍵の導出(通常と強化導出)

HDウォレット鍵識別子(path)

HDウォレット内の鍵はpathの命名規則により識別

ツリーの階層レベルはスラッシュ(/)文字で区切り

BIP-33とBIP-44でHDウォレットのツリー構造に関する標準等がある

Mastering Ethereum (第5章)

By Akira Tamai

Mastering Ethereum (第5章)

  • 47