孟 青, 于 瓅
(安徽理工大學 計算機科學與工程學院, 安徽 淮南 232001)
比特幣出現于2008年年末,當時的美國正處于次貸危機的末期。中本聰在發表比特幣白皮書即《比特幣:一種點對點的電子現金系統》[1]后的第2年,就發布了比特幣的第一版實施系統。據普林斯頓大學出版的《Bitcoin and Cryptocurrency Technologies》[2]幣源代碼可以看出,比特幣系統沒有將模塊劃分很清楚,具有不一樣作用的功能都放在一個5 000多行的主程序中實現。因此,推斷中本聰一開始寫比特幣代碼時并沒有從架構上考慮太多,而是用簡單直白的辦法一氣呵成地把比特幣系統寫了出來。因為,當參與開源項目的開發者多起來的時候,一個清晰的架構就會顯得愈來愈重要,對代碼的維護、重用和擴展具有重要的意義。比特幣(Bitcoin,縮寫BTC)作為一種總量恒定,價值波動劇烈的數字貨幣,和互聯網一樣具有去中心化、全球化及匿名性等特性。在現實生活中,向不同國家轉賬需要經過各種手續,手續費亦會比較高昂。然而,比特幣卻沒有任何條件限制,除了較低的交易費用。比特幣因此被廣泛利用于全球貿易、跨國轉賬支付等領域。
不同的加密貨幣具有不同的交易模型,例如未使用的交易輸出(unspent transaction outputs)模型[3]、賬戶模型等。其中,以賬戶模型為大眾所普遍使用,例如創建的個人賬戶等。未使用的交易輸出模型是一種全新的交易模型,因為比特幣的誕生而被廣泛了解。在比特幣中,并不存在一個賬本記錄了每個賬戶的余額。這表明就需要查看以前所有的交易記錄,從記錄中找出所有發往某個賬戶比特幣,再將比特幣的數額計算出來,才會知道某個賬戶的余額。比特幣協議有時需要在用戶發送比特幣時產生極小額度的比特幣輸出,雖然這些比特幣的價值微不足道,然而仍然會占用一定的未使用的交易輸出空間。因為比特幣是按照字節收費,這表明想要花費這筆比特幣時需要支付的交易費用可能比其實際價值還要多[4]。正因為如此,現實當中幾乎沒有人會這樣做。
然而,由于區塊鏈空間有限,太多的小額度比特幣交易仍然可以占用很大的交易空間,又因為擁有者基本上不會用此進行消費,使得未使用的交易輸出集越來越龐大,可能會導致整個系統的性能問題。上述問題被形象地稱為“塵埃”問題[5]。“塵埃”問題影響了未使用的交易輸出模型,“塵埃”的生成所帶來的低效率的問題,在各種區塊鏈中都是存在的。
本文根據2010—2020年比特幣的未使用的交易輸出歷史集,繪制出余額隨著時間的變化圖,充分體現出“塵埃”所帶來的問題[6]。根據未使用的交易輸出集中的歷史交易信息給“塵埃”在字節層次上下一個定義。以此,找出目前存在多少的“塵埃”和其代表了多少的價值。對目前交易所、用戶、礦工、全節點運營者及開發人員等為了減少“塵埃”的生成而采取的措施進行了研究和總結。
加密貨幣中的“塵埃”數量是由當前未使用的交易輸出集和交易費用所決定的。在交易費用達到頂峰的時期 (2017年12月),在比特幣網絡中40%~50%的未使用的交易輸出可能是“塵埃”。同時,這些“塵埃”中每份所包含的比特幣數量很少,然而加起來總量卻是驚人的:根據估算,在2017年比特幣“塵埃”價值約為上千萬美元,而2020年初已降低到2017年一半的水平。這表明,采取不同的標準來對待“塵埃”,其要么是一個大問題,要么是一個微不足道的問題。然而,無論采取哪種方式,為了區塊鏈的高效運行都應該盡可能減少新“塵埃”的產生和清理現有“塵埃”[7]。
以轉賬0.4BTC為例(圖1),交易方式1消耗了兩個未使用的交易輸出,交易費用高昂。交易方式2只消耗一個未使用的交易輸出,交易費用便宜,然而會產生非常低額的找零輸出,其就是通常意義上來講的“塵埃”。錢包軟件必須進行權衡,然而,這是一個非常困難的優化難題[8]。

