仮想通貨の送金を経験したことがある人は、このような一見デタラメな文字列に見えるアドレスに対して仮想通貨を送ったことがあるはずです。
もちろん、取引の流れやアドレスの正体などを知らなくても仮想通貨を使うことはできますが、アドレス生成の仕組みを知ることでより技術面にも興味を持って仮想通貨を扱うことができるはずです。
アドレス生成までの流れを理解するには、公開鍵暗号、秘密鍵、公開鍵、楕円曲線DSA、ハッシュ関数など知らなければならないことがたくさんあります。当記事では、アドレス生成までの流れを整理してお伝えしていきます。
公開鍵暗号方式とは
秘密鍵と公開鍵の概念を理解するためにはまず公開鍵暗号について理解する必要があります。
暗号化技術を用いてコミュニケーションを行う場合、暗号化と復号化(暗号化されたデータを平文に戻す作業)が必要になります。それぞれの作業を行うために暗号化するための鍵と復号するための鍵が必要になりますが、同じ鍵で暗号化と復号化を行う共通鍵暗号方式とそれぞれを別々の鍵として扱う公開鍵暗号方式という2種類の方式が存在します。
共通鍵暗号方式では、鍵自体を安全に渡すことができるかという鍵輸送問題が起きるのでビットコインなどの仮想通貨では公開鍵暗号方式が使われているのです。具体的には公開鍵暗号を用いてトランザクションのデジタル署名を行なっています。
また、一般的に最も普及している公開鍵暗号アルゴリズムはRSAですが、ビットコインなどでは楕円曲線暗号(ECC)の楕円曲線DSA(ECDSA)アルゴリズムが使用されています。
楕円曲線暗号はRSAに比べて鍵のビット数を少なくでき、処理性能を高速化できるのが特徴です。つまり、楕円曲線暗号は短い鍵でもRSAと比較して十分強力であるということです。
秘密鍵とは
秘密鍵(Private key)とは、公開鍵暗号において公開鍵とペアをなす鍵です。ビットコインの場合はECDSAによって秘密鍵と公開鍵のペアが生成されます。
秘密鍵はその名の通り、自分以外に秘密にしておくべき鍵であり、もし他人に知られてしまったらその鍵に紐付けられている全てのコインを奪われてしまいます。秘密鍵の情報が漏れてしまうということは、銀行口座で言うとキャッシュカードと通帳と暗証番号と銀行印を全部盗まれるくらい重大なことです。
ちなみに秘密鍵をなくしてしまうとコインの送金もできないし、当然法定通貨への換金もすることができません。つまり、コインの塩漬け状態になってしまいます。
なので、秘密鍵は他人に知られないようにし、かつ自分も忘れないようにしっかりとバックアップしておく必要があるのです。そのために、ウォレットが存在し、そのウォレットの中に秘密鍵を保存しておくのです。また、仮想通貨取引所にコインを預けておくということはその取引所に秘密鍵を預けているということになります。
ブロックチェーンネットワークにおいて、秘密鍵はトランザクションに署名を行うために使われます。
公開鍵とは
公開鍵(Public Key)とは、公開鍵暗号アルゴリズムにおいて秘密鍵とペアを成します。秘密鍵は他人に知られてはいけない鍵でしたが、公開鍵は他人に知られても問題ありません。公開鍵からコインを奪ったり、秘密鍵を推測することはできないようなアルゴリズムになっているからです。
仮想通貨において、公開鍵はP2Pネットワークにブロードキャストされた秘密鍵による署名済みのトランザクションと照合して、取引が正当に行われたかチェックするために使われます。
要するに、公開鍵で署名の復号化をすることでその復号結果であるトランザクションと元のトランザクションが一致するか確かめるのです。一致すれば確かに正しい送信者から送られたトランザクションであり、かつ内容が偽造・改ざんされていないことの証明になります。なぜなら、その公開鍵は秘密鍵とペアであり秘密鍵は送信者しか持っていないからです。
そして、この公開鍵を元に口座番号の役割をするアドレスが作られます。
ちなみにビットコインやイーサリアムではECDSA(楕円曲線DSA)という署名方式でデジタル署名が行われています。
参考:ECDSAによる署名生成と検証の仕組みを分かりやすく解説
また、最近ではこのECDSAに代わってシュノア署名という方式が実装されようとしています。
参考:シュノア署名がビットコインのスケーラビリティ問題に与える衝撃
アドレスとは
アドレスとは、銀行口座で言えば口座番号にあたるものです。仮想通貨の取引はこのアドレス間でコインをやりとりすることにより行われます。
例えば、コインの送信者がアリスであり支払先がボブである状況を考えます。コインを送るためには、アリスが持っているアドレスAからボブが持っているアドレスBにコインを送るだけでいいのです。
この送信元と送信先のアドレスはブロックチェーンに記録され、ブロックチェーンのシステムが維持し続ける限り改ざんされることはありません。また、秘密鍵や公開鍵はブロックチェーンに記録されることはありません。
ビットコインのアドレス生成までの流れ
それでは具体的にビットコインのアドレスが生成されるまでの流れを見ていきましょう。
- 秘密鍵からECDSAで公開鍵を生成
- 公開鍵をハッシュ関数SHA-256に通しハッシュ値を得る
- そのハッシュ値をさらにハッシュ関数RIPEMD-160に通しハッシュ値を得る
- ハッシュ値の先頭にプレフィックスとして00を加える
- ハッシュ関数SHA-256に通す
- もう一度ハッシュ関数SHA-256に通す
- 4バイトのチェックサムを一番後ろに加える
- Base58のフォーマットでエンコーディングする
まず、秘密鍵からペアである公開鍵を作ります。その公開鍵をSHA-256、RIPEMD-160の順番でハッシュ関数に通すことでハッシュ値を得ます。そのハッシュ値に00のプレフィックスを加えます。さらに、タイプエラーなどにより送金ミスをしないようにチェックサムが加えられます。
この文字列をBase58フォーマットに変換したものがアドレスになるのです。
SHA-256やRIPEMD-160などの一方向ハッシュ関数については以下の記事で解説しているのでご覧ください。
参考:ブロックチェーンの技術「一方向性ハッシュ関数」を理解しよう
イーサリアムのアドレス生成までの流れ
続いてイーサリアムのアドレス生成の流れを見ていきましょう。基本的な流れはビットコインと同じですが、ハッシュ関数の違かったりBase58のフォーマットを使用していないなどの違いがあげられます。
- 秘密鍵からECDSAで公開鍵(64バイト)を生成
- 公開鍵をハッシュ関数Keccak-256に通し文字列(32バイト)を得る
- 最初の12バイトを消し20バイトのアドレスになる
- そのアドレスにprefixの0xを加えることで最終的なアドレスを得る(0x5eD8Cee6b63b1c6AFce3AD7c92f4fD7E1B8fAd9F)
イーサリアムのアドレスの特徴として、イーサリアムアドレスはチェックサムを持っていないことがあげられます。チェックサムはアドレスが正しい形式であるか検証するためのコードです。つまり、アドレスを1文字でもタイプミスしてしまったら送金を失敗してしまうということです。
このようにイーサリアムでチェックサムを導入していない理由としては、将来的にアドレスをネームの登録制のように扱おうとしているからです。イメージ的にはURLのドメインのような感じです。実際に、2017年5月にENS(Ethereum Name Service)がローンチされ、オリジナルのドメインを取得できるようになっています。
また、最近はイーサリアムのアドレスはICAPフォーマットに移行しつつあります。ICAPはビットコインと同様にbase58でフォーマットされておりチェックサムも含まれています。こんな感じです。
XE81ETHXREGGAVOFYORK
ICAPの特徴はIBAN(International Bank Account Number)という規定を満たしていることです。これにより、銀行のシステムがイーサリアムアドレスを認識することができ、銀行システムとイーサリアムアドレスの互換性を保つことができるのです。
上のICAPアドレスを見てみると、最初は「XE」で始まることが分かります。IBANでは最初にどの国のコードなのか認識する文字列がありますが、「XE」はイーサリアムのための国コードになります。
つまり、イーサリアムアドレスの今後の方針としては、人間が簡単に認識できるようなアドレスにしつつ銀行のシステムと互換性があるアドレスを目指しています。