UTXOという仮想通貨の仕組みがありまして。
会計や簿記が頭に入っている方からすると
「あー、複式簿記の仕訳データだけが記録されているんだね」
「アドレスの合計額を出すには、全仕訳から当該アドレスの額を合計するんだね」
と理解されていると思います。
二番煎じになるかもしれませんが、ググって出てきたものだとわかりずらく感じましたので、私が簿記の観点から記事を書きたいと思います。
読者としては
「UTXOがわからん。
仮想通貨にはアカウントベースとUTXOベースのものがあるらしい事を知った。
BTCはUTXOを使っているらしい。
簿記が少しわかる」
という方を想定しています。
文系・理系と分けることに意義を感じませんが、あえて言えば文系よりの記事です。
間違っているところがあれば、ご指摘ください。
----------------(‘ω’ っ )3
まず、UTXOの確認です。
UTXOは「Unspent Transaction Output」の略だそうです。
未使用のトランザクションアウトプット、といわれますが、和訳になっていないですよね?
未使用のトランザクションアウトプット、と言われて「ほう、なるほど」と納得する方はいるんでしょうか?
ここでは思い切って「送金可能な残高」と訳します。
----------------(‘ω’ っ )3
次に、仕訳というものの確認をします。
仕訳は、簿記の世界で、一つの取引に対して記帳する事を言います。
例えば、
A社はB社から商品を現金100円で購入した、という仕訳は
(商品)100円 (現金)100円
と記帳します。
これは、商品を現金と交換したことを表し、商品という資産が増えて現金という資産が減ったことを意味します。
B社は
(現金)100円 (商品)100円
と記帳します。ちょうど真逆です。
なので、B社からすると、現金という資産が増えて商品という資産が減ったことを意味します。
簡単ですね。
ここでは、現金・商品、双方ともに「資産」というグループに属することに注意してください。
資産というグループは、左に記帳されればその資産が増え、右に記帳されれば減ったことになります。
(簿記の世界では、左側を借方、右側を貸方といいますが、本記事では左右で書きます。借方・貸方を覚えても暗号資産の世界では意味がなさそうだからです)
簿記の仕訳は何となくご理解いただけたでしょうか?
----------------(‘ω’ っ )3
次に、T字勘定について説明します。簿記関連の説明です。
A社はB社から商品を現金100円で購入した、という仕訳を各表示項目ごとに見ていきます。
各表示項目というのは「商品」や「現金」のことです。
A社の立場から書きます。
商品
------------------------------------------------
(現金)100円 |
A社の商品は増えました。
商品は資産なので、左側に記帳されると増えるのでした。
現金で商品を購入したので、このように書きます
現金
------------------------------------------------
|(商品)100円
A社の現金は減りました。
現金は資産なので、右側に記帳されると減るのでした。
商品を購入した対価を現金で支払ったので、このように書きます
仕訳と同じく、B社のT字勘定はA社のそれと真逆になります。
商品
------------------------------------------------
|(現金)100円
現金
------------------------------------------------
(商品)100円 |
各表示項目がどうなったのか、内訳と金額がわかる仕組みになっています。
----------------(‘ω’ っ )3
では、実際のビットコインの送金にそって、仕訳とT字勘定で表します。
5BTCのUTXOをもつAアドレスがBアドレスに1BTC送金しました。送金料は0.0001BTCです。
尚、Aアドレスに他にUTXOは存在しません。
Aアドレスからすると
A
------------------------------------------------
(XX)5BTC |
この状況からスタートするという事になります。
「(XX)」となっていますが、実際にはCEX(中央集権型交換所)から購入した、などの内訳が考えられます。
それを仕訳で書くと、
(A)5BTC (500万円)5BTC
としてもいいように思います。
Aアドレスの持ち主が主体となって、仕訳を記帳するという考え方です。
(*ここでは1BTC=100万円として計算)
金額が表示項目(勘定のことです)になっている点に違和感を持つ方がいると思います。
が、これは意図したものです。
BTCの送金を仕訳で表すときの表示金額は「BTC」です。
BTCの送金料は、BTCでしか払えないからです。
だから、金額の単位はあくまで「BTC」なのです。
なので、5BTCを500万円で購入した、という取引は、既存の外貨換算会計とは別に「5BTCを、それと等価値の500万円という資産で交換した」という解釈で仕訳を作成しました。
(A銀行預金)500万円 (商品)500万円
という仕訳と同じイメージです。
上記の仕訳を前提として、T字勘定で表すと
A
------------------------------------------------
(500万円)5BTC |
500万円
------------------------------------------------
|(A)5BTC
となります。
しかし、
現状、会計処理として求められているのは「移動平均法」と「総平均法」のみです。
仕様に忠実に会計処理を行うのであれば、UTXOを一つの塊とみてそれぞれの値段をタグ付けする方法も考えられるのですが、会計は実務的なものです。システム上でプログラムがどのように動いているのか、利用者は知らなくてもいい程深い部分である以上、会計処理にここまで厳密さを求めるのは、コストメリットの観点からよろしくなさそうです。
さらに、実際は、取引所で購入しようが、誰かから送金されようが、ビットコインネットワーク内での持ち分の変動でしかありません。
もう一度書きますが、上記の仕訳案は「Aアドレスの持ち主が主体となって、仕訳を記帳するという考え方」です。
ここでは、UTXOの理解のための仕訳なので、おとなしく「アドレスXXから送金されたとして」
(A)5BTC (XX)5BTC
T字勘定は先述の通り
A
------------------------------------------------
(XX)5BTC |
とします。
送金の仕訳は
(B) 1BTC (A)5BTC
(送金料)0.0001BTC
(A) 3.9999BTC
という仕訳になります。
ここでも疑問点・違和感がある方がおられると思います。
相殺して
(B) 1BTC (A)1.0001BTC
(送金料)0.0001BTC
としても良さそうだからです。
しかし、UTXOは分割できません。
なので「おつり」が発生します。
それが、左側にある「(A)3.9999BTC」の部分です。
Aアドレスには元々5BTCのUTXOがありました。それを分割できないのでBアドレスに1BTCを送金し、送金料をマイナーに支払い、おつりをAアドレスで受け取ったのですね。
それぞれ、3.9999BTCのUTXO、1BTCのUTXOを受け取ったことになります。
これをT字勘定で表すと
A
------------------------------------------------
(XX) 5BTC |(B) 1BTC
(A) 3.9999BTC |(送金料) 0.0001BTC
|(A) 3.9999BTC
B
------------------------------------------------
(A) 1BTC |
となります。
AアドレスのT字勘定に違和感を抱く方がおられるかと思いますが、
(B) 1BTC (A) 1BTC
(送金料)0.0001BTC (A)0.0001BTC
(A) 3.9999BTC (A)3.9999BTC
と分解するとわかりやすいかと思います。
Bアドレスへの送金分と送金料を差し引いた分と、おつり分で左右双方に3.9999BTCが記述されます。
----------------(‘ω’ っ )3
ここで「T字勘定って意味なくない?面倒なだけなんだけど」と思われる方がおられると思います。
そこで、BTCの現実と同じように取引を複雑にしていきます。
例を少し増やします。
上記を前提として、
Aアドレスからさらに1BTCを送金、プライバシーを鑑みおつりはCアドレスで受け取る。
次に、Bアドレスから1.6BTCをAアドレスに送金する。おつりはBアドレスで受け取る。
尚、送金料はそれぞれ0.0001BTCとする。
仕訳は
(B) 1BTC (A)3.9999BTC
(送金料)0.0001BTC
(C) 2.9998BTC
と
(A) 1.6BTC (B)1BTC
(送金料)0.0001BTC (B)1BTC
(B) 0.3999BTC
となります。
後者で「1BTCが二つ」となっているのはAから送付されたUTXOとお考え下さい。
実際には、もっと送ったり送られたりが複雑に絡み合います。
仕訳だけで見ていくと、Aアドレスに現在いくらあるのか、Bアドレスに現在いくらあるのかがわかりずらいと思うのですね。
T字勘定を書いていくとわかりやすくなります。
T字勘定はそれぞれの表示科目(実際上、アドレス)の左右残高を求め、差分を出すことで残高を計算できるからです。
AからBに1BTC追加送金した時点では
A
------------------------------------------------
(XX) 5BTC |(B) 1BTC
(A) 3.9999BTC |(送金料) 0.0001BTC
|(A) 3.9999BTC
|(B) 1BTC
|(送金料) 0.0001BTC
|(C) 2.9998BTC
差分は0
最下部右側、「(C) 2.9998BTC」はAアドレスから利用した差分です。
今回は「おつり」をCアドレスに送るので左側にはありません。
B
------------------------------------------------
(A) 1BTC |
(A) 1BTC |
差分は2BTC
C
------------------------------------------------
(A) 2.9998BTC |
2.9998BTC
BからAに1.6BTC送金すると
A
------------------------------------------------
(XX) 5BTC |(B) 1BTC
(A) 3.9999BTC |(送金料) 0.0001BTC
|(A) 3.9999BTC
|(B) 1BTC
|(送金料) 0.0001BTC
|(C) 2.9998BTC
(B) 1.6BTC |
差分は1.6BTC
B
------------------------------------------------
(A)1BTC |
(A)1BTC |
(B)0.3999BTC |(A) 1.6BTC
|(送金料)0.0001BTC
|(B) 0.3999BTC
差分は0.3999BTC
(1.6BTCは1BTC のUTXO二つ分から作成されたものです。ここではその作成過程は仕訳を切っていませんのでT字勘定にも書いていません)
C
------------------------------------------------
(A) 2.9998BTC |
差分は 2.9998BTC
----------------(‘ω’ っ )3
UTXOベースのデータは、仕訳がズラズラと流れているような状況です。
会計でいうところの貸借対照表を作る状況がない。取引履歴である仕訳だけがあるのですね。
そのため「現在Aアドレスには残高がいくらあるのか?」という事を調べるためには、T字勘定を書くような処理を行って、差分として当該アドレスにいくら残高があるのかを計算します。
とても面倒ですね。
そういうわけで
こちらで書きましたように、libraは開発速度を重視してアカウントベースになっているのではないかと思うのです。
もちろん、UTXOにも、プライバシー機能としての意味合いやリプレイアタック耐性があるなどの利点はあるようです。
----------------(‘ω’ っ )3
というわけで、簿記・会計を少しでもかじっている方が、UTXOをわかった風になるための記事でした。
ではでは。
?