UTXO (Unspent Transaction Output) 未花費交易輸出json
傳統的支付系統都是基於帳戶(account based)的,即:
若A向B轉帳20元網絡
使用UTXO模型的加密貨幣中,某一個「帳戶」中的餘額並非由一個數字表示,而是當前區塊鏈網絡中全部跟當前「帳戶」有關的UTXO組成。也就是,比特幣地址帳戶中的「餘額」實際上並非比特幣,而是「UTXO」。區塊鏈
我的感受直接看概念不太好理解,舉例子更好些。加密
交易1001:張三經過挖礦獲得12.5個比特幣(或者叫12.5個UTXO),輸出到張三的地址上
交易2001:張三轉帳給李四2.5個比特幣,輸入來自交易1001中張三地址的12.5個UTXO,輸出包括給李四的2.5比特幣還包括10個UTXO回到張三的地址
交易3001:張三和李四分別向王五轉2.5個比特幣,本次交易的輸入來自2001中的兩個輸出,本次交易的輸出分別爲王五獲得的5個UTXO和張三剩餘的7.5個UTXO。3d
每一個區塊中的第一個交易都是挖礦所得的比特幣,只有輸出沒有輸入,叫作Coinbase。
code
{ "addr":"14uhqGYDEhqwfdoP59QdLWdt4ha5CHttwQ", "n":1, "script":"76a9142ae017a5bd24a3f935897085253e503fbfd66f4e88ac", "spent":false, "tx_index":335926477, "type":0, "value":21680000 }
上面展現了一個UTXO的json數據,其中包含了當前UTXO所屬的交易索引tx_index、交易接收方地址addr以及交易數額value。blog
UTXO屬於交易中的一部分,交易由輸入和輸出兩部分組成。一筆交易的數據格式以下:索引
{ "txid":"5be7a9e47f56c98e5297a44df52da0475f448ece98bb51489103cdf70653092f", "hash":"5be7a9e47f56c98e5297a44df52da0475f448ece98bb51489103cdf70653092f", "version":1, "size":224, "vsize":224, "locktime":0, "vin": [...], "vout": [...], "hex":"0100000001a90b4101e6cbb75e1ff885b6358264627581e9f96db9ae609acec98d72422067000000006b483045022100c42c89eb2b10aeefe27caea63f562837b20290f0a095bda39bec37f2651af56b02204ee4260e81e31947d9297e7e9e027a231f5a7ae5e21015aabfdbdb9c6bbcc76e0121025e6e9ba5111117d49cfca477b9a0a5fba1dfcd18ef91724bc963f709c52128c4ffffffff02a037a0000000000017a91477df4f8c95e3d35a414d7946362460d3844c2c3187e6f6030b000000001976a914aba7915d5964406e8a02c3202f1f8a4a63e95c1388ac00000000", "blockhash":"0000000000000000000c23ca00756364067ce5e815deb5982969df476bfc0b5c", "confirmations":5, "time":1521981077, "blocktime":1521981077 }
其中「vin」和「vout」就是表明輸入和輸出。
每筆合法交易中,全部的輸入之和必須大於全部的輸出之和,其中的差值就是交易手續費。ip
sum(inputs.vlaue) = sum(outputs.value) + fee
輸入以下:input
{ "vin":[ { "txid":"672042728dc9ce9a60aeb96df9e9817562648235b685f81f5eb7cbe601410ba9", "vout":0, "scriptSig":{ "asm":"3045022100c42c89eb2b10aeefe27caea63f562837b20290f0a095bda39bec37f2651af56b02204ee4260e81e31947d9297e7e9e027a231f5a7ae5e21015aabfdbdb9c6bbcc76e[ALL] 025e6e9ba5111117d49cfca477b9a0a5fba1dfcd18ef91724bc963f709c52128c4", "hex":"483045022100c42c89eb2b10aeefe27caea63f562837b20290f0a095bda39bec37f2651af56b02204ee4260e81e31947d9297e7e9e027a231f5a7ae5e21015aabfdbdb9c6bbcc76e0121025e6e9ba5111117d49cfca477b9a0a5fba1dfcd18ef91724bc963f709c52128c4" }, "sequence":4294967295 } ] }
輸入數據包含 引用的UTXO所在交易的哈希txid,引用的UTXO索引(從0開始)vout。經過txid和vout兩個字段,就能夠在區塊鏈上定位到惟一的UTXO。
輸出以下:
{ "vout":[ { "value":0.10500000, "n":0, "scriptPubKey":{ "asm":"OP_HASH160 77df4f8c95e3d35a414d7946362460d3844c2c31 OP_EQUAL", "hex":"a91477df4f8c95e3d35a414d7946362460d3844c2c3187", "reqSigs":1, "type":"scripthash", "addresses":[ "3CcqrGq4oQcfx3u75ijj4tDiqf4HJvhoeP" ] } }, { "value":1.84809190, "n":1, "scriptPubKey":{ "asm":"OP_DUP OP_HASH160 aba7915d5964406e8a02c3202f1f8a4a63e95c13 OP_EQUALVERIFY OP_CHECKSIG", "hex":"76a914aba7915d5964406e8a02c3202f1f8a4a63e95c1388ac", "reqSigs":1, "type":"pubkeyhash", "addresses":[ "1GedHcxdxq2tab98hqAmREUK9BBYHKznof" ] } } ] }
每個未被使用的vout就是一個UTXO,vout中包含了輸出的額度value,以及對應的到帳地址。
在每一筆交易中,能夠存在多個輸入和多個輸出,好比一個地址的比特幣是由多個地址的轉帳而來的。每個UTXO至關於一個面值不可分割的硬幣,A擁有一個1比特幣的UTXO和一個5比特幣的UTXO,當向B轉帳2比特幣時,就會從A的5比特幣UTXO花費掉,其中2比特幣UTXO給了B,另外3比特幣UTXO找零返還給本身。
這張圖就是一個地址的多個UTXO做爲輸入:
這張圖是一個地址的UTXO轉帳一部分,剩餘的做爲找零,成爲發送方的一個新UTXO: