こんにちは!ゴビンチ(@Go_Vinci)です。
ビットコインはスマートフォンやPCがあれば気軽に送金ができるのでとても便利です。
しかし、どのようにセキュリティが担保されているのか疑問に思ったことはありませんか?
自分宛が受け取ったビットコインが、他の知らない人に使われたら困るなんてものじゃないですよね。
この記事では、ビットコインの送金の安全性がどのように守られているのかを解説します。
ビットコインの電子署名の解説・補足
ビットコインの送金の安全に行えるのは、 電子署名 という技術を利用しているからです。
まず、ビットコインの電子署名の仕組みについて、実際の送金を例として絵文字を使ってわかりやすく図解してみました。
- 🗒=トランザクション
- 📦=ブロック
- 🗝=秘密鍵
- 🔒=公開鍵
- ✅=ハッシュ値※図では✔で表示
- ₿📍=ビットコインアドレス
- 🗒✅🗝=署名済トランザクション=✍
- 🔎=検証(電子署名)
- ⛏👷♂️=マイナー
- 💻=ノード
🗒ビットコイン送金時の電子署名と検証の流れ

[図]ビットコインをZ→A→Bへを送金
- 送金をしたいユーザーは自分のビットコインアドレス(₿📍)宛に届いた未使用のトランザクション(🗒)から、新たな トランザクション(🗒) を作ります
- 作った トランザクション(🗒)をハッシュ値(✅)化し、更に秘密鍵(🗝)で暗号化します
- 署名済トランザクション(🗒✅🗝)がノード(💻) によって(🔎)されます
- トランザクション(🗒) がマイナー(⛏👷♂️)によってボックス(📦)に集積され、そのボックス(📦)がブロックチェーンに追加されると、受け取ったユーザーのトランザクション(🗒)(UTXO)になります
- ❶に戻る
- 送金をしたいユーザーは自分の ビットコインアドレス 宛に届いた未使用のトランザクションから、新たな トランザクション を作ります
- 作った トランザクション をハッシュ値化し、更に秘密鍵で暗号化します
- 署名済トランザクション が ノード によって 検証 されます
- トランザクション が マイナー によって ブロック に集積され、その ブロック がブロックチェーンに追加されると、受け取ったユーザーの トランザクション (UTXO)になります
- ❶に戻る
✍トランザクションの電子署名

[図式]電子署名
✍ とは、🗝 を使用しして 🗒 ✅ を暗号化することにで、ビットコインの送り主であることの証明する作業です。
なぜ、🗒 を 🗝 で暗号化することがビットコインの送り主であることの証明になるのかというと、 🗝 は 🗒 を作った本人しか知り得ないからです。
それに加え、 🗒 は ₿📍 宛に送信されます。
その ₿📍 は 🔒 から生成され、🔒 は 🗝 を元にして作られています。( ₿📍< 🔒 < 🗝 )
なので、ユーザーがその届いた 🗒 を次に使えるということは、 自分の ₿📍 に適合する 🗝 を知っていることにもなるります。
余談ですが、なので 🗝 を盗まれてしまった場合は、その 🗒 の所有権が移ったことになってしまうのです。
電子署名 とは、秘密鍵 を使用しして トランザクション の ハッシュ値 を暗号化することにで、ビットコインの送り主であることを証明する作業です。
なぜ、トランザクション を 秘密鍵 で暗号化することが、ビットコインの送り主であることの証明になるのかというと、それは 秘密鍵 は トランザクション を作った本人しか知り得ないからです。
それに加え、 トランザクション は ビットコインアドレス 宛に送信されます。
その ビットコイン は 公開鍵 から生成され、公開鍵 は 秘密鍵 を元にして作られています。( ビットコインアドレス< 公開鍵 < 秘密鍵 )
なので、ユーザーがその届いた トランザクション を次に使えるということは、 自分の ビットコインアドレス に適合する 秘密鍵 を知っていることにもなります。
余談ですが、なので 秘密鍵 を盗まれてしまった場合は、その トランザクション の所有権が移ったことになってしまうのです。
🔎電子署名の検証作業

[図式]トランザクションの検証作業を
🔎 とは、本当にその 🗒 が持ち主によって作られたものなのかを確認する、💻 の作業です。
検証の方法は、伝播されてきた【 🗒✅🗝 + 🔒 + 🗒 】を使います。
まず 🗒✅🗝 を 🔒 で復号します。そうすると 🗒 ✅ になります。
それと、一緒に同封されていた 🗒 を ✅ 化して、それぞれが同一であるかを確認します。
同一であった場合は、正しい 🗒 として、他の 💻 にも伝播されます。
検証 とは、本当にその トランザクション が持ち主によって作られたものなのかを確認する、ノード の作業です。
検証の方法は、伝播されてきた【 署名済トランザクション + 公開鍵 + トランザクション 】を使います。
まず 署名済トランザクション を 公開鍵 で復号します。そうすると トランザクション の ハッシュ値 になります。
それと、一緒に同封されていた トランザクション を ハッシュ値 化して、それぞれが同一であるかを確認します。
同一であった場合は、正しい トランザクション として、他の ノード にも伝播されます。
もし間違っている箇所がありましたら、コメントやメッセージでご指摘いただけたら嬉しいです。