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: