NEMのコールドウォレットは難しいのか

[mathjax]

コインチェックからのNEM流出事件が発生し、ネットは大騒ぎです。

ビットコイン取引所「コインチェック」で620億円以上が不正に引き出される被害が発生(追記あり)

「NEM」は、中国製チャットアプリ「WeChat」や中国での取引所で兌換できる仕組みを有しており、もともと中華圏からの不正なアクセスが多い暗号通貨のひとつとされてきました。

このような非常に質の低い記事が「識者」から出てくる始末です。

さて、事件が発生した一因として、コインチェックはNEMをコールドウォレットではなくホットウォレットに保管していた、ということがよく言われます。

ではホットウォレットとはなんなのか、コールドウォレットとはなんなのか。調べても曖昧な説明が多かったので、ご紹介したいと思います。

ホットウォレット

まずはホットウォレットから。ホットウォレットとは、インターネットに接続されている環境に秘密鍵を保存したウォレットのことです。狭義では常時インターネット接続されたサーバーに秘密鍵を保存しているウォレットがこれにあたりますが、広義ではインターネットに接続されてるみなさんのPCやスマートフォンで使っているウォレットもこれにあたります。

ホットウォレットを入れている端末がインターネット経由で不正アクセス(ウイルス侵入等)を受け、秘密鍵が流出する可能性が排除できないのが、コールドウォレットより安全性に劣るといわれている理由です。

ホットウォレットは、ウェブウォレットとは違う概念です。

コールドウォレット

コールドウォレットとは、インターネットから隔離された環境に秘密鍵を保存したウォレットです。紙に秘密鍵の情報を保存するペーパーウォレットがこれにあたります。

インターネットに接続していない環境にウォレットを保存して、どうやってインターネット上のブロックチェーンにアクセスすんねんと思う方もいるでしょう。その通りです。

これを理解するには、そもそも秘密鍵、公開鍵、アドレスとはなんなのかを理解する必要があります。

秘密鍵

秘密鍵とはなんなのかというと、これはただのランダムに決められたバイト配列です。意外かもしれませんが、そうなんです。UUIDと同じく、確率的に衝突しないことが保証されたただの乱数です。

送金にデジタル署名を施すのに使います。流出してはいけません。

公開鍵

公開鍵とは、ビットコインやNEMなどにおいては、特定の楕円曲線暗号アルゴリズムにおいてある秘密鍵と対応する鍵のことです。ビットコインにおいては、楕円曲線としてSecp256k1を、NEMにおいては楕円曲線としてEd25519を採用しています。

Secp256k1: $$y^2=x^3+7$$

Ed25519: $$-x^2+y^2=1-\frac{121665}{121666} x^2 y^2$$

上述の秘密鍵を用いて施されたデジタル署名を検証するのに使います。公開しても、公開鍵から秘密鍵を導出することはできないので、問題ありません。

アドレス

アドレスとは、NEMにおいては公開鍵、ネットワークの種類といった情報をまとめたバイナリデータのハッシュ値を加工したものを、Base32エンコードしたものです。ビットコインも概要は同じです。

ブロックチェーン上では、送金に施されたデジタル署名を送金に添付された公開鍵を用いて検証したあと、添付された公開鍵からアドレスを導出することによって、アドレスと送金の紐付けをするわけです。

秘密鍵を生成さえすれば、公開鍵、アドレスは暗号学的に求めることが可能です。

話を戻します

コールドウォレットはどう使うのかという話に戻します。

秘密鍵は、送金の本人確認をするための署名に必要なわけです。となると、署名されたデータをネットワーク上に送信さえできれば、署名の生成はオフラインでも良いわけです。

もうお分かりだと思います。コールドウォレットは、署名をオフラインで生成し、何らかの方法でインターネット接続された端末に署名データを送り、ネットワークに送信することによって送金するわけです。

NEMはビットコインよりオフライン処理が難しいことが事件の一因であるという説もみかけましたが、Secp256k1とEd25519との違いはあれど、どちらもライブラリはありますので、その説は疑わしい可能性が高いといえるでしょう。一番難しいのは署名データをオフライン環境からオンライン環境に移すことであり、これはビットコインもNEMも変わりません。

ホットウォレット、コールドウォレットへの理解の普及につながれば幸いです。