要了解UXTO,首先我們要理解狀態和事件:
確定的行爲一定導致確定的結果,這是同步的本質。這在程序裏面叫做事件與狀態。
狀態是無法同步的,因爲狀態的信息非常巨大,所以計算機同步的任何信息都是事件。
接着來看比特幣中UTXO的概念:
比如一百萬人的賬戶數字,是一個狀態,我不需要把這一百萬人的信息全部發過來。
我只需要發,現在誰的賬戶變動了,這就是事件。
基於同步的實際需要,同步的東西就應該是事件,而UTXO,就是這個事件。一個底層數據結構。
如果你要得到狀態,你需要遍歷所有的未使用事件,這是龐大的工作。
那麼什麼是UTXO
UTXO 是 Unspent Transaction Output 的縮寫,Transaction act發音簡寫爲X。既-未花費的輸出。
UTXO是中本聰最早在比特幣中採用的一個具體的技術方案。
在比特幣的設計中,並沒有賬戶概念,那麼如何回答如下問題:
用戶A有多少錢?
UTXO的答案是,看多少筆交易給了A錢並且A沒有花費掉,A就有多少錢。
以某個人爲例,每一筆交易有N個輸出,每個輸出都包括如下信息
{
address,//給誰
assetid,//什麼資產
value,//多少
}
找出所有 交易輸出地址爲A的並且沒有花費的交易,即可回答用戶A有多少錢。
花費與未花費
花費是什麼概念,每一個Transaction Output都猶如現實中的一張紙幣,他只有兩種狀態,屬於你或者不屬於你。
未花費就是該張紙幣屬於你,已花費就是該張紙幣不屬於你。
以某個人爲例,每一筆交易有N個輸入,每個輸入都包括如下信息
{
txid,//該輸入是哪一筆交易的輸出
n,//該輸入是上述交易的第幾個輸出
}
txid 和 n 可以對應到相應的交易輸出上,只要有txid 和 n 對應到交易輸出上。 該交易輸出稱爲已花費交易輸出。
沒有txid 和 n 對應到的交易輸出,稱爲未花費交易輸出。
聰明如你一定發現了,是不是如紙幣一樣只能花一次呢,是的。
你一定也發現了,現實中經常有找零的問題,UTXO的花費是否也存在找零問題呢,是的
找零
每個UTXO 都是一次性的,當用戶A給用戶B轉賬時,一定會碰到想轉的數額和自己的UTXO數值不匹配的問題。
此時採用的方法是,用多個輸出,有一些輸出還給自己,例如:
輸入(from x GAS:10)
輸出[0](to y gas:2)
輸出[1](to x gas:8)
這個機制稱爲找零,其實並不只是找零,如果用兜裏一把零碎utxo去轉賬,反而是找回一個整的。
輸入輸出都是由客戶端自行決定的。 可以在一筆交易中產生大量的輸出找給自己。
本文參考了:https://github.com/NewEconoLab/Docs