同事小張前段時(shí)間休假去泰國(guó)昼丑,滿世界都是白牙齒咧嘴笑的美女,小張心情無(wú)限好夸赫。他走進(jìn)一家商店買飲料菩帝,16元。小張遞過(guò)去一張20元紙幣茬腿,想了想呼奢,又遞過(guò)去1塊錢,“美女切平,找零湊個(gè)整握础。”他淳樸的臉上寫滿了真誠(chéng)悴品。
收銀員妹子拿到小張遞過(guò)去的1塊錢禀综,眉頭緊蹙简烘。完蛋了,妹子數(shù)學(xué)不好定枷,明明給你4塊錢就行又給我1塊是啥意思孤澎?妹子看著計(jì)算器上顯示的4塊,從抽屜取出4個(gè)硬幣依鸥,又把手里還沒(méi)焐熱的那個(gè)1塊一起還給了小張亥至。整個(gè)操作無(wú)(尷)縫(尬)銜(至)接(極)哈哈哈。
小張內(nèi)心OS:說(shuō)好的湊個(gè)整贱迟,一把1塊啥意思姐扮?
妹子內(nèi)心OS:這人不會(huì)是個(gè)傻子吧,還給1塊干啥衣吠?是我太美茶敏?
收銀員妹子為啥這么糾結(jié)?對(duì)缚俏,因?yàn)樗?jì)算余額惊搏。把小張的操作分開看可以是這樣:
操作一:
小張一共給21元,先給20元忧换,又給1元恬惯,
收銀員計(jì)算:
20-16=4,小張買一瓶水應(yīng)該找給小張4元亚茬。
4+1=5酪耳,小張剛剛又遞過(guò)來(lái)1元,現(xiàn)在我有5元刹缝,這5元都是要給小張的碗暗。
收銀員給小張5元。
操作二:
小張有2張錢梢夯,1個(gè)1塊1個(gè)20塊言疗,買水拿20塊就夠了,所以1塊錢不動(dòng)颂砸,給20元噪奄。
收銀員計(jì)算:
20-16=4
收銀員給小張4元,小張手里還有剛剛的1元人乓,共5元
小張手里都是5元梗醇,但是操作二收銀員明顯少算1步,對(duì)于數(shù)學(xué)不好的人來(lái)說(shuō)這可是減輕一個(gè)大負(fù)擔(dān)撒蟀。你設(shè)想下,這只是極端的小例子温鸽,把這個(gè)放大保屯,100個(gè)小張“要湊整錢”手负,1000個(gè)小張“要湊整錢”,收銀員妹子腦子還夠用么能不氣么姑尺?(替妹子鄙視小張哈哈)
把這個(gè)問(wèn)題放在比特幣世界竟终,要引出今天的話題,UTXO(Unspent Transaction Output)切蟋,即未花費(fèi)的交易輸出统捶。
把上面例子中小張的錢變成比特幣,小張手里的5塊就是未花費(fèi)的交易輸出柄粹,而小張買水的錢花出去了喘鸟,就是花費(fèi)的交易輸出。
為什么舉小張買水的例子呢驻右?因?yàn)閁TXO的計(jì)算方式很像操作二什黑,只確認(rèn)交易本身,以及比較反直覺(jué)堪夭。
只確認(rèn)交易本身愕把,舉個(gè)例子:UTXO方式care的是小張給收銀員多少錢,收銀員收到了多少森爽;不去管每一次找零小張錢包里還有多少恨豁,收銀員抽屜里賺了幾萬(wàn)。如果你想知道小張錢包還有多少錢咋辦呢爬迟?你只需要計(jì)算在這個(gè)時(shí)間點(diǎn)之前橘蜜,小張錢包進(jìn)進(jìn)出出的總數(shù)據(jù),加加減減瞬間get小張的存量雕旨。
這樣做有什么好處呢扮匠?
首先,計(jì)算上減輕了負(fù)荷凡涩。計(jì)算小意味著數(shù)據(jù)庫(kù)輕便棒搜,比特幣運(yùn)行8年多,所有交易記錄的數(shù)據(jù)可以拷貝在一臺(tái)電腦上活箕。同理力麸,想想天貓想想京東,1天的交易記錄需要成百上千臺(tái)服務(wù)器支持育韩,為什么呢克蚂,因?yàn)閿?shù)據(jù)庫(kù)太大。
其次筋讨,這種方式可以避免雙重支付埃叭。這里對(duì)比用“余額”的數(shù)據(jù)庫(kù)方式。
用余額需要實(shí)時(shí)更新每個(gè)用戶的賬戶剩余數(shù)額悉罕。比如小張今天在商店買了8次東西赤屋,啤酒飲料瓜子花生礦泉水立镶。系統(tǒng)在小張每一次買東西都會(huì)更新一次:錢包余額80個(gè)比特幣,錢包余額25個(gè)比特幣类早,錢包余額16個(gè)比特幣……看似沒(méi)有波瀾媚媒,一番買賣之后,暗黑的小張上線了——
小張買了一個(gè)蘋果涩僻,用比特幣錢包支付1比特幣缭召,支付出去了但是礦工還沒(méi)有確認(rèn)。小張對(duì)收銀員哈哈一笑逆日,收銀員妹子就被迷惑了嵌巷,只看了賬戶有小張支付的幣,便把紅彤彤的蘋果給了小張屏富。注意晴竞,這里收銀員妹子的賬戶上顯示的是小張確實(shí)支付了1個(gè)幣,只是沒(méi)有礦工給他確認(rèn)狠半。我們前面講過(guò)分叉的概念噩死,這時(shí)候,小張就利用分叉的特性開始做壞事了神年。
小張出門即進(jìn)入下一個(gè)商店已维,用剛剛的那個(gè)買蘋果的比特幣又買了1個(gè)梨,并且找礦工把這筆交易確認(rèn)了已日。而且是利用算力呼哩嘩啦找了6個(gè)礦工確認(rèn)垛耳。
好了,現(xiàn)在收銀員妹子懵逼了飘千。剛剛看余額顯示小張的幣支付了堂鲜,只是沒(méi)確認(rèn),現(xiàn)在一看护奈,納尼缔莲?小張支付的幣沒(méi)有了!小張利用算力和分叉把1個(gè)比特幣當(dāng)作2個(gè)花霉旗,嘖嘖嘖~
蘋果已經(jīng)被小張吃下肚痴奏,可小張的比特幣給了隔壁超市老王。妹子氣暈厌秒。
這就是雙重支付問(wèn)題读拆。現(xiàn)實(shí)生活中,1筆款不可能實(shí)時(shí)到賬鸵闪,交易越多越容易出現(xiàn)確認(rèn)延遲的情況檐晕。當(dāng)?shù)V工沒(méi)有完成確認(rèn)的時(shí)候,小張可以把這筆錢再次付給另一個(gè)商家蚌讼,只要他的算力足夠棉姐,讓新的交易得到多個(gè)確認(rèn)屠列,并把寫上這個(gè)交易的塊變成最長(zhǎng)鏈。
為了避免雙重支付問(wèn)題伞矩,現(xiàn)在一般要求收款方這么做:等到幣到賬,并且6個(gè)礦工確認(rèn)夏志,再發(fā)貨乃坤。一旦6個(gè)礦工確認(rèn)了,想要硬分叉改變剛剛的交易記錄需要很大的算力沟蔑,這時(shí)候作案成本太高湿诊,發(fā)生這種事情的概率就小。
再來(lái)說(shuō)下反直覺(jué)瘦材。文章開頭小張花了16元買水厅须,小張有1個(gè)20元,1個(gè)1元食棕,這時(shí)候系統(tǒng)會(huì)從小張的地址上扣20朗和,而不是16。小張輸出的是20簿晓,還有4塊是未花費(fèi)輸出眶拉。這時(shí)候小張有2個(gè)未花費(fèi)輸出,1個(gè)4元憔儿,1個(gè)1元忆植。
這個(gè)過(guò)程和我們平時(shí)花錢的習(xí)慣有點(diǎn)不同,但是也很好理解谒臼。你只要想到小張手里的比特幣就像紙幣朝刊,不能撕開,必須一次出一整個(gè)蜈缤,這樣就好明白一些拾氓。你雖然花出去了20,但是系統(tǒng)會(huì)給你找零劫樟,4塊還會(huì)回到你的地址上痪枫。這里只是讓大家對(duì)概念更加清晰,實(shí)際交易上并沒(méi)有太多干擾叠艳。
OK奶陈,讓我們?cè)賮?lái)回顧一下,UTXO是未花費(fèi)的交易輸出附较,它只對(duì)應(yīng)著地址概念吃粒,并非我們熟悉的“賬戶和余額”。UTXO只確認(rèn)交易本身拒课,因此交易計(jì)算量小數(shù)據(jù)庫(kù)也小徐勃,運(yùn)行至今未曾有誤事示。當(dāng)然,UTXO也有著一些讓人不適應(yīng)的特點(diǎn)僻肖,每次的幣不能拆開來(lái)花肖爵,不過(guò)不影響交易~好啦,這就是今天要講的區(qū)塊鏈知識(shí)臀脏,讓我們共同進(jìn)步劝堪!
PS,感謝小張親身演繹~哈哈哈~
注:
反直覺(jué)這個(gè)概念是引用湯強(qiáng)老師的《李笑來(lái)的比特幣賬戶并沒(méi)有余額》揉稚,公眾號(hào):湯強(qiáng)(tangqiang0401)秒啦,不知道為啥我覺(jué)得這個(gè)用“花錢找零”的類比解釋來(lái)蠻好理解的哈哈哈~也許是我哪個(gè)地方理解還不夠深刻,大家可以去看看他的文章搀玖,歡迎給我提出建議~