比特幣原理——交易與UTXO

UTXO

UTXO (Unspent Transaction Output) 未花費交易輸出json

傳統的支付系統都是基於帳戶(account based)的,即:
若A向B轉帳20元網絡

  1. 判斷A的帳戶餘額大於等於20元;
  2. 在B的帳戶上加20元;
  3. 同時在A的帳戶上減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:

相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息