見出し画像

トランザクションの役割とUTXOモデル|詳解ビットコイン⑧

『詳解ビットコイン』(Kalle Rosenbaum著、オライリージャパン)を読んでいます。その個人的なまとめとして書いていきます。

トランザクションはそのままの形で格納される

そもそもトランザクションとは、BTCを送金したいときに作成するものです。実際にはユーザーが作成する必要はなく、ウォレットアプリに送金先や送金数量を入力し、「署名」ボタンをクリックすればトランザクションは作られ、ビットコインネットワークに送信されます。

そうしてネットワークに送信されたトランザクションは検証され、問題がないことがわかると、後に台帳(ブロックチェーン)に格納されます。

上記のようにトランザクションは台帳に格納されるわけですが、重要なのは、トランザクションがそのまま格納されるということです。トランザクションに含まれる送金元、送金先、送金額といった一部の情報だけが格納されるのではありません。

一部の情報を格納することの欠点

一部の情報を格納するほうが容量を食いません。しかしそうすると、きちんとルール通りに運用されているかを確かめづらくなります。

もしトランザクション全体を確認するのが検証者のみで、一般ユーザーとしては、台帳に記録されたトランザクションの一部を見るしかないならば、一般ユーザーは検証者などによる不正に気付きづらくなります。

たとえば、「アリスのアドレスから”ボブ”のアドレスに1BTCを送る」というトランザクションがあったとします。このとき、検証者のジョンがそのトランザクションを受け取り、「アリスのアドレスから”ジョン”のアドレスに1BTCを送る」といった改変をする恐れがあります。

下図は、ジョンがアドレスを改変し、それを台帳に記録した様子です。

一般ユーザーが上図の様子だけしか見れないなら、検証者(ジョン)による不正を疑うことはないはずです。

一般ユーザーとはいえ、当事者であるアリスやボブは、ジョンによる不正を疑う可能性があります。しかし、ジョンが白状しない限りは、確たる証拠になりづらいと想像できます。アリスやボブから追及されてもジョンは、「アリスが宛先を間違えたのではないのか」と反論し、「経緯はともかく、1BTCをボブに送ってあげるよ」と言って、事態の収集を図るかもしれません。

上記より、ジョンは比較的低いリスクで不正ができる状態にあるといえます。ボブがうっかりしていてれば1BTCを盗めますし、仮にボブたちから指摘をされたとしても、厳しい追及を逃れられる可能性があるのです。

そのままの形で格納する利点

一部を格納する方式に対して、トランザクションがそのままの形で格納されるなら、誰もが検証作業を再現できます。そのため、ちゃんと運用されているのかを確かめやすく、仮に検証者が不正をしていてもそれに気づけるので安心です。

個人的な感想ですが、そもそも 「やろうと思えば不正ができる」という環境を作るのはよくなさそうです。いくらまじめな人間であっても、このような環境なら魔が差してしまう可能性が十分にありそうですよね。

不正しようがない環境ならそんな心配も不要です。

トランザクションに含まれているもの

トランザクションはそのままの形で台帳に格納されるわけですが、そもそもトランザクションには何が含まれているのでしょうか。

トランザクションに含まれている要素を表すと、以下のようになります(分かりやすくなるように補足した箇所があります)。一番外側にある灰色の太枠内が1つのトランザクションとなっています。

上記ではややこしいということで、本書では少し簡易化したものを取り上げて説明が進みます。簡易化したトランザクションのイラストは以下です。

上記は、ひとつ前のイラストの内側部分をピックアップした形です。下図のように入手部分と出力部分に分けることができます。

出力部分 パート1

大雑把に言うと、出力部分が示しているのは、いくらのお金を誰に渡すのかということです。まずは出力部分についての説明を、以下のイメージを使いながらしていきます。

「いくらのお金を」を表しているのが、上図の①で、これは「8 BTCを渡す」みたいな感じです。

他方、「誰に渡すのか」を表しているのは、上図の②です。詳細は後述しますが、実際に記されているのは「pub-script」というテキストではなくプログラムです。そのプログラムはお金の送付先情報(PKH)などを含んでいます。以下は公開鍵スクリプトの例です。

2行目に書かれている「Value: 2, pub-script」についても、同じように解釈できます。「Value; 2」は 2 BTC分を送信するという意味であり、「pub-script」は送信先情報(PKH、SHなど)を含むプログラムです。

出力部分 パート2

ここからは、パート1の内容(出力に記載されているもの)をもとにして、「UTXO」という概念の説明に発展させていきます。(UTXOはちょっとややこしい概念なので、ゆったりと説明していきます。)

パート1で見てきたとおり、出力部分では送付額(下図①)や送付先(下図②)が指定されています。そうして台帳に記録されると、送付先に選ばれた人はその金額を受け取ることになります。

続いて考えたいのは、トランザクションによって金額を受け取った人が、どのように次回の支払いをするのかということです。

おそらく多くの人が、「トランザクションで金額を受け取った人は、銀行の口座残高が増えたような感じになって、その口座残高分を次の支払いにつかえるのだろう」と考えるのではと思います。ビットコインウォレットに表示される情報を見ていると、そのように感じてしまうと思います。