圖1 發送0.4BTC可能的兩種交易方式
作為一款錢包軟件需要肩負起很大使命,不僅會有多種使用場景,亦會面臨各種不懷好意的攻擊。一款錢包的作者不能預知用戶將會用它來做什么交易,更不能操縱市場上的交易費用發生變化。這表明,錢包軟件沒法幫忙,與此同時,甚至會創建低額的“塵埃”。這表明對錢包中的未使用的交易輸出集合進行優化是一個相當困難的難題,沒有全局最優的解決方案。這是“塵埃”的最終來源。
此外,還需要對“塵埃”在字節大小上有個更清晰的認知。從上面的研究中可以發現低余額的未使用的交易輸出很可能是“塵埃”。未使用的交易輸出余額段隨時間的分布如圖2所示。

圖2 2010—2020年未使用的交易輸出余額百分比
通過調取近10年未使用的交易輸出歷史集,其次在每一天的基礎上對記錄進行降序排列,進行分段處理,分為圖2所示的12個不同顏色余額段,冷色調(綠色和藍色)代表低余額未使用的交易輸出,暖色調(紅色和黃色)是高余額未使用的交易輸出。通過繪制余額段隨時間變化的情況發現,未使用的交易輸出余額的范圍是巨大的:在分布的上端存在包含數千BTC的未使用的交易輸出,而下端有一些包含少于10聰的未使用的交易輸出(兩者相差11~12個數量級!)。
在圖2中可以清晰地看出確實存在著許多低余額未使用的交易輸出,然而能否更精確地定義這些低余額未使用的交易輸出中哪些屬于“塵埃”,是目前所需要解決的問題。
在一項交易中使用未使用的交易輸出,就要求鏈接該未使用的交易輸出(通過提供建立該未使用的交易輸出的交易身份證明以及在這筆交易中成為輸出出現時的次序),其次使用需要的密鑰簽名。當然這些行為的實現都需要用一定的字節進行表達,而礦工就需要根據字節數對交易進行收費。
一般而言,一筆交易會選擇從未使用的交易輸出的輸入方中借記費用來進行交易。這一過程中如果出現問題往往不是小問題,因為交易費用通常比其消費的所有未使用的交易輸出余額總和小。然而,如果在該筆未使用的交易輸出的交易中的余額極其低,又或者因為未使用的交易輸出所需要的字節數特別多引起的交易所需要到的費用非常高,那么交易以后所需要的交易費用可能遠遠超過自身的余額。
因此要重新定義一個新的度量值叫作值密度ρ,它的定義是:它的余額m除以使用它所需的字節數ν。這里可以理解為衡量每個字節所需的BTC數量的指標,即

