孟 青, 于 瓅
(安徽理工大學(xué) 計算機(jī)科學(xué)與工程學(xué)院, 安徽 淮南 232001)
比特幣出現(xiàn)于2008年年末,當(dāng)時的美國正處于次貸危機(jī)的末期。中本聰在發(fā)表比特幣白皮書即《比特幣:一種點對點的電子現(xiàn)金系統(tǒng)》[1]后的第2年,就發(fā)布了比特幣的第一版實施系統(tǒng)。據(jù)普林斯頓大學(xué)出版的《Bitcoin and Cryptocurrency Technologies》[2]幣源代碼可以看出,比特幣系統(tǒng)沒有將模塊劃分很清楚,具有不一樣作用的功能都放在一個5 000多行的主程序中實現(xiàn)。因此,推斷中本聰一開始寫比特幣代碼時并沒有從架構(gòu)上考慮太多,而是用簡單直白的辦法一氣呵成地把比特幣系統(tǒng)寫了出來。因為,當(dāng)參與開源項目的開發(fā)者多起來的時候,一個清晰的架構(gòu)就會顯得愈來愈重要,對代碼的維護(hù)、重用和擴(kuò)展具有重要的意義。比特幣(Bitcoin,縮寫B(tài)TC)作為一種總量恒定,價值波動劇烈的數(shù)字貨幣,和互聯(lián)網(wǎng)一樣具有去中心化、全球化及匿名性等特性。在現(xiàn)實生活中,向不同國家轉(zhuǎn)賬需要經(jīng)過各種手續(xù),手續(xù)費亦會比較高昂。然而,比特幣卻沒有任何條件限制,除了較低的交易費用。比特幣因此被廣泛利用于全球貿(mào)易、跨國轉(zhuǎn)賬支付等領(lǐng)域。
不同的加密貨幣具有不同的交易模型,例如未使用的交易輸出(unspent transaction outputs)模型[3]、賬戶模型等。其中,以賬戶模型為大眾所普遍使用,例如創(chuàng)建的個人賬戶等。未使用的交易輸出模型是一種全新的交易模型,因為比特幣的誕生而被廣泛了解。在比特幣中,并不存在一個賬本記錄了每個賬戶的余額。這表明就需要查看以前所有的交易記錄,從記錄中找出所有發(fā)往某個賬戶比特幣,再將比特幣的數(shù)額計算出來,才會知道某個賬戶的余額。比特幣協(xié)議有時需要在用戶發(fā)送比特幣時產(chǎn)生極小額度的比特幣輸出,雖然這些比特幣的價值微不足道,然而仍然會占用一定的未使用的交易輸出空間。因為比特幣是按照字節(jié)收費,這表明想要花費這筆比特幣時需要支付的交易費用可能比其實際價值還要多[4]。正因為如此,現(xiàn)實當(dāng)中幾乎沒有人會這樣做。
然而,由于區(qū)塊鏈空間有限,太多的小額度比特幣交易仍然可以占用很大的交易空間,又因為擁有者基本上不會用此進(jìn)行消費,使得未使用的交易輸出集越來越龐大,可能會導(dǎo)致整個系統(tǒng)的性能問題。上述問題被形象地稱為“塵?!眴栴}[5]?!皦m?!眴栴}影響了未使用的交易輸出模型,“塵?!钡纳伤鶐淼牡托实膯栴},在各種區(qū)塊鏈中都是存在的。
本文根據(jù)2010—2020年比特幣的未使用的交易輸出歷史集,繪制出余額隨著時間的變化圖,充分體現(xiàn)出“塵埃”所帶來的問題[6]。根據(jù)未使用的交易輸出集中的歷史交易信息給“塵?!痹谧止?jié)層次上下一個定義。以此,找出目前存在多少的“塵?!焙推浯砹硕嗌俚膬r值。對目前交易所、用戶、礦工、全節(jié)點運營者及開發(fā)人員等為了減少“塵?!钡纳啥扇〉拇胧┻M(jìn)行了研究和總結(jié)。
加密貨幣中的“塵?!睌?shù)量是由當(dāng)前未使用的交易輸出集和交易費用所決定的。在交易費用達(dá)到頂峰的時期 (2017年12月),在比特幣網(wǎng)絡(luò)中40%~50%的未使用的交易輸出可能是“塵?!?。同時,這些“塵?!敝忻糠菟谋忍貛艛?shù)量很少,然而加起來總量卻是驚人的:根據(jù)估算,在2017年比特幣“塵?!眱r值約為上千萬美元,而2020年初已降低到2017年一半的水平。這表明,采取不同的標(biāo)準(zhǔn)來對待“塵埃”,其要么是一個大問題,要么是一個微不足道的問題。然而,無論采取哪種方式,為了區(qū)塊鏈的高效運行都應(yīng)該盡可能減少新“塵?!钡漠a(chǎn)生和清理現(xiàn)有“塵?!盵7]。
以轉(zhuǎn)賬0.4BTC為例(圖1),交易方式1消耗了兩個未使用的交易輸出,交易費用高昂。交易方式2只消耗一個未使用的交易輸出,交易費用便宜,然而會產(chǎn)生非常低額的找零輸出,其就是通常意義上來講的“塵?!薄eX包軟件必須進(jìn)行權(quán)衡,然而,這是一個非常困難的優(yōu)化難題[8]。
圖1 發(fā)送0.4BTC可能的兩種交易方式
作為一款錢包軟件需要肩負(fù)起很大使命,不僅會有多種使用場景,亦會面臨各種不懷好意的攻擊。一款錢包的作者不能預(yù)知用戶將會用它來做什么交易,更不能操縱市場上的交易費用發(fā)生變化。這表明,錢包軟件沒法幫忙,與此同時,甚至?xí)?chuàng)建低額的“塵?!薄_@表明對錢包中的未使用的交易輸出集合進(jìn)行優(yōu)化是一個相當(dāng)困難的難題,沒有全局最優(yōu)的解決方案。這是“塵?!钡淖罱K來源。
此外,還需要對“塵?!痹谧止?jié)大小上有個更清晰的認(rèn)知。從上面的研究中可以發(fā)現(xiàn)低余額的未使用的交易輸出很可能是“塵?!?。未使用的交易輸出余額段隨時間的分布如圖2所示。
圖2 2010—2020年未使用的交易輸出余額百分比
通過調(diào)取近10年未使用的交易輸出歷史集,其次在每一天的基礎(chǔ)上對記錄進(jìn)行降序排列,進(jìn)行分段處理,分為圖2所示的12個不同顏色余額段,冷色調(diào)(綠色和藍(lán)色)代表低余額未使用的交易輸出,暖色調(diào)(紅色和黃色)是高余額未使用的交易輸出。通過繪制余額段隨時間變化的情況發(fā)現(xiàn),未使用的交易輸出余額的范圍是巨大的:在分布的上端存在包含數(shù)千BTC的未使用的交易輸出,而下端有一些包含少于10聰?shù)奈词褂玫慕灰纵敵?兩者相差11~12個數(shù)量級!)。
在圖2中可以清晰地看出確實存在著許多低余額未使用的交易輸出,然而能否更精確地定義這些低余額未使用的交易輸出中哪些屬于“塵埃”,是目前所需要解決的問題。
在一項交易中使用未使用的交易輸出,就要求鏈接該未使用的交易輸出(通過提供建立該未使用的交易輸出的交易身份證明以及在這筆交易中成為輸出出現(xiàn)時的次序),其次使用需要的密鑰簽名。當(dāng)然這些行為的實現(xiàn)都需要用一定的字節(jié)進(jìn)行表達(dá),而礦工就需要根據(jù)字節(jié)數(shù)對交易進(jìn)行收費。
一般而言,一筆交易會選擇從未使用的交易輸出的輸入方中借記費用來進(jìn)行交易。這一過程中如果出現(xiàn)問題往往不是小問題,因為交易費用通常比其消費的所有未使用的交易輸出余額總和小。然而,如果在該筆未使用的交易輸出的交易中的余額極其低,又或者因為未使用的交易輸出所需要的字節(jié)數(shù)特別多引起的交易所需要到的費用非常高,那么交易以后所需要的交易費用可能遠(yuǎn)遠(yuǎn)超過自身的余額。
因此要重新定義一個新的度量值叫作值密度ρ,它的定義是:它的余額m除以使用它所需的字節(jié)數(shù)ν。這里可以理解為衡量每個字節(jié)所需的BTC數(shù)量的指標(biāo),即
(1)
其次可以根據(jù)下面兩個指標(biāo)區(qū)分未使用的交易輸出中的“塵埃”:①礦工目前接受的最低的交易費用;②值密度。這兩個指標(biāo)都是用聰/字節(jié)作為單位,因此可以直接進(jìn)行比較。假設(shè)礦工所接受的最低交易費用大于值密度,則就是“塵?!薄?礦工目前接受的最低的交易費用就是“塵埃線”。未使用的交易輸出會隨著交易費用的變化會跌到“塵埃線”以下,亦會升到“塵埃線”之上,因為交易費用是會發(fā)生變化的。
如果想要將一個未使用的交易輸出劃分為“塵?!?,除了每個未使用的交易輸出顯而易見的余額值外,更需要知道每個未使用的交易輸出的大小,即字節(jié)數(shù)。字節(jié)數(shù)并不是簡單的測量就可以得出。平均而言,在一次事務(wù)中花費的未使用的交易輸出越多,平均花費未使用的交易輸出所需的字節(jié)數(shù)就會越少。然而,可以估計出一個平均值。假設(shè)使用的未使用的交易輸出是事務(wù)中的單個輸入,那么,要求花費該未使用的交易輸出所需的字節(jié)數(shù)將取決于未使用的交易輸出地址的類型,不同類型的未使用的交易輸出的地址具有不同的大小,其中m∈[1,20],見表1[9]。
表1中的單位是字節(jié),V代表變量,可以為任意字節(jié)數(shù)。表1對“簡單”地址類型(例如P2PK和P2PKH)列出了確定的大小。特別是對于P2SH地址,不可能提前計算從該地址花費未使用的交易輸出所需的字節(jié)數(shù),只能在交易(在交易中顯示了該地址的兌換腳本)后,才能知道從該地址花費多少字節(jié)。然而,大多數(shù)P2SH地址是具有可預(yù)測結(jié)構(gòu)的多重簽名地址(如果其是多重簽名的話)。與此同時,可以從區(qū)塊鏈歷史上的支出中推斷出許多P2SH地址。表2是根據(jù)歷史數(shù)據(jù),從每個給定的地址類型中估計花費未使用的交易輸出所需的字節(jié)數(shù)[9]。
表1 地址類型與在該地址花費未使用的交易輸出所需的字節(jié)數(shù)之間的關(guān)系
表2 每個腳本類型和大小估計
可以使用表2中的估算值來計算在任何時間未使用的交易輸出所需的平均字節(jié)數(shù)。圖3中黑色實線表示當(dāng)時花費未使用的交易輸出所需的平均字節(jié)數(shù)的準(zhǔn)確估計。今天,占據(jù)地址主導(dǎo)地位的地址類型已從P2PK轉(zhuǎn)移到P2PKH和P2SH。根據(jù)圖3,估計平均需要 172 Bytes才能使用未使用的交易輸出。根據(jù)構(gòu)造可以得知此數(shù)字是被過多估計了。在大多數(shù)比特幣歷史上,花費未使用的交易輸出所需的平均字節(jié)數(shù)低于172 Bytes,如果采用智能交易可以大大降低這一估計值[10]。
圖3 按地址類型劃分的未使用的交易輸出
依據(jù)比特幣中任意區(qū)塊中所包含的歷史交易,以及上一節(jié)中求出的172 Bytes估算值,可以利用每個未使用的交易輸出的余額除以花費未使用的交易輸出所需字節(jié)數(shù)來構(gòu)造未使用的交易輸出值密度分布[11]:
在圖4中彩色帶顯示圖例中指示的每個百分比處的值密度。黑色虛線表示一段時間內(nèi)的礦工接受的交易費用平均值,而黑色實線表示礦工接受的交易費用最低值。如果值密度低于交易費用平均值,那么未使用的交易輸出就會變得難以使用,而值密度低于交易費用最低值,那么未使用的交易輸出就會變得更加無法使用。在圖4中假設(shè)花費未使用的交易輸出平均需要172 Bytes,與前面的圖2非常類似。因此,可以將其與黑色實線和黑色虛線直接進(jìn)行比較[12]。
圖4 未使用的交易輸出值密度百分比
在2017年年末,比特幣交易費用達(dá)到了歷史的巔峰,從圖中看出有40%的未使用的交易輸出值密度低于600 聰/字節(jié)的交易費用的平均值,這使得其很難被使用。15%的未使用的交易輸出值密度低于50 聰/字節(jié)的交易費用最低值,這使得比特幣幾乎無法被使用[13]。
2018年以后,比特幣的交易費用急劇下降,其次迅速回升。到目前為止,仍然有接近10%的未使用的交易輸出的值密度低于20 聰/字節(jié)的交易費用的平均值,3%的未使用的交易輸出的值密度低于2 聰/字節(jié)的交易費用的最低值。雖然“塵?!鄙倭撕芏?,然而仍是很多的[14]。
從數(shù)量上講,許多未使用的交易輸出可能是“塵?!保欢@些 “塵?!彼谋忍貛庞囝~很低。綜上所述,其總和并不多。圖5顯示了低價值密度未使用的交易輸出中包含的比特幣份額[15]。
圖5的彩色帶表示給定值密度的未使用的交易輸出持有的BTC的比例。由于大部分BTC包含在高值密度的未使用的交易輸出中,因此僅顯示了低值密度的未使用的交易輸出(可能是“塵?!?的分段。通過放大近幾個月,可以發(fā)現(xiàn)低值密度未使用的交易輸出最近在增多。圖5中假設(shè)花費任意類型未使用的交易輸出需要172 Bytes[16]。
雖然存在著值密度較低的未使用的交易輸出,然而圖5顯示,“塵?!敝蟹e累的比特幣是少量的[17]。如果只計算價值,只有0.02%的BTC是“塵埃”,不管在任何時期亦是這樣。以當(dāng)時的比特幣總市值3 293 億美元計算,則相當(dāng)于“塵埃”的價值大約在3 293萬~6 586萬美元[18]。
圖5 低價值密度未使用的交易輸出的比特幣余額
現(xiàn)在的市場平均交易費與2017年最高峰相比較低。按現(xiàn)在交易費用,比特幣網(wǎng)絡(luò)當(dāng)中只有0.016%是“塵?!盵19]。在現(xiàn)在比特幣市值下跌到 2 127 億美元的情況下,表明整個區(qū)塊鏈中有價值 3 403 萬美元的“塵埃”[20]!
這表明比特幣網(wǎng)絡(luò)的“塵?!眱r值從2017年最高峰的6 586萬美元減少至現(xiàn)在的3 403萬美元。然而這些“塵?!眱r值還是太高。采取智能交易可明顯地減少使用未使用的交易輸出的字節(jié)數(shù),降低對“塵埃”數(shù)量的判斷。
比特幣是一個無領(lǐng)導(dǎo)的系統(tǒng),因而很難消除現(xiàn)有的“塵?!?,并降低未來的“塵?!钡漠a(chǎn)生。相對的,更應(yīng)該依靠于對底層的行業(yè)用戶、礦工和企業(yè)采取的激勵措施。
雖然價格暴跌是減少“塵?!钡脑颍欢?018年,交易所等高交易量企業(yè)(最著名的是Coinbase)還是制定了積極的除塵措施。圖6是采取這些措施的所帶來的效果。
從圖6中可以看出,整個市場的趨勢是增加“塵?!钡臄?shù)量。單個參與者可以顯著增加或減少“塵?!绷?。然而,“塵?!钡纳捎罒o止境。諸如Coinbase之類的企業(yè)一直在制造大量“塵?!保⑶覠o法充分批處理客戶交易,因此無法有效利用區(qū)塊空間。當(dāng)交易費用在下一年開始回落時,Coinbase開始采取措施減少現(xiàn)有的“塵埃”和未來的“塵埃”產(chǎn)量。于是,開始著手實行批量交易,這樣既節(jié)省了交易業(yè)務(wù)費用,同時亦減少了“塵?!钡纳伞?/p>
圖6 低價值密度未使用的交易輸出的比特幣余額表(注釋版本)
用戶本身不受“塵?!钡挠绊憽H欢驗殄X包軟件的效率問題,用戶會生成“塵埃”的可能性大大增加,很少有用戶會選擇創(chuàng)建數(shù)量龐大的“塵?!?。
用戶對高昂的手續(xù)費表示反感,然而“塵埃”不會對交易費用產(chǎn)生直接影響。效率低下的未使用的交易輸出管理,既會產(chǎn)生“塵?!?,又會導(dǎo)致更多小額的交易,這是導(dǎo)致費用增加的更大原因。因此,用戶只有適度的動機(jī)來減少“塵?!薄?/p>
雖然用戶缺乏動力,然而用戶有能力限制“塵埃”。2017年UASF運動已經(jīng)證實,用戶只要想去做還是有能力做到的?!皦m?!笔且粋€廣泛的問題,需要采取一種統(tǒng)一協(xié)調(diào)的手法來解決。用戶可以通過開發(fā)者或礦商,來放棄他們名下的“塵埃”。
用戶可能更傾向于“捐贈”他們的“塵?!眮碜鳛橐环N慈善方式,用戶可以通過“捐贈”機(jī)制(例如,ALL|ANYONECANPAY或NONE|ANYONECANPAY 類型簽名)來實現(xiàn)它。假設(shè)錢包軟件支持其行為,那么社區(qū)就可以協(xié)調(diào)出一個公共大掃除時間段,在該時間段內(nèi)交易費用為零。這項行為可以成為機(jī)構(gòu)或項目獲取資金的新方式,從比特幣生態(tài)系統(tǒng)中受益匪淺。
大部分礦工都忽略了“塵埃”。礦池中的礦工只需要支付哈希值即可;礦池運營商需要管理未使用的交易輸出集并處理其膨脹所帶來的影響,然而他們亦可以自由地從其內(nèi)存池中丟棄低值密度的“塵?!?。無論如何,沒有用戶可能會花費“塵?!?。這將為scavenger-pools提供一個拾起并嘗試開采這些“塵埃”的機(jī)會,然而這仍然需要用戶采取行動以花費“塵?!?。用戶可能根本沒有注意到或關(guān)心到“塵?!钡拇嬖凇?/p>
關(guān)心“塵埃”的獨立礦工或者礦場經(jīng)營者可以選擇一個零交易費用的假期。在這段時間內(nèi),挖礦者有意支持零交易費用,這些交易是消耗低值密度未使用的交易輸出,可以在“春季大掃除”期間完成。這么做的目的是讓用戶對自己的錢包進(jìn)行清理,讓礦工和節(jié)點運營商大幅減少其未使用的交易輸出集的內(nèi)存占用量。
其他的,如BetterHash之類的想法 讓礦工重新掌握自己的哈希算力,這也許會支持更多的個體挖礦者離開傳統(tǒng)的挖礦池,并開始自己構(gòu)建區(qū)塊。此外,礦工可能不得不關(guān)心“塵?!薄?/p>
理論上,挖礦者可以選擇不處理產(chǎn)生“塵?!钡慕灰住R驗?,他們估計不愿意在短期內(nèi)犧牲交易費用收入來防止長期產(chǎn)生“塵埃”。
全節(jié)點運營者(只進(jìn)行區(qū)塊鏈節(jié)點的備份和交易驗證、轉(zhuǎn)發(fā)的運營者)亦具有一定的“塵?!碑a(chǎn)生能力。節(jié)點控制者可以將值密度的最小值設(shè)置在部分錢包軟件中,低于該值密度未使用的交易輸出(以及創(chuàng)建其事務(wù))將被忽略。在某種程度上,此設(shè)置已經(jīng)可以防止創(chuàng)建極低值密度的未使用的交易輸出。如果從未實施此設(shè)置,今天可能會有更多“塵埃”。然而,只有極少數(shù)的節(jié)點運營者愿意配置時調(diào)整的如此細(xì)致, 原因是錢包軟件默認(rèn)關(guān)閉其參數(shù)。
與前面提到的對象相比,開發(fā)人員才是限制“塵?!碑a(chǎn)生的關(guān)鍵。開發(fā)人員可以編寫新的軟件供用戶使用。對于軟件所進(jìn)行的不當(dāng)優(yōu)化是產(chǎn)生“塵?!钡母驹?。只有不斷更新優(yōu)化策略才能在實踐中趨于完美的境界,亦是減少未來“塵埃”生成的有效的途徑。開發(fā)人員可以通過調(diào)整默認(rèn)設(shè)置的方法間接對節(jié)點運營者、礦工、交易所進(jìn)行影響。使這些場所對“塵?!碑a(chǎn)生“群體免疫”,從錢包中放棄“塵?!薄?/p>
通過底層活動(如UASF運動),開發(fā)者與礦工和用戶進(jìn)行協(xié)同,搭建專門的交流渠道,以進(jìn)行“春季大掃除”和零交易費用假期。亦可以采取構(gòu)建第二層網(wǎng)絡(luò)的方法,來充分克服“塵?!眴栴}。
對比特幣的未使用的交易輸出集進(jìn)行了詳細(xì)分析。結(jié)果表明,目前無法避免“塵?!钡漠a(chǎn)生。從比特幣剛誕生起,人們不斷地提高對于“塵埃”的認(rèn)識,從2018年3月起嘗試清理“塵埃”,然而“塵埃”還是不停產(chǎn)生。值密度低于75 聰/字節(jié)的未使用的交易輸出顯示出持續(xù)的上升曲線,之后迅速回調(diào)。這說明有人正在積極地制造“塵?!?,然而至少亦有人在做清理。此外,值密度小于 250 聰/字節(jié)的未使用的交易輸出(以美元計)已經(jīng)增加了10%,這些未使用的交易輸出在2020年初已不再是“塵?!绷?,然而如果交易費用再次像2020年末那樣上升,其將迅速變成“塵埃”。
“塵?!钡漠a(chǎn)生是由于比特幣本身效率不高的機(jī)制所導(dǎo)致的。并非所有的區(qū)塊鏈都使用了未使用的交易輸出模型。例如,以太坊就使用了賬戶模型。賬戶模型的特性決定了不同的交易向同一地址存入以太幣是會打亂順序混合在一起的。賬戶模型的每次交易產(chǎn)生的花費均由傳播交易的地址節(jié)點來支付,并不是由交易中被轉(zhuǎn)移以太幣的地址節(jié)點來支付。
上面提到的這兩種差異都大大減少了“塵?!钡漠a(chǎn)生,然而并沒有完全消除它。以太坊的創(chuàng)始人一樣擔(dān)心“塵埃”,包括其所帶來的效率低下的問題?!皦m埃”的產(chǎn)生在各種區(qū)塊鏈中都是要值得擔(dān)心的重大問題。