Blow Up by Black Swan

仮想通貨ウォレット①〜仕組み〜

1月26日に仮想通貨を賑わす、衝撃の事件が起こりました。
史上最高額のハッキング被害!!

私もコインチェックにいくばくか入れていたので、かなり衝撃を受けました。ただ、私の場合そもそもの取引方針が、以前の投稿にも書いた様に、損を被っても良い金額だったので、背筋がぞっとするような経験をしたわけではないですが・・・

しかし、事件当日、ツイッターや会見などを見ながら情報収集をしながら、コインチェックがこのまま潰れるかもしれないと感じ、1つの時代が過ぎ去った様な感覚を覚え、一抹の寂しさを感じたりもしました。翌日は、全額、自己資金で補償することを公表しましたが。笑

私も仮想通貨への投資しながら、取引所に預けっぱなし、ウォレットについてはよくわからない、というタイプだったのですが、今回の事件でその認識の甘さを感じ、改めてウォレットとはなんぞや、そしてどういう仕組みになっているのか、ということを調べてみました。色々と自分なりに調べ、まとめていったら分量が多くなったので、2回に分けて投稿します。ただ、ウォレットの分野については、優れたブログ記事がいくつもあるので、そちらのサイトを主として参考にしていただくのが良いのかなとも思ってます。笑

仮想通貨ウォレットとは

仮想通貨ウォレットは、仮想通貨が保存されている「財布」ではなく、秘密鍵、公開鍵、アドレスが保管されている台帳、またはエクセルのようなリストとの認識の方がわかりやすいと思います。この部分がキーポイントとなるウォレットの仕組みを理解するには、基本となる簡単な前提を押さえ、ブロックチェーンでの送金の仕組みから入り、ウォレットの仕組み、ウォレットの構造に入っていくのが、最も分かりやすいと思いますので、この投稿ではそのように説明していきます。

前提

まずは、ウォレットの仕組みや送金の前提となる部分です。

  1. ウォレットに保管されているアドレスは、1つだけでなく複数保管されており、それぞれのアドレスの値は
    ランダムで関係性がないようになっています(アドレスの値から1つのウォレットに紐づけることはできないということ)。
  2. 仮想通貨は、ブロックチェーン上でに記載された取引履歴によって、通貨の利用や保有を表しています。
  3. ブロックチェーンにはアドレス情報も書き込まれる

これは、プライバシー保護のための処置です。もし、アドレスが1つだけの場合、公開されているブロックチェーンのアドレスを集計すれば、ウォレット単位でどれだけ持っているかわかってしまいます。これは、ウォレットを一つしか使用しないユーザーがいれば、そのユーザーの保有量がわかってしまうことになります。そのため、ウォレット内に複数アドレスを用意することで、ウォレット単位での通過保有量がわからないようになっています。

この3つが大前提となります。

送金理解

次は、ブロックチェーンでの送金理解についてです。送金する場合の流れは、以下のようになります。

自分のウォレットからあるアドレス(ここではアドレスA)が選ばれる

➡︎ 自分のアドレスから相手のアドレスに送金指示

➡︎ このアドレスとセットとなる秘密鍵で送金を確定

➡︎ 自分のウォレット内に新たなアドレスが生成され、アドレスAから相手アドレスと自分のウォレットの新アドレスの2つに送金がなされたことがトランザクションとして記録される

つまり アドレスA ➡︎ 相手アドレス(指定した金額)
    アドレスA ➡︎ 自分のウォレット内の新たなアドレス(アドレスAの残高ー相手アドレスに送った金額)

ここでのポイントは、送金する場合指定した金額が相手のアドレスだけに送られるのではなく、残高部分も一緒に自分のウォレット内で新たに生成されたアドレスに送られる(ブロックチェーン上に記録されている)ということです。

ウォレットの理解

