
同事小張前段時間休假去泰國,滿世界都是白牙齒咧嘴笑的美女,小張心情無限好。他走進一家商店買飲料,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),不知道為啥我覺得這個用“花錢找零”的類比解釋來蠻好理解的哈哈哈~也許是我哪個地方理解還不夠深刻,大家可以去看看他的文章,歡迎給我提出建議~