比特幣簽名交易系列——02UTXO

UTXO 在比特幣中是一個核心的概念,它描述了比特幣的記賬模型。

傳統的記賬模型是賬戶型的,例如銀行賬號。給每個銀行賬號一個叫balance的字段,表示這個賬號目前有多少錢。當在兩個賬號之間要發生轉賬的時候,把轉賬發送方的balance字段減去發送的金額,然後在轉賬的接收方的balance字段加上發送的金額,然後這筆轉賬就成功了。以太坊使用的正是這種賬號模型。

但是UTXO不是這樣子的。UTXO是Unspent  Transaction Output的縮寫,中文意思是,未花費交易輸出。它的落腳點在於交易輸出。交易輸出又分爲兩種類型:一種是已經花費出去了,另一種是沒有花費出去的。花出去的交易輸出就是一筆死賬,已經被固定了,成了歷史了,永遠不能變動。而未花費交易輸出纔是我們的主角,是活的,在將來能夠被拿來使用。那到底什麼是交易輸出呢?

有交易輸出,那自然就有交易輸入。可以這麼來看,一筆完整的交易,包含交易的入口和出口。入口就是交易金額從哪裏來,出口就是交易金額到哪裏去。例如假設有一筆交易“小明給小紅轉賬10元”。這裏交易入口就是小明轉出10元,這也就是交易輸入,而小紅被轉入10元,就是交易的出口(交易輸出)。結構化就如下所示:

{
"交易輸入":"小明轉出10元",
"交易輸出":"小紅被轉入10元",
}

這只是開始,更重要的一點是,交易的輸入必須來源於之前的交易的輸出!這個怎麼理解?這個需要把眼光放長一點來看。依然舉上面“小明給小紅轉賬10元”這個例子,爲什麼說這筆交易的交易輸入“小明轉出10元”要來源於之前的交易輸出呢?這是因爲小明的這10元,肯定也是別人轉給他的。例如來自他媽媽給的零花錢。也就是說雖然在這次“小明給小紅轉賬10元”交易中“小明轉出10元”是交易輸入,但這筆錢的來源在之前的一筆交易“小明媽媽轉50元錢給小明”,而在這筆交易中,“小明被轉入50元”是交易輸出,這筆交易的金額要大於小明轉10元給小紅的那筆交易。如果瞭解過複式記賬法的朋友可能一眼就看出,這就是複式記賬法。也就是每一筆交易的輸入都要去追溯它的來源。現實中一筆交易的最終來源來自國家銀行發行貨幣。而在比特幣系統中,每一筆交易的交易來源都可以追溯到coinbase交易。也就是礦工挖礦獲得的系統獎勵。比特幣系統中,從一開始礦工每挖到一個合法的區塊,系統會獎勵礦工50個比特幣。之後每隔21萬個區塊(按照平均每隔10分鐘出一個塊,是4年)就減半系統礦工的獎勵,在比特幣系統裏最終發行2100萬個比特幣後就不再從系統中生出比特幣獎勵礦工了,而是讓礦工自己收取交易手續費。

UTXO的結構如下:

type UTXO struct {
	Txid string
	Vout uint64
	Amount uint64
	ScriptPubKey string
}

其中,txid表示之前某一筆交易的id。

而vout表示上次交易輸出在上次交易中的所有交易輸出的位置(從0開始)。還是舉上面“小明轉賬10元給小紅”的例子,這裏小明的10元錢來源於哪裏呢?也許來自於這麼一筆轉賬:“小明媽媽轉賬20元給小明爸爸,同時轉10元給小明”。這樣在這筆轉賬中就有兩筆交易輸出。小明媽媽轉給小明爸爸的是第一筆,而轉給小明的是第二筆,這樣轉給小明的交易輸出索引就是1(因爲從0開始計算)。在UTXO的世界裏,一筆交易中,不僅交易輸出可以有多個,交易輸入也可以有多個。也就是說一筆被打包的交易,它可以包含N筆交易輸入和M筆交易輸出。還是舉上面“小明轉賬10元給小紅”的例子,這裏小明的10元錢來源於哪裏呢?可以使從多筆交易中來,例如“爸爸轉賬2元給小明”,“奶奶轉賬4元給小明”,“媽媽轉賬4元給小明”,這樣三筆交易共同湊成了這次小明轉給小紅的數額。不知道我解釋清楚了沒有。

接下來Amount表示轉入的金額。

而最後ScriptPubKey,是另一個重頭戲,表示一段腳本代碼。爲什麼這裏會有腳本代碼?請看下回分析。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章