(1)
其次可以根據下面兩個指標區分未使用的交易輸出中的“塵埃”:①礦工目前接受的最低的交易費用;②值密度。這兩個指標都是用聰/字節作為單位,因此可以直接進行比較。假設礦工所接受的最低交易費用大于值密度,則就是“塵埃”。 礦工目前接受的最低的交易費用就是“塵埃線”。未使用的交易輸出會隨著交易費用的變化會跌到“塵埃線”以下,亦會升到“塵埃線”之上,因為交易費用是會發生變化的。
如果想要將一個未使用的交易輸出劃分為“塵埃”,除了每個未使用的交易輸出顯而易見的余額值外,更需要知道每個未使用的交易輸出的大小,即字節數。字節數并不是簡單的測量就可以得出。平均而言,在一次事務中花費的未使用的交易輸出越多,平均花費未使用的交易輸出所需的字節數就會越少。然而,可以估計出一個平均值。假設使用的未使用的交易輸出是事務中的單個輸入,那么,要求花費該未使用的交易輸出所需的字節數將取決于未使用的交易輸出地址的類型,不同類型的未使用的交易輸出的地址具有不同的大小,其中m∈[1,20],見表1[9]。
表1中的單位是字節,V代表變量,可以為任意字節數。表1對“簡單”地址類型(例如P2PK和P2PKH)列出了確定的大小。特別是對于P2SH地址,不可能提前計算從該地址花費未使用的交易輸出所需的字節數,只能在交易(在交易中顯示了該地址的兌換腳本)后,才能知道從該地址花費多少字節。然而,大多數P2SH地址是具有可預測結構的多重簽名地址(如果其是多重簽名的話)。與此同時,可以從區塊鏈歷史上的支出中推斷出許多P2SH地址。表2是根據歷史數據,從每個給定的地址類型中估計花費未使用的交易輸出所需的字節數[9]。

表1 地址類型與在該地址花費未使用的交易輸出所需的字節數之間的關系

表2 每個腳本類型和大小估計
可以使用表2中的估算值來計算在任何時間未使用的交易輸出所需的平均字節數。圖3中黑色實線表示當時花費未使用的交易輸出所需的平均字節數的準確估計。今天,占據地址主導地位的地址類型已從P2PK轉移到P2PKH和P2SH。根據圖3,估計平均需要 172 Bytes才能使用未使用的交易輸出。根據構造可以得知此數字是被過多估計了。在大多數比特幣歷史上,花費未使用的交易輸出所需的平均字節數低于172 Bytes,如果采用智能交易可以大大降低這一估計值[10]。

圖3 按地址類型劃分的未使用的交易輸出
依據比特幣中任意區塊中所包含的歷史交易,以及上一節中求出的172 Bytes估算值,可以利用每個未使用的交易輸出的余額除以花費未使用的交易輸出所需字節數來構造未使用的交易輸出值密度分布[11]:
在圖4中彩色帶顯示圖例中指示的每個百分比處的值密度。黑色虛線表示一段時間內的礦工接受的交易費用平均值,而黑色實線表示礦工接受的交易費用最低值。如果值密度低于交易費用平均值,那么未使用的交易輸出就會變得難以使用,而值密度低于交易費用最低值,那么未使用的交易輸出就會變得更加無法使用。在圖4中假設花費未使用的交易輸出平均需要172 Bytes,與前面的圖2非常類似。因此,可以將其與黑色實線和黑色虛線直接進行比較[12]。

圖4 未使用的交易輸出值密度百分比
在2017年年末,比特幣交易費用達到了歷史的巔峰,從圖中看出有40%的未使用的交易輸出值密度低于600 聰/字節的交易費用的平均值,這使得其很難被使用。15%的未使用的交易輸出值密度低于50 聰/字節的交易費用最低值,這使得比特幣幾乎無法被使用[13]。
2018年以后,比特幣的交易費用急劇下降,其次迅速回升。到目前為止,仍然有接近10%的未使用的交易輸出的值密度低于20 聰/字節的交易費用的平均值,3%的未使用的交易輸出的值密度低于2 聰/字節的交易費用的最低值。雖然“塵埃”少了很多,然而仍是很多的[14]。
從數量上講,許多未使用的交易輸出可能是“塵埃”,然而這些 “塵埃”所包含的比特幣余額很低。綜上所述,其總和并不多。圖5顯示了低價值密度未使用的交易輸出中包含的比特幣份額[15]。
圖5的彩色帶表示給定值密度的未使用的交易輸出持有的BTC的比例。由于大部分BTC包含在高值密度的未使用的交易輸出中,因此僅顯示了低值密度的未使用的交易輸出(可能是“塵埃”)的分段。通過放大近幾個月,可以發現低值密度未使用的交易輸出最近在增多。圖5中假設花費任意類型未使用的交易輸出需要172 Bytes[16]。
雖然存在著值密度較低的未使用的交易輸出,然而圖5顯示,“塵埃”中積累的比特幣是少量的[17]。如果只計算價值,只有0.02%的BTC是“塵埃”,不管在任何時期亦是這樣。以當時的比特幣總市值3 293 億美元計算,則相當于“塵埃”的價值大約在3 293萬~6 586萬美元[18]。

