加密货币“尘埃”现象分析及对策
——以比特币为例
2021-11-01孟青,于瓅
孟 青, 于 瓅
(安徽理工大学 计算机科学与工程学院, 安徽 淮南 232001)
比特币出现于2008年年末,当时的美国正处于次贷危机的末期。中本聪在发表比特币白皮书即《比特币:一种点对点的电子现金系统》[1]后的第2年,就发布了比特币的第一版实施系统。据普林斯顿大学出版的《Bitcoin and Cryptocurrency Technologies》[2]币源代码可以看出,比特币系统没有将模块划分很清楚,具有不一样作用的功能都放在一个5 000多行的主程序中实现。因此,推断中本聪一开始写比特币代码时并没有从架构上考虑太多,而是用简单直白的办法一气呵成地把比特币系统写了出来。因为,当参与开源项目的开发者多起来的时候,一个清晰的架构就会显得愈来愈重要,对代码的维护、重用和扩展具有重要的意义。比特币(Bitcoin,缩写BTC)作为一种总量恒定,价值波动剧烈的数字货币,和互联网一样具有去中心化、全球化及匿名性等特性。在现实生活中,向不同国家转账需要经过各种手续,手续费亦会比较高昂。然而,比特币却没有任何条件限制,除了较低的交易费用。比特币因此被广泛利用于全球贸易、跨国转账支付等领域。
不同的加密货币具有不同的交易模型,例如未使用的交易输出(unspent transaction outputs)模型[3]、账户模型等。其中,以账户模型为大众所普遍使用,例如创建的个人账户等。未使用的交易输出模型是一种全新的交易模型,因为比特币的诞生而被广泛了解。在比特币中,并不存在一个账本记录了每个账户的余额。这表明就需要查看以前所有的交易记录,从记录中找出所有发往某个账户比特币,再将比特币的数额计算出来,才会知道某个账户的余额。比特币协议有时需要在用户发送比特币时产生极小额度的比特币输出,虽然这些比特币的价值微不足道,然而仍然会占用一定的未使用的交易输出空间。因为比特币是按照字节收费,这表明想要花费这笔比特币时需要支付的交易费用可能比其实际价值还要多[4]。正因为如此,现实当中几乎没有人会这样做。
然而,由于区块链空间有限,太多的小额度比特币交易仍然可以占用很大的交易空间,又因为拥有者基本上不会用此进行消费,使得未使用的交易输出集越来越庞大,可能会导致整个系统的性能问题。上述问题被形象地称为“尘埃”问题[5]。“尘埃”问题影响了未使用的交易输出模型,“尘埃”的生成所带来的低效率的问题,在各种区块链中都是存在的。
本文根据2010—2020年比特币的未使用的交易输出历史集,绘制出余额随着时间的变化图,充分体现出“尘埃”所带来的问题[6]。根据未使用的交易输出集中的历史交易信息给“尘埃”在字节层次上下一个定义。以此,找出目前存在多少的“尘埃”和其代表了多少的价值。对目前交易所、用户、矿工、全节点运营者及开发人员等为了减少“尘埃”的生成而采取的措施进行了研究和总结。
1 加密货币“尘埃” 问题
加密货币中的“尘埃”数量是由当前未使用的交易输出集和交易费用所决定的。在交易费用达到顶峰的时期 (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)
其次可以根据下面两个指标区分未使用的交易输出中的“尘埃”:①矿工目前接受的最低的交易费用;②值密度。这两个指标都是用聪/字节作为单位,因此可以直接进行比较。假设矿工所接受的最低交易费用大于值密度,则就是“尘埃”。 矿工目前接受的最低的交易费用就是“尘埃线”。未使用的交易输出会随着交易费用的变化会跌到“尘埃线”以下,亦会升到“尘埃线”之上,因为交易费用是会发生变化的。
2 如何获取未使用的交易输出的大小
如果想要将一个未使用的交易输出划分为“尘埃”,除了每个未使用的交易输出显而易见的余额值外,更需要知道每个未使用的交易输出的大小,即字节数。字节数并不是简单的测量就可以得出。平均而言,在一次事务中花费的未使用的交易输出越多,平均花费未使用的交易输出所需的字节数就会越少。然而,可以估计出一个平均值。假设使用的未使用的交易输出是事务中的单个输入,那么,要求花费该未使用的交易输出所需的字节数将取决于未使用的交易输出地址的类型,不同类型的未使用的交易输出的地址具有不同的大小,其中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 按地址类型划分的未使用的交易输出
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万美元。然而这些“尘埃”价值还是太高。采取智能交易可明显地减少使用未使用的交易输出的字节数,降低对“尘埃”数量的判断。
4 比特币区块链中减少“尘埃”的措施
比特币是一个无领导的系统,因而很难消除现有的“尘埃”,并降低未来的“尘埃”的产生。相对的,更应该依靠于对底层的行业用户、矿工和企业采取的激励措施。
4.1 交易所
虽然价格暴跌是减少“尘埃”的原因,然而在2018年,交易所等高交易量企业(最著名的是Coinbase)还是制定了积极的除尘措施。图6是采取这些措施的所带来的效果。
从图6中可以看出,整个市场的趋势是增加“尘埃”的数量。单个参与者可以显著增加或减少“尘埃”量。然而,“尘埃”的生成永无止境。诸如Coinbase之类的企业一直在制造大量“尘埃”,并且无法充分批处理客户交易,因此无法有效利用区块空间。当交易费用在下一年开始回落时,Coinbase开始采取措施减少现有的“尘埃”和未来的“尘埃”产量。于是,开始着手实行批量交易,这样既节省了交易业务费用,同时亦减少了“尘埃”的生成。
图6 低价值密度未使用的交易输出的比特币余额表(注释版本)
4.2 用户
用户本身不受“尘埃”的影响。然而因为钱包软件的效率问题,用户会生成“尘埃”的可能性大大增加,很少有用户会选择创建数量庞大的“尘埃”。
用户对高昂的手续费表示反感,然而“尘埃”不会对交易费用产生直接影响。效率低下的未使用的交易输出管理,既会产生“尘埃”,又会导致更多小额的交易,这是导致费用增加的更大原因。因此,用户只有适度的动机来减少“尘埃”。
虽然用户缺乏动力,然而用户有能力限制“尘埃”。2017年UASF运动已经证实,用户只要想去做还是有能力做到的。“尘埃”是一个广泛的问题,需要采取一种统一协调的手法来解决。用户可以通过开发者或矿商,来放弃他们名下的“尘埃”。
用户可能更倾向于“捐赠”他们的“尘埃”来作为一种慈善方式,用户可以通过“捐赠”机制(例如,ALL|ANYONECANPAY或NONE|ANYONECANPAY 类型签名)来实现它。假设钱包软件支持其行为,那么社区就可以协调出一个公共大扫除时间段,在该时间段内交易费用为零。这项行为可以成为机构或项目获取资金的新方式,从比特币生态系统中受益匪浅。
4.3 矿工
大部分矿工都忽略了“尘埃”。矿池中的矿工只需要支付哈希值即可;矿池运营商需要管理未使用的交易输出集并处理其膨胀所带来的影响,然而他们亦可以自由地从其内存池中丢弃低值密度的“尘埃”。无论如何,没有用户可能会花费“尘埃”。这将为scavenger-pools提供一个拾起并尝试开采这些“尘埃”的机会,然而这仍然需要用户采取行动以花费“尘埃”。用户可能根本没有注意到或关心到“尘埃”的存在。
关心“尘埃”的独立矿工或者矿场经营者可以选择一个零交易费用的假期。在这段时间内,挖矿者有意支持零交易费用,这些交易是消耗低值密度未使用的交易输出,可以在“春季大扫除”期间完成。这么做的目的是让用户对自己的钱包进行清理,让矿工和节点运营商大幅减少其未使用的交易输出集的内存占用量。
其他的,如BetterHash之类的想法 让矿工重新掌握自己的哈希算力,这也许会支持更多的个体挖矿者离开传统的挖矿池,并开始自己构建区块。此外,矿工可能不得不关心“尘埃”。
理论上,挖矿者可以选择不处理产生“尘埃”的交易。因为,他们估计不愿意在短期内牺牲交易费用收入来防止长期产生“尘埃”。
4.4 全节点运营者
全节点运营者(只进行区块链节点的备份和交易验证、转发的运营者)亦具有一定的“尘埃”产生能力。节点控制者可以将值密度的最小值设置在部分钱包软件中,低于该值密度未使用的交易输出(以及创建其事务)将被忽略。在某种程度上,此设置已经可以防止创建极低值密度的未使用的交易输出。如果从未实施此设置,今天可能会有更多“尘埃”。然而,只有极少数的节点运营者愿意配置时调整的如此细致, 原因是钱包软件默认关闭其参数。
4.5 开发人员
与前面提到的对象相比,开发人员才是限制“尘埃”产生的关键。开发人员可以编写新的软件供用户使用。对于软件所进行的不当优化是产生“尘埃”的根本原因。只有不断更新优化策略才能在实践中趋于完美的境界,亦是减少未来“尘埃”生成的有效的途径。开发人员可以通过调整默认设置的方法间接对节点运营者、矿工、交易所进行影响。使这些场所对“尘埃”产生“群体免疫”,从钱包中放弃“尘埃”。
通过底层活动(如UASF运动),开发者与矿工和用户进行协同,搭建专门的交流渠道,以进行“春季大扫除”和零交易费用假期。亦可以采取构建第二层网络的方法,来充分克服“尘埃”问题。
5 结论
对比特币的未使用的交易输出集进行了详细分析。结果表明,目前无法避免“尘埃”的产生。从比特币刚诞生起,人们不断地提高对于“尘埃”的认识,从2018年3月起尝试清理“尘埃”,然而“尘埃”还是不停产生。值密度低于75 聪/字节的未使用的交易输出显示出持续的上升曲线,之后迅速回调。这说明有人正在积极地制造“尘埃”,然而至少亦有人在做清理。此外,值密度小于 250 聪/字节的未使用的交易输出(以美元计)已经增加了10%,这些未使用的交易输出在2020年初已不再是“尘埃”了,然而如果交易费用再次像2020年末那样上升,其将迅速变成“尘埃”。
“尘埃”的产生是由于比特币本身效率不高的机制所导致的。并非所有的区块链都使用了未使用的交易输出模型。例如,以太坊就使用了账户模型。账户模型的特性决定了不同的交易向同一地址存入以太币是会打乱顺序混合在一起的。账户模型的每次交易产生的花费均由传播交易的地址节点来支付,并不是由交易中被转移以太币的地址节点来支付。
上面提到的这两种差异都大大减少了“尘埃”的产生,然而并没有完全消除它。以太坊的创始人一样担心“尘埃”,包括其所带来的效率低下的问题。“尘埃”的产生在各种区块链中都是要值得担心的重大问题。