1. 程式人生 > 程式設計 >用java實現一個簡單的區塊鏈:UTXO交易模型

用java實現一個簡單的區塊鏈:UTXO交易模型

在上一篇用java實現一個簡單的區塊鏈中,我們主要講了什麼是區塊鏈(提示:區塊鏈就是談戀愛),以及區塊鏈是如何做到去中心化,不可篡改性的。然後就是通過解析國外一篇關於java區塊鏈的文章,用java實現了一個簡單的區塊鏈,當然,我們最後做出來的那個東西實在是有點太過於簡陋,原因是缺少了一個極為重要的流程-交易,再去描述如何用程式碼去實現具體的交易邏輯之前,我們首先需要先了解一下區塊鏈是如何進行交易的,具體的交易邏輯又是怎麼樣的等等這些問題,本篇文章,我們主要是從UTXO交易模型出發,淺入去了解一下UTXO交易系統究竟是如何運作的,和傳統的賬戶餘額模型相比又有些什麼樣的優勢?

少廢話,直接上東西

什麼是UTXO交易模型?

UTXO(Unspent Transaction Outputs)是未花費的交易輸出,提出者是中本聰。它是比特幣交易生成及驗證的一個核心概念。交易構成了一組鏈式結構,所有合法的比特幣交易都可以追溯到前向一個或多個交易的輸出,這些鏈條的源頭都是挖礦獎勵,末尾則是當前未花費的交易輸出。

每筆交易都有若干交易輸入,也就是資金來源,也都有若干筆交易輸出,也就是資金去向。一般來說,每一筆交易都要花費(spend)一筆輸入,產生一筆輸出,而其所產生的輸出,就是“未花費過的交易輸出”,也就是 UTXO

??? 沒看懂,抬走下一個。

的確,這個概念是有點小複雜,我擱這想半天也沒想出來啥奇妙的比喻(jojo梗

),如果上一篇文章我們把區塊鏈比作是談戀愛的話,那麼UTXO就是結婚送彩禮,前面是講我們是怎麼挖到礦的,UTXO就是講我們挖到的這筆錢是怎麼花的。

在上一篇文章的故事中,我們說到了由於區塊鏈的不可篡改性,小綠肯定會發現小明是個渣男欺騙了她,考慮到我們這篇文章講的是UTXO交易模型,小綠就不得不選擇原諒小明,並且還要答應小明的求婚。為了便於大家下面的理解,我打算先搬出來我們的次世代革命性產品-別逼幣

小明:哎,小綠他媽竟然給我要五個別逼幣的彩禮(不是罵人),我從哪弄這麼多別逼幣去,還跟我說什麼如果真心愛我們家小綠就別逼逼,一手交幣,一手交綠,這不明擺著打劫麼不是。

當天色漸晚的時候,鬱悶的小明

想起了自己家裡的那臺陪伴著自己長大的礦機,雖然它一次也沒挖到礦,每次啟動電錶都要倒轉,但是小明依然愛它,誰讓它接的是鄰居家的電線呢。晚上小明坐在礦機前面,按下了那被歲月附著了無數灰塵的開機鍵,隨著一聲聲轟隆轟隆的機器聲,一行小字緩緩顯示在了螢幕上面:

好運來,雞你太美,挖到合格雜湊,一塊錢四個,賤賣,嘿嘿,奧利給,誰tm買小米兒

上一篇文章我們說到過,**挖礦的本質其實就是通過雜湊計算得到符合條件的hash的過程。**但是問題在於,我計算出來的hash字串又是如何和比特幣產生聯絡的?它們兩個明顯都不是一個東西啊,關鍵就在UTXO交易模型上,那些礦場又是買礦機,又是交電費的,花那麼大的算力好不容易挖出來一個新的區塊,如果沒辦法轉化成比特幣的話那不是虧死,挖礦畢竟不是掃雷 原因就在這,每當礦工計算出一個合格的區塊的時候,該礦工就擁有了一個特權,那就是允許創造一個初始的交易( coinbase),收款人可以光明正大的寫自己的地址,並且可以在裡面放上一筆新錢。

放在現在的賬戶餘額交易系統裡面,就意味著如果你計算出一個新的區塊,那麼你就得到了一個特權,允許你直接在你銀行賬戶餘額的基礎上合法地加上指定的金額,當然也不是無限加,要不玩命往上加的話誰還挖什麼礦,比特幣的話,現在每解鎖一個新區塊將獲得12.5個比特幣的獎勵 ,這麼一操作我們計算出來的hash就實實在在地蛻變成我們的比特幣了,呼應上了。

可能是因為愛情的力量,小明竟然成功地挖到一個區塊,並且得到了建立一筆為10個別逼幣初始交易的特權,於是小明在這筆交易的收款欄填寫了自己錢包的地址,當然這還沒完,由於區塊鏈是去中心化的,需要更多的人認可才能保證這筆交易是合法的,不可竄改的,於是小明需要分別向六個節點去顯擺這件事。

小明:看見了沒,剛挖的,熱乎乎的別逼幣,10個,我全給打我錢包裡了,不信,這是賬單,羨慕吧,羨慕死你。

節點:知道了,滾。

經過六個節點的確認之後,這10個別逼幣就正式地合法地劃到了小明的名下。