圖5 低價值密度未使用的交易輸出的比特幣余額
現在的市場平均交易費與2017年最高峰相比較低。按現在交易費用,比特幣網絡當中只有0.016%是“塵埃”[19]。在現在比特幣市值下跌到 2 127 億美元的情況下,表明整個區塊鏈中有價值 3 403 萬美元的“塵埃”[20]!
這表明比特幣網絡的“塵埃”價值從2017年最高峰的6 586萬美元減少至現在的3 403萬美元。然而這些“塵埃”價值還是太高。采取智能交易可明顯地減少使用未使用的交易輸出的字節數,降低對“塵埃”數量的判斷。
比特幣是一個無領導的系統,因而很難消除現有的“塵埃”,并降低未來的“塵埃”的產生。相對的,更應該依靠于對底層的行業用戶、礦工和企業采取的激勵措施。
雖然價格暴跌是減少“塵埃”的原因,然而在2018年,交易所等高交易量企業(最著名的是Coinbase)還是制定了積極的除塵措施。圖6是采取這些措施的所帶來的效果。
從圖6中可以看出,整個市場的趨勢是增加“塵埃”的數量。單個參與者可以顯著增加或減少“塵埃”量。然而,“塵埃”的生成永無止境。諸如Coinbase之類的企業一直在制造大量“塵埃”,并且無法充分批處理客戶交易,因此無法有效利用區塊空間。當交易費用在下一年開始回落時,Coinbase開始采取措施減少現有的“塵埃”和未來的“塵埃”產量。于是,開始著手實行批量交易,這樣既節省了交易業務費用,同時亦減少了“塵埃”的生成。

