遇上數(shù)學不好的收銀員怎么辦?(有關UTXO要知道的)|從0開始學習區(qū)塊鏈08

(圖片來源于網(wǎng)絡)

同事小張前段時間休假去泰國,滿世界都是白牙齒咧嘴笑的美女,小張心情無限好。他走進一家商店買飲料,16元。小張遞過去一張20元紙幣,想了想,又遞過去1塊錢,“美女,找零湊個整?!彼緲愕哪樕蠈憹M了真誠。


收銀員妹子拿到小張遞過去的1塊錢,眉頭緊蹙。完蛋了,妹子數(shù)學不好,明明給你4塊錢就行又給我1塊是啥意思?妹子看著計算器上顯示的4塊,從抽屜取出4個硬幣,又把手里還沒焐熱的那個1塊一起還給了小張。整個操作無(尷)縫(尬)銜(至)接(極)哈哈哈。


小張內(nèi)心OS:說好的湊個整,一把1塊啥意思?

妹子內(nèi)心OS:這人不會是個傻子吧,還給1塊干啥?是我太美?


收銀員妹子為啥這么糾結(jié)?對,因為她要計算余額。把小張的操作分開看可以是這樣:


操作一:

小張一共給21元,先給20元,又給1元,

收銀員計算:

20-16=4,小張買一瓶水應該找給小張4元。

4+1=5,小張剛剛又遞過來1元,現(xiàn)在我有5元,這5元都是要給小張的。

收銀員給小張5元。


操作二:

小張有2張錢,1個1塊1個20塊,買水拿20塊就夠了,所以1塊錢不動,給20元。

收銀員計算:

20-16=4

收銀員給小張4元,小張手里還有剛剛的1元,共5元


小張手里都是5元,但是操作二收銀員明顯少算1步,對于數(shù)學不好的人來說這可是減輕一個大負擔。你設想下,這只是極端的小例子,把這個放大,100個小張“要湊整錢”,1000個小張“要湊整錢”,收銀員妹子腦子還夠用么能不氣么?(替妹子鄙視小張哈哈)


把這個問題放在比特幣世界,要引出今天的話題,UTXO(Unspent Transaction Output),即未花費的交易輸出。


把上面例子中小張的錢變成比特幣,小張手里的5塊就是未花費的交易輸出,而小張買水的錢花出去了,就是花費的交易輸出。


為什么舉小張買水的例子呢?因為UTXO的計算方式很像操作二只確認交易本身,以及比較反直覺。


只確認交易本身,舉個例子:UTXO方式care的是小張給收銀員多少錢,收銀員收到了多少;不去管每一次找零小張錢包里還有多少,收銀員抽屜里賺了幾萬。如果你想知道小張錢包還有多少錢咋辦呢?你只需要計算在這個時間點之前,小張錢包進進出出的總數(shù)據(jù),加加減減瞬間get小張的存量。


這樣做有什么好處呢?


首先,計算上減輕了負荷。計算小意味著數(shù)據(jù)庫輕便,比特幣運行8年多,所有交易記錄的數(shù)據(jù)可以拷貝在一臺電腦上。同理,想想天貓想想京東,1天的交易記錄需要成百上千臺服務器支持,為什么呢,因為數(shù)據(jù)庫太大。


其次,這種方式可以避免雙重支付。這里對比用“余額”的數(shù)據(jù)庫方式。


用余額需要實時更新每個用戶的賬戶剩余數(shù)額。比如小張今天在商店買了8次東西,啤酒飲料瓜子花生礦泉水。系統(tǒng)在小張每一次買東西都會更新一次:錢包余額80個比特幣,錢包余額25個比特幣,錢包余額16個比特幣……看似沒有波瀾,一番買賣之后,暗黑的小張上線了——


小張買了一個蘋果,用比特幣錢包支付1比特幣,支付出去了但是礦工還沒有確認。小張對收銀員哈哈一笑,收銀員妹子就被迷惑了,只看了賬戶有小張支付的幣,便把紅彤彤的蘋果給了小張。注意,這里收銀員妹子的賬戶上顯示的是小張確實支付了1個幣,只是沒有礦工給他確認。我們前面講過分叉的概念,這時候,小張就利用分叉的特性開始做壞事了。


小張出門即進入下一個商店,用剛剛的那個買蘋果的比特幣又買了1個梨,并且找礦工把這筆交易確認了。而且是利用算力呼哩嘩啦找了6個礦工確認。


好了,現(xiàn)在收銀員妹子懵逼了。剛剛看余額顯示小張的幣支付了,只是沒確認,現(xiàn)在一看,納尼?小張支付的幣沒有了!小張利用算力和分叉把1個比特幣當作2個花,嘖嘖嘖~


蘋果已經(jīng)被小張吃下肚,可小張的比特幣給了隔壁超市老王。妹子氣暈。


這就是雙重支付問題。現(xiàn)實生活中,1筆款不可能實時到賬,交易越多越容易出現(xiàn)確認延遲的情況。當?shù)V工沒有完成確認的時候,小張可以把這筆錢再次付給另一個商家,只要他的算力足夠,讓新的交易得到多個確認,并把寫上這個交易的塊變成最長鏈。


為了避免雙重支付問題,現(xiàn)在一般要求收款方這么做:等到幣到賬,并且6個礦工確認,再發(fā)貨。一旦6個礦工確認了,想要硬分叉改變剛剛的交易記錄需要很大的算力,這時候作案成本太高,發(fā)生這種事情的概率就小。


再來說下反直覺。文章開頭小張花了16元買水,小張有1個20元,1個1元,這時候系統(tǒng)會從小張的地址上扣20,而不是16。小張輸出的是20,還有4塊是未花費輸出。這時候小張有2個未花費輸出,1個4元,1個1元。


這個過程和我們平時花錢的習慣有點不同,但是也很好理解。你只要想到小張手里的比特幣就像紙幣,不能撕開,必須一次出一整個,這樣就好明白一些。你雖然花出去了20,但是系統(tǒng)會給你找零,4塊還會回到你的地址上。這里只是讓大家對概念更加清晰,實際交易上并沒有太多干擾。


OK,讓我們再來回顧一下,UTXO是未花費的交易輸出,它只對應著地址概念,并非我們熟悉的“賬戶和余額”。UTXO只確認交易本身,因此交易計算量小數(shù)據(jù)庫也小,運行至今未曾有誤。當然,UTXO也有著一些讓人不適應的特點,每次的幣不能拆開來花,不過不影響交易~好啦,這就是今天要講的區(qū)塊鏈知識,讓我們共同進步!

PS,感謝小張親身演繹~哈哈哈~


注:

反直覺這個概念是引用湯強老師的《李笑來的比特幣賬戶并沒有余額》,公眾號:湯強(tangqiang0401),不知道為啥我覺得這個用“花錢找零”的類比解釋來蠻好理解的哈哈哈~也許是我哪個地方理解還不夠深刻,大家可以去看看他的文章,歡迎給我提出建議~

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容