小明:錢有了,剩下的就是去小綠家把彩禮交了把小綠娶回來了,剩下的5個別逼幣還可以帶小綠去王者峽谷度個蜜月什麼的。

但是別逼幣美元這種紙幣不一樣,不能說我給你10快,你找我5快那麼簡單,數字貨幣之所以安全,是因為除了初始的coinbase交易之外,其它所有的資金來源都必須來自於前面某個交易或者幾個交易的UTXO,就跟連結串列一樣,一個接一個,這就保證了區塊鏈的任何一筆交易都是可查的,任何一個交易被篡改,連結串列就不可能正確接上去,所有就很容易驗證這筆交易是不是合法的。而區塊鏈中大家都可以建立訂單進行交易,數字貨幣作為一個貨幣而言流動性就有了。

這個時候很多人就要問了,那第一筆交易之前指向誰呢?

問的好(誰問了?),在比特幣中,第一筆交易前一個交易為0

第二個就是任何一筆交易的交易輸入(資金來源)必須要等於交易輸出(資金去向)

對於小明來說,就自己有10個別逼幣,但是交彩禮的時候,不能一次只花5個別逼幣,而是一下都要把這10個別逼幣全部花出去,只不過,其中5個支付給了小綠他媽,5個支付給了自己。

在區塊鏈中,小明交彩禮的訂單大概如下圖所示:

這個訂單一共產生了兩個輸出,也就是兩個UTXO,一個是小綠他媽的,一個是小明自己的。

而且我們會發現,在整個交易過程中並沒有什麼餘額的概念,有的只是每一筆交易的輸入輸出,這個時候有的人可能就疑惑了,你這不對啊,那我比特幣錢包裡面明明顯示我還剩5個比特幣啊,這個餘額並不是類似於銀行系統顯示的你的賬戶餘額,而是比特幣錢包在掃描了整個區塊鏈所有的交易之後,通過聚合所有收款人是你的交易的金額計算出的。

就是說當你的錢包在掃描整個區塊鏈交易訂單的時候,發現 ,誒,這有一筆最新的交易地址填的是你的地址,於是就加進來算成你的餘額,當把所有指向你交易的訂單彙總計算之後,這個值就是你擁有的正確餘額,在比特幣系統中就是你擁有的比特幣數量。

為什麼一定要是最新的那一筆交易呢,比如說前面小明的輸出,挖礦的時候產生了一筆10個別逼幣輸出的訂單,然後交彩禮的時候又產生了一筆5個別逼幣輸出的訂單,如果直接聚合相加的話,那麼得到小明的餘額是15個別逼幣,顯然這是不對的,因為一筆新的交易是建立在之前的那筆訂單之上的,所以當一筆新的交易誕生的時候,之前的那筆訂單在統計的時候就會被認定為是過期的,而小明正確的餘額就最新的訂單的輸出聚合計算的結果,在本例中,也就是小明交彩禮生成的那個訂單,也就是小明還有5個別逼幣。

劃重點,朋友們要考的。

不論是比特幣還是萊特幣,其實說到底,根本沒有什麼所謂的數字貨幣,一切都只是UTXO而已

UTXO和賬戶餘額相比較優勢在哪裡?

  • 第一個:由於UTOX交易模型每一筆交易都可以追溯到與之對應的上一筆交易直至追溯到它誕生時挖出來的那個區塊為止,也就是連結串列找到頭,這個機制確保了區塊鏈的不可偽造性,即一筆交易不可以被重複支付。

  • 第二個:相對於傳統的賬戶餘額模型,UTXO由於只記錄最終狀態,因為統計餘額的時候只需要統計最新的訂單就好了,資料庫體積要比傳統賬戶餘額模型小很多。

但是這並不意味著傳統賬戶餘額相對於UTXO就一點優勢也沒了,首先,UTXO本身的實現邏輯上要比賬戶餘額複雜的多,其次是賬戶餘額可以很方便地看出整體,比如這個城市所有人的餘額近幾年是如何變化的,有著更好的發揮空間,而且相較於比特幣那種動不動就 0.00000001 個比特幣,傳統賬戶餘額可以很方便的控制交易的精度。

下面開始技術總結:

磕磕碰碰終於把這篇文章寫完了,相對於上一篇文章,這篇文章可能更加偏向於概念,UTXO交易模型對於經常程式設計的工程師來說並不是特別難於理解,但是對於剛剛接觸程式設計或者區塊鏈技術的人來說就確實有些抽象了,本篇文章在寫的過程中的確也下了許多功夫,意在希望讓各個階段的人都可以看懂這篇文章,知道UTXO交易模型是什麼。本來想和生活中類比一下,結果發現UTXO似乎是天然為區塊鏈數字貨幣設計的一樣,想不到什麼特別合適的比喻,於是隻能沿著上一篇文章的脈絡接著往下寫了。瞭解了UTXO的運作機制之後,下一篇文章我們仍然以國外的那兩篇部落格第二篇入手,以一個coder的角度去看UTXO在實際的開發中又是如何實現的,實現一個可交易的區塊鏈系統。

相關程式碼已經上傳至本人github。一定要點個star啊啊啊啊啊啊啊

萬水千山總是情,給個star行不行

韓數的開發筆記

歡迎點贊,關注我,有你好果子吃(滑稽)