圖6 低價值密度未使用的交易輸出的比特幣余額表(注釋版本)
用戶本身不受“塵埃”的影響。然而因為錢包軟件的效率問題,用戶會生成“塵埃”的可能性大大增加,很少有用戶會選擇創建數量龐大的“塵埃”。
用戶對高昂的手續費表示反感,然而“塵埃”不會對交易費用產生直接影響。效率低下的未使用的交易輸出管理,既會產生“塵埃”,又會導致更多小額的交易,這是導致費用增加的更大原因。因此,用戶只有適度的動機來減少“塵埃”。
雖然用戶缺乏動力,然而用戶有能力限制“塵埃”。2017年UASF運動已經證實,用戶只要想去做還是有能力做到的。“塵埃”是一個廣泛的問題,需要采取一種統一協調的手法來解決。用戶可以通過開發者或礦商,來放棄他們名下的“塵埃”。
用戶可能更傾向于“捐贈”他們的“塵埃”來作為一種慈善方式,用戶可以通過“捐贈”機制(例如,ALL|ANYONECANPAY或NONE|ANYONECANPAY 類型簽名)來實現它。假設錢包軟件支持其行為,那么社區就可以協調出一個公共大掃除時間段,在該時間段內交易費用為零。這項行為可以成為機構或項目獲取資金的新方式,從比特幣生態系統中受益匪淺。
大部分礦工都忽略了“塵埃”。礦池中的礦工只需要支付哈希值即可;礦池運營商需要管理未使用的交易輸出集并處理其膨脹所帶來的影響,然而他們亦可以自由地從其內存池中丟棄低值密度的“塵埃”。無論如何,沒有用戶可能會花費“塵埃”。這將為scavenger-pools提供一個拾起并嘗試開采這些“塵埃”的機會,然而這仍然需要用戶采取行動以花費“塵埃”。用戶可能根本沒有注意到或關心到“塵埃”的存在。
關心“塵埃”的獨立礦工或者礦場經營者可以選擇一個零交易費用的假期。在這段時間內,挖礦者有意支持零交易費用,這些交易是消耗低值密度未使用的交易輸出,可以在“春季大掃除”期間完成。這么做的目的是讓用戶對自己的錢包進行清理,讓礦工和節點運營商大幅減少其未使用的交易輸出集的內存占用量。
其他的,如BetterHash之類的想法 讓礦工重新掌握自己的哈希算力,這也許會支持更多的個體挖礦者離開傳統的挖礦池,并開始自己構建區塊。此外,礦工可能不得不關心“塵埃”。
理論上,挖礦者可以選擇不處理產生“塵埃”的交易。因為,他們估計不愿意在短期內犧牲交易費用收入來防止長期產生“塵埃”。
全節點運營者(只進行區塊鏈節點的備份和交易驗證、轉發的運營者)亦具有一定的“塵埃”產生能力。節點控制者可以將值密度的最小值設置在部分錢包軟件中,低于該值密度未使用的交易輸出(以及創建其事務)將被忽略。在某種程度上,此設置已經可以防止創建極低值密度的未使用的交易輸出。如果從未實施此設置,今天可能會有更多“塵埃”。然而,只有極少數的節點運營者愿意配置時調整的如此細致, 原因是錢包軟件默認關閉其參數。
與前面提到的對象相比,開發人員才是限制“塵埃”產生的關鍵。開發人員可以編寫新的軟件供用戶使用。對于軟件所進行的不當優化是產生“塵埃”的根本原因。只有不斷更新優化策略才能在實踐中趨于完美的境界,亦是減少未來“塵埃”生成的有效的途徑。開發人員可以通過調整默認設置的方法間接對節點運營者、礦工、交易所進行影響。使這些場所對“塵埃”產生“群體免疫”,從錢包中放棄“塵埃”。
通過底層活動(如UASF運動),開發者與礦工和用戶進行協同,搭建專門的交流渠道,以進行“春季大掃除”和零交易費用假期。亦可以采取構建第二層網絡的方法,來充分克服“塵埃”問題。
對比特幣的未使用的交易輸出集進行了詳細分析。結果表明,目前無法避免“塵埃”的產生。從比特幣剛誕生起,人們不斷地提高對于“塵埃”的認識,從2018年3月起嘗試清理“塵埃”,然而“塵埃”還是不停產生。值密度低于75 聰/字節的未使用的交易輸出顯示出持續的上升曲線,之后迅速回調。這說明有人正在積極地制造“塵埃”,然而至少亦有人在做清理。此外,值密度小于 250 聰/字節的未使用的交易輸出(以美元計)已經增加了10%,這些未使用的交易輸出在2020年初已不再是“塵埃”了,然而如果交易費用再次像2020年末那樣上升,其將迅速變成“塵埃”。
“塵埃”的產生是由于比特幣本身效率不高的機制所導致的。并非所有的區塊鏈都使用了未使用的交易輸出模型。例如,以太坊就使用了賬戶模型。賬戶模型的特性決定了不同的交易向同一地址存入以太幣是會打亂順序混合在一起的。賬戶模型的每次交易產生的花費均由傳播交易的地址節點來支付,并不是由交易中被轉移以太幣的地址節點來支付。
上面提到的這兩種差異都大大減少了“塵埃”的產生,然而并沒有完全消除它。以太坊的創始人一樣擔心“塵埃”,包括其所帶來的效率低下的問題。“塵埃”的產生在各種區塊鏈中都是要值得擔心的重大問題。