送金の場合は、アドレス(公開鍵を簡略化したもの)の指定➡︎合致する秘密鍵で送金支持の確定となります。一方で、アドレスの作成の流れはこの逆になります。アドレスは公開鍵を簡略化する形で作られ、公開鍵は秘密鍵から生成されます。秘密鍵がランダムに生成されるとなるとデータ容量が大きくなり、管理が大変になるため、秘密鍵を生成するマスターシーズが1つだけ存在します。このマスターシーズは1つだけであり、指定したパターンに沿って、秘密鍵が作ります。送金の流れのように、アドレスからマスターシーズへと解明することはできず、この流れは不可逆的になっています。

流れ:
マスターシーズ ➡︎ 秘密鍵 ➡︎ 公開鍵 ➡︎ アドレス
(これを遡って解明していくことはできない)

先にも書いたように、秘密鍵以下は、複数作られます。ここからがポイントですが、マスターシーズはパターンに沿って秘密鍵を作成しています。つまり、アドレスはパターンに沿ってできているということになるため、このマスターシーズがわかれば、秘密鍵から順番に生成していくことができるということであり、ウォレットを復元できるということを意味します。しかし、マスターシーズは、セキュリティなどの観点からだと思いますが、記録できないくらいの膨大な数で指定されています。これを保存に適した形にしたものをパスフレーズといい、12個の英単語が並んだものになります。こういった作りのウォレットを、階層的決定性ウォレットと言います。

公開鍵暗号方式とは

秘密鍵やら公開鍵やらの言葉が出てきますが、これは公開鍵暗号方式と言われる暗号化手法をベースとしています。そのため、蛇足ながら公開鍵暗号方式も併せて説明します。公開鍵暗号方式は、色々な通信環境で使われている最も一般的な暗号方式の一つです。以下の特徴を持ちます。

  • 秘密鍵ー公開鍵で1セット
  • 公開鍵は公開される前提の鍵、秘密鍵は非公開で所有者が保管する
  • 公開鍵から秘密鍵を推測することはできない
  • 秘密鍵で暗号化したものは、セットの公開鍵でしか復元できる(その逆も同様)
  • 秘密鍵は本人しか持たないゆえ、署名と同じ効果があるとも言える(電子署名方式)
  • 暗号化の強度は鍵長(鍵のデータ量)に頼る
<具体的な流れ>
あなたからAさんに公開鍵暗号方式で、暗号化されたメッセージを送るとすると下記のような流れになります。
①あなたはウェブ上で公開されているAさんの公開鍵でメッセージを暗号化

➡︎ ②Aさんにメッセージを送信

➡︎ ③Aさんは暗号化メッセージを受け取ると、自分が持っている秘密鍵でメッセージを復号化

➡︎ ④Aさんはメッセージを読むことができます。

ポイントとしては、送り手が鍵を生成したりだとかするのではなく、受け手が事前に公開鍵を公開しているという点です。私の場合、この点を理解しきれておらず、当初少し混乱しました。公開鍵暗号方式のメリットは、公開鍵は公開しっぱなしでよく、秘密鍵だけしっかりと保管すれば良いため、鍵の管理が容易なところです。

一方で、暗号化と復号化のやりとりに時間がかかり、処理時間が低速というデメリットがあります。そのため、一般的には、暗号化方式を使っているSSL方式などは、共通鍵暗号方式などと併用されています。この公開鍵暗号方式は、オンラインサイトやクレジッカート情報の入力などで使われています。

ウォレットの構造

以上から、ウォレットの構造をまとめる以下のようになります。

  • ウォレットとは基本的に、アドレス、秘密鍵、公開鍵が格納されています。
  • アドレスー秘密鍵ー公開鍵で1セットで、それが複数格納されている、リストのようなイメージです。
  • 残高は、ウォレットに書かれているのではなく、P2Pのブロックチェーンのブロックのトランザクションに
     書かれた、自分のウォレットに紐づくアドレスをそれぞれ合計して求めている
  • ビットコインアドレス・・・公開鍵を簡略化したもの。アルファベットと数字からなる58進数
     (間違いやすい大文字O、Iと小文字l、数字0を除外している)
  • 秘密鍵・公開鍵・・・32byteの英数字の羅列
  • マスターシード・・・とんでもなく大きな値
  • パスフレーズ・・・12個の英単語が並んだもの

次回の投稿に続きます。