あなたがビットコインを相手に送ったときに実際に何が起こっているのか見ていきましょう。
ビットコインの取引はUTXOを介して実行されます。ビットコインのすべての取引においてUTXOを新たに生成し、UTXOを消費することで送金が完了するのです。UTXOはシステム側の仕組みなのでユーザーが意識することはありませんが、アドレスの残高算出などもこのUTXOを計算することで行われています。
この記事では複雑なUTXOの仕組みをできるだけ分かりやすくお伝えしていきます。また、UTXOのメリットとデメリットについても考えていきましょう。
ビットコインにおけるトランザクションの概要
ビットコインのトランザクションの流れは以下のようになります。
- UTXOがUTXOプールに入る
- 有効なUTXOがトランザクションインプットになる
- トランザクションアウトプットが新しいUTXOになる
この流れを見ても分かる通り、ビットコインのトランザクションではUTXOが中心的な役割を果たします。まず最初に押さえておくべきことは、ビットコインのブロックチェーンにおいてアドレスの残高は記録されていないということです。
アドレスの残高はネットワークにおける全てのトランザクションから計算することにより算出しているのです。例えば、アドレスAに100BTCの残高がある場合、「アドレスAの残高:100BTC」と記録されているのではなく、「以前にアドレスAはアドレスBに10BTC、アドレスCに30BTC送金して、アドレスDから50BTC受け取っているから、100-(10+30)+50=110で今アドレスAの残高は110BTCだね!」というように算出しているということです。
なぜビットコインではアドレスの残高を算出するためにこのような面倒くさい計算をしているのでしょうか。このような算出方法がまさにUTXOベースの残高管理方法であり、さまざまなメリットがあるのです。(もちろんデメリットもあります。)
UTXOとは
UTXO(Unspent Transaction Output)とは、訳すと「未使用のトランザクションの出力」です。ビットコインのトランザクションはインプット(input)とアウトプット(output)から構成されています。つまり、ビットコインの送金がアウトプットにあたり、着金がインプットにあたります。
UTXOがどこから来るのかというと、このトランザクションのアウトプットから来ます。トランザクションアウトプットがUTXOであり、このUTXOが次のトランザクションインプットになるのです。なので、UTXOは「未使用のトランザクションアウトプット」と呼ばれているのです。
ブロックチェーンにおけるそれぞれのブロックの中でトランザクションはこのようにつながっているのです。
このようにトランザクションの流れ、つまりコインのやり取りはUTXOのやり取りとして行われているのです。要は、取引ごとにUTXOが消費され、新しいUTXOが生成し、、ということを繰り返しているのです。
さらに、実際のトランザクションではインプットとアウトプットが複数になることがあります。なぜなら、複数の人(アドレス)からコインを受け取ったり、逆に複数のアドレスにコインを送ったりすることがあるからです。(下図「トランザクション」を「Tx」と略しています)
UTXOの特徴
インプットトランザクションとアウトプットトランザクションは等しい
トランザクションのインプットとアウトプットのそれぞれの合計額は等しくなります。また、取引には手数料がかかりますのでより正確には、「トランザクションインプット=送金先のアドレスが受け取るトランザクションアウトプット+取引手数料のトランザクションアウトプット」となります。
UTXOは分割できない
UTXOは分割することができません。500円玉を200円と300円に物理的に分けることができないように、500BTCのUTXOを200BTCのUTXOと300BTCのUTXOに分けることはできないのです。それでは、アドレスAが持っている500BTCから200BTCだけアドレスBに送金する場合はどうすればいいのでしょうか。
このようにUTXOのおつりが発生するときは、おつり分を受け取る自分のアドレスCを作り、アドレスCで200BTCを受け取ります。おつりを受け取るアドレスは自分が管理しているアドレスであればいいのでアドレスAでも問題ありませんが、匿名性やプライバシーの観点から新たに作成したアドレスCで受け取る方が好まれます。
もし、おつりを送る自分のアドレスを指定しなければ取引手数料としてマイナーの手に渡ることになります。
coinbaseトランザクション(ブロック最初のトランザクション)
トランザクションはインプットとアウトプットから成っており、UTXOのやり取りによってトランザクションが作られていくという流れはイメージできたと思います。しかし、ブロックの一番最初のトランザクションはどこからインプットが送られてくるのでしょうか。各ブロックにおける最初のトランザクションは例外でcoinbaseトランザクションと言われています。
coinbaseトランザクションはインプットはなく、アウトプットのみ存在します。coinbaseはそのブロックを生成したマイナーによって作られマイナーにマイニング報酬を送るアウトプットが存在しているのです。
UTXOのメリット
アドレスの残高は上述したUTXOを全て計算することにより算出します。これをUTXOベースと呼びます。一方、直接残高をブロックチェーンに記録する方法をアカウントベースと呼びます。ちなみにイーサリアムやNEMはアカウントベースを採用しています。
ここからはアカウントベースと比較したUTXOベースのメリットとデメリットを解説していきます。
プライバシー保護に優れている
UTXOのメリットとしてまずあげられるのがプライバシー保護に優れていることです。上述したように、自分のアドレスAから相手のアドレスBに送金する場合、おつりは自分のアドレスCを新たに生成してその新しいアドレスCに送ることが好まれます。
なぜなら、外部からではアドレスAとアドレスCが同じユーザーのものだと分からないからです。つまり、アドレスAからアドレスBとアドレスCの2人に送金したのか、あるいはアドレスBのみに送り、アドレスCはおつり用のアドレスなのか判別できないのです。
対して、イーサリアムのようなアカウントベースの場合UTXOの概念はないので、おつりのために新しいアドレスを生成する必要はなくなります。なぜなら、アドレスの残高を直接ブロックに記録しているので、単純にその残高から送金分を差し引くだけでいいからです。
もちろんアカウントベースでも新しい自分のアドレスにおつりを送ることはできますが、その分送金手数料も増えてしまいます。
リプレイアタックの耐性が強い
リプレイアタック(Replay Attack)とは、ハードフォークを実施したコインを取引所に預ける行為と引き出す行為を繰り返すことでハードフォークで分岐したバージョンのコインを大量に入手できてしまうことです。
例えば、リプレイアタックの耐性が弱いとビットコインを取引所に預け、引き出すとビットコインと一緒に同じ量のビットコインキャッシュも引き出せてしまうのです。これは、ハードフォークで分岐したバージョンごとのコインが全く同じアドレス・秘密鍵の構造・ネットワークを利用していることが原因となります。
実際、ビットコインキャッシュにはリプレイアタック対策がされていたためリプレイアタックが問題になることはありませんでしたが、もしリプレイアタック対策がされていなかったら、ビットコインにおいて「アドレスAからアドレスBへ100BTCを送金する」というトランザクションをビットコインキャッシュのノードも受け取ってしまい、「アドレスAからアドレスBへ100BCHを送金する」というトランザクションも同時に発生してしまうのです。
UTXOベースの方がこのリプレイアタックの耐性が強くなります。なぜなら、アドレスの残高はUTXOから算出されるので、ハードフォーク後にこのUTXOが区別されれば、同一に残高を算出することができないからです。
一方、アカウントベースの場合はアドレスの残高がそのまま記載されている分、トランザクションの履歴を記録することはできないのです。つまり、どこからきたトランザクションか判別することが難しくリプレイアタックの耐性が弱くなります。実際にアカウントベースを採用しているイーサリアムがイーサリアム・クラシックにハードフォークした際は、対策を取っていない取引所においてリプレイアタックが発生してしまいました。
UTXOのデメリット
実装が複雑
上記のUTXOの解説からも分かるように残高や送金の計算がかなり面倒くさいです。あるアドレスのある時点での残高を算出する場合、全てのUTXOを含めて残高を計算する必要があります。
また、送金するときのUTXOの計算も複雑になります。あるアドレスが複数のUTXOを持っているとすると、どのUTXOを送金のためのUTXOに当て、どのUTXOをおつりにするか選択しなければなりません。ビットコインの場合、取引手数料はトランザクションのサイズで決まります。
取引手数料を最小限に抑えるためにもトランザクションのサイズが最小になるように、つまりできるだけ少ない数のUTXOで送金を行い、かつおつりのUTXOが少額にならないように(次回以降の取引手数料が高くなってしまうから)最適化する必要があるのです。
一方、アカウントベースで送金する場合は、ブロックチェーンに記録されている残高から送金額と手数料を差し引くだけで算出することができます。もちろんこれらの計算はウォレットシステム側が行っているのでユーザーが普段送金するときに意識することはありません。
ビットコインのように通貨としての機能を持つコインでもUTXOベースの残高や送金の計算は複雑になるので、イーサリアムのようにスマートコントラクトの機能を持つとさらに計算が複雑になることが想像できると思います。なので、イーサリアムやNEMはアカウントベースを採用しているのです。