しかし、ビットコインで金額を受け取ったときの様子は、銀行口座に振り込んでもらったというよりも、お財布に現金(1枚のコイン)が加わったという感じに近いです。

ビットコインでは、トランザクションの出力部分を1枚のコインのような感覚で使います。たとえば、下図の出力の1行目では、8 BTCを受け取った人は、「8 BTC分のコイン」を受け取った感じとなり、そのコインを保管しておいたり支払いに使ったりできます。

例として、1 BTCの値段の車を、8 BTC分のコインで買うというシチュエーションがあったとして、このときの様子を考えてみましょう。

繰り返しとなりますが、8 BTC分のコインが500円玉のような1枚のコインである様子をイメージしてください。今回の例では8 BTC分のコインで1 BTC分を支払うのですが、8 BTCが1枚のコインだと考えると、都合よく1 BTC分だけ支払うことはできませんよね。そのため、8 BTCを渡して、7 BTCをおつりとして受け取るという流れになるはずです。

ビットコインでは上図のような感じで支払いを処理していて、実はトランザクションの構造は上図のようになっています。上図の様子と、トランザクションの構造を並べて確認してみましょう(下図)。

上図から、「支払い」部分がトランザクションの「入力」と対応していて、「受け取り」部分がトランザクションの「出力」と対応していることがわかります。

やや話がそれましたが、まとめます。

ビットコインのトランザクション出力は、ここまで見てきたように、送付する金額(下図①)と送付先アドレス等(下図②)を指定しています。そして、出力で宛先に指定されたアドレスは、指定された分の金額を1枚のコインのような感じで受け取ることになり、それを次回以降の支払いに使えます。

UTXOの説明はほとんど完了しています。ただ、もう少しだけ補足するために、パート3へと続きます。

出力部分 パート3

パート2では、8 BTC分を受け取った人がいて、その人が1 BTCの値段の車を買うというシチュエーションを取り上げました。

そのときの様子は、2つのトランザクションで表すことができます。1つ目は8 BTC分を受け取ったトランザクションで、2つ目は1 BTC分を車屋に送付するトランザクションです。

この2つのトランザクションを上から順に並べると、次のようになります。

ここで注目したいのは、8 BTCを受け取ったトランザクション出力を、次の支払い時のトランザクション入力で指定しているという点です。

ビットコインではこのように、トランザクションの出力の中でまだ使っていないものを次の支払いに使えるという仕組みになっていて、これこそがUTXOモデルと呼ばれるものです。

なぜ「UTXO」と呼ばれるかという疑問は、英語に変換して、英単語を並べてみるとわかります。「トランザクションの出力の中でまだ使っていないもの」は、未使用トランザクション出力(Unspent Transaction Outputs)と訳すことができ、その英語の頭文字などをとって「UTXO」というわけです。

「Transaction」は「TX」に変換されています。Transactionが長ったらしいからか、略語として「TX」を使うらしいです。

なんで「TX」なのかよくわからないのですが、Transaction(やり取り、取引)には交差するという意味合いがあって、それを表すために頭文字に「X」を付けているようです。「Digital transformation」が「DX」と表記されたりもしていますよね。

先ほどの1 BTCの車を買った例に当てはめて説明すると、ユーザーは8 BTC分のUTXOを保有していて、それを支払いに使ったという感じになります。

入力部分

続いて、トランザクションの左半分である入力パートを見ていきます。

入力部分はどのお金(UTXO)を渡すかを表していて、これには本人であることを示すための署名も含まれています。「どのUTXOを渡すか」は①(TXID)と②(idx)によって示されていて、署名を含んでいるのは③(sig-script, 署名スクリプト)です。

①TXID:
UTXOを含むトランザクション全体を、SHA-256で2度ハッシングした値です。つまり、トランザクション全体を入力として、SHA-256でハッシングを行った後、そのハッシュを入力として、再度SHA-256でハッシングしてできたハッシュです。

②idx:
トランザクションの出力のうちどれなのかを表す番号です。トランザクションの出力は2行以上あります。そのため、idx(インデックス)によって何行目なのかを示しています。一番上の出力なら「0」、上から2番目の出力なら「1」と数えます。

③署名スクリプト:
署名スクリプトは、Scriptという言語で書かれたプログラムです。プログラムに何が含まれているかはトランザクションの種類によりますが、一般的なトランザクション(P2PKH)の場合、要素署名と公開鍵が含まれています。

以下は署名スクリプトのイメージです。

トランザクション情報をもとに検証

繰り返しとなりますが、トランザクションは主に出力と入力で構成されていて、受取先として指定されているトランザクションの未使用の出力(UTXO)は、次の支払い時にトランザクション入力に指定することで支払いに使えるのでした。

トランザクションが正常かどうかは、上記の要素を見ながら検証します。ネットワークの検証者(フルノード)はもちろん、検証したいと思ったその他の一般ユーザーも、同様の方法で検証できます。


この記事が気に入ったらサポートをしてみませんか?