要約:
- ブロックチェーンは特定の方法により、全ユーザーの全トランザクションを記録します。代表的な記録方法は2種類で「UTXOモデル」と「アカウントバランスモデル」です。
- UTXOモデルは、ビットコインやライトコインなどが採用している記録方法です。よく現金決済にたとえて説明されます。やや複雑になるものの、セキュリティが高いのが特徴です。
- アカウントバランスモデルは、イーサリアムやBNBチェーンが採用している記録方法です。よくネット銀行での送金にたとえられます。シンプルなのが特徴で、スマートコントラクトを実装するブロックチェーンに向いているとされます。
UTXOモデル
UTXOモデルは、ビットコインなどが採用する記録方法です。少し複雑な仕組みですが、セキュリティが高い方法とされています。
UTXOを採用するブロックチェーンには、ビットコインやドージコイン、ビットコインの派生系であるライトコインやZcashなどがあります。
そもそもUTXOとは?
UTXO(unspent transaction output)とは、送金等を行った後に、使われずに残っている残高のことです。「次回の出金の元手として使える残高」とも言えます。
例として、財布に100円玉2枚と500円玉1枚、1,000円札1枚が入っていたとします。このときのUTXOは、以下の4種類です。
- 100円玉
- 100円玉
- 500円玉
- 1,000円札
上のケースでは、UTXOは4種類。UTXOを組み合わせれば、1,700円までの支払いが可能です。
UTXOモデルの送金例
UTXOモデルはちょっと分かりづらいので、まずは例を使って見てみましょう。
AさんがBさんに0.9 BTC支払いたいとします。また、AさんのUTXOは以下の3種類だとします。
- 0.5 BTC
- 1BTC
- 2BTC
この状況では、以下のように送金が行われます。
- Aさんは1 BTCというUTXOを選んで差し出す
- 0.9 BTCがBさんに払われる
- 0.1 BTCがAさんに返金される
インプットとは支払いに必要な元手、アウトプットとは支払い処理後に渡されるお金のことです。
※上の図ではインプットとアウトプットが同額ですが、実際は手数料が引かれるので、インプットよりアウトプットのほうが小さくなります。
上記画像の状況は、現金決済を思い浮かべると理解しやすくなります。
そこで、Aさんが900円のコンビニ弁当を買うというケースを見てみましょう。また、Aさんの財布の中身(UTXO)は以下の通りだとします。(UTXOは3種類)
- 500円玉
- 1,000円札
- 2,000円札
弁当の値段は900円です。そこでAさんは、店員のBさんに1,000円札を差し出しました。するとBさんは100円玉をAさんに返して、900円分を受け取ったことにするはずです。
この結果、Aさんの財布の中身(UTXO)は以下のように変化します。
- 100円玉
- 500円玉
- 2,000円札
弁当を買った結果、1,000円札というUTXOが無くなりました。ただ、100円のおつりが発生したので、100円のUTXOが追加されました。
UTXOの増減
UTXOは減ったり増えたりします。どんなときに減って、どんなときに増えるのかをさっきのコンビニの例で考えてみたいと思います。
UTXOが減るのは、支払いのときでした。支払いのときは、値段に近くなるようにUTXOを差し出すので、このときにUTXOは減ります。
UTXOは1つだけ差し出す(インプットする)こともあれば、100円玉2枚で払うときみたいに、複数のUTXOを差し出すことも。
UTXOが生まれるタイミングに、おつり発生時があります。ただ、手持ちの残高(UTXO)でちょうど払えるなら、おつりはもらわないのでUTXOは生まれません。
もちろん、送金してもらってお金を受け取った場合も、UTXOは増えます。
UTXOモデルの送金の流れ
ここまでの内容をふまえて、UTXOモデルに着目しながら、一般的な送金の流れを見てみましょう。
送金の流れは以下の通りです。
- 送金額(0.9 BTC)を入力する
- 署名を行う
- 検証・承認される
- 0.9 BTCが支払われる
今回も以下のイメージで、0.9 BTCを支払うために、1BTCのUTXOを使うとします。
手順1:送金額を入力する
まず送金者は、送金したい金額0.9 BTCをウォレット画面に入力します。
このときウォレットは、送金者のUTXOを確認し、どのUTXOをインプットに利用するか(支払いに使うのか)を自動で選びます。
今回は1 BTCのUTXOを単体で使うことになったとします。
手順2:デジタル署名を行う
金額を入力したら、秘密鍵を使って署名します。「秘密鍵を使って署名」というと難しい感じがしますが、実際はウォレット画面に表示される「確認」ボタンを押すだけです。
この署名という手順により、自分がUTXOのオーナーであると証明できます。
手順3:検証・承認される
ネットワークのノードや、マイナーと呼ばれるノードがトランザクションをチェックします。UTXOのオーナーは送金者本人か、第三者が改ざんしていないか、残高は足りているかなどを確認します。
このフェーズでは、送金者は1 BTCを利用できなくなります。
「0.9 BTC」ではなく「1 BTC」?
送金者は0.9 BTCを送金したつもりなので、0.9 BTCだけがロックしていると感じます。しかし実際には、UTXO単位で送金をするので、UTXOである1 BTC分が丸ごと使えなっています。
手順4:0.9 BTCが支払われる
マイナーが承認したら、0.9 BTCが相手に送金されます。また、おつりの0.1 BTCが「自分のもと」に返金されます。
「自分のもと」と、少し強調したのには理由があります。たしかに送金者のもとに返金されるのですが、実際には送金者が所有する新しいウォレットアドレス「おつりアドレス」に送金されます。
おつりアドレスとは
UTXOモデルでは、おつりアドレス(change address)が使われます。おつりアドレスはUTXOモデルをややこしくしている要因であり、セキュリティを高めてくれる要因でもあります。
前のところで少し触れましたが、UTXOモデルの送金でおつりが発生する場合、そのおつりはおつりアドレスに送金されます。もとのアドレスに返金されるのではありません。
おつりアドレスは、おつりが発生するために新たに作成されます。そのため、おつりが送金されるアドレスは、毎回別々ということになります。
おつりアドレスは送金者のもの
おつりアドレスは毎回新しく作られるものですが、送金者のウォレットアドレスに紐づいています。メタマスクでBTCアドレスの残高を見てみると、そこにはおつりアドレスにある残高も含まれています。
ちなみに、おつりアドレスの紐づけは自分で行う必要はありません。
おつりアドレスを使う理由
おつりアドレスを使う理由は、プライバシーの向上です。
ブロックチェーン上の取引内容は誰でも確認できます。例えば、AさんがBさんに0.9 BTCを送ったとしたら、その情報はみんなに公開されます。
でもおつりアドレスがあると、少しはプライバシーが守られます。おつりアドレスがあると、以下のような記録が残ります。
- AさんはアドレスXに0.9 BTCを送った
- AさんはアドレスYに0.1 BTCを送った
外部の人は、「Xに0.9 BTCを送ったのか」それとも「Yに0.1 BTCを送ったのか」どちらか分かりません。
透明性は大事です。でもプライバシーも大事ということで、ビットコインなどはUTXOモデルを使うことで、そのバランスを調整しています。
ただ、ユーザーからするとややこしいです。
アカウントバランスモデル
アカウントバランスモデルが誕生したきっかけは、複雑なUTXOモデルに開発者がうんざりしたことのようです(参照)。
アカウントバランスモデルでは、おつりが出ないようにちょうどの金額を送金します。例えば、0.9 ETH支払いたいなら0.9 ETHちょうどを送金します。
これはネット銀行での送金や、クレジットカードでの支払いと一緒ですね。
UTXOモデルと違って分かりやすいです。
二重支払いの可能性が少し高まるというデメリットがあります。しかし、シンプルな点は魅力です。そのおかげで、開発者は効率的に処理が行えます。
アカウントバランスモデルは、dAppsプラットフォームのイーサリアムやBNBチェーンなどが採用しています。
参照
https://research.binance.com/static/pdf/wallets-deep-dive.pdf
コメント