ブロックチェインやプルーフ・オブ・ワークなどの暗号通貨のコア技術の説明に入る前に、 コインの受け渡しをどのように表現するのか?について先に説明をしておきます。
まず用語の定義ですが、「トランザクション」とは一つの送金記録、例えば「AさんからBさんへコインを一枚送った」といった内容のことを意味します。 データベースの文脈などで出てくるトランザクションの意味とは少し異なりますので、混乱しないよう注意してください。
さて、コインを受け渡すという行為はどのように記述すればいいでしょうか? 物理的なコインであればそのコインを手から手へと渡せば十分ですが、暗号通貨の場合には所有権の移譲によって表現をしています。 例えば「自分の持っているこのコインの所有権を、Bさんへ受け渡します」といった内容のトランザクションを作成すればOKです。
では送金元を勝手に詐称(なりすまし)されるのを防ぐにはどうしたらいいでしょうか? こちらについては従来通りの電子署名によって実現が可能です。 コインのもとの所有者に紐付いている秘密鍵で電子署名[1]を行ったトランザクションしか正当であるとみなさなければよいのです。
ではまずは最も簡単な例として、自分の持っているコインをすべて、誰かに受け渡す処理を考えてみましょう。
具体的に「《Aさん》の全保有コインを《Bさん》に受け渡す処理」を考えてみましょう。
そのためには、トランザクション内に以下の三つの情報を含む必要があります。
- コインの権利保有者が確かに《Aさん》であること
- コインの受け渡し先が《Bさん》であること
- トランザクション作成者が《Aさん》であること(なりすましをされていないこと)
まず 1. に関しては、《Aさん》の持っているコインはどこからか突然湧いてでてきた[2]わけではありませんから、必ず前の所有者(ここでは《Xさん》とします)がいるはずです。 従って、その保有者から確かにそのコインをもらったという証明として、《Xさん》から《Aさん》への送金トランザクションの情報があれば十分です。
2. に関しては、《Bさん》の公開鍵を指定してあげればよいでしょう[3]。
最後に 3. ですが、これは先に述べたように電子署名で実現できます(図中央下「《Aさん》電子署名作成」)。
前のスライドでは自分の持っているコインをすべて渡すことしかできず、一部のみを渡したり、または複数の人からもらったコインを合算して渡すことはできません。
このようなことができるようにするためには、コインの「入力」と「出力」が複数個あってもよい、ということにすればOKです。
もう少し具体的に次のスライドの図をみてみましょう。
自分の保有している、《Xさん》からもらった100MONA・《Yさん》からもらった500MONA・《Zさん》からもらった400MONA、あわせて1,000MONAのうち、950MONAを《Bさん》へ受け渡すことを考えましょう。
ひとつのトランザクションの「入力」として先の三つのコイン(X, Y, Zさんから受け取ったもの)を指定することで、複数のコインを合算することができます。
この合算された1,000MONAのうち、一部の950MONAのみを受け渡す場合には、「出力」として《Bさん》宛の950MONAに加えて、《自分》宛の50MONAを指定すればOKです。
ちなみに、この自分宛に送ったコインのことを「change(英語で『おつり』の意)」と言うことがあります。
少し話題がそれてしまいますが、トランザクション手数料について触れておこうと思います。
Bitcoinでは入力のコイン数に対して、出力のコイン数が少ない場合には、余りの分はトランザクション手数料とみなされる決まりになっています。
トランザクション手数料は誰に対して支払われるのかというと、後述する採掘者(マイナー)に対してネットワークの維持手数料として支払われます。 Bitcoin以外の仮想通貨やBitcoin派生通貨(Altcoin)[4]ではこの手数料は単純に捨てられてしまう設計になっているものもありますが、 Bitcoinではトランザクション手数料は消えてなくなるわけではありません。
トランザクション手数料の徴収理由ですが、一つは採掘者に対するネットワーク維持の謝礼金としての目的と、もうひとつはトランザクション乱発によるサービス停止(DoS)攻撃を防ぐためです。 後者は非常に重要で、もし手数料なしで送れてしまうと、自分宛の送金を繰り返してトランザクションを発行しまくることで、ネットワーク全体がパンクしてしまう危険があります。
コメント