作者:
2019201406杜鹏勃
2019201114路博鸣
2019201408胡王兵

一、什么是双花问题

双花(Double Spending),即双重支付又称一币多付,指的是在数字货币系统中,由于数据的可复制性,使得系统可能存在同一笔数字资产因不当操作被重复使用的情况。
简单来说,同样一笔数字资产被重复支付,即同样一笔钱被花掉两次或多次。比如,我们微信钱包里有100块钱,我们先去饭店吃了饭,结果微信出了bug,这笔交易并没有被银行同步,还留在钱包里,于是我们又能拿着同样的100元去看一场电影,这就属于双花问题。

二、双花问题的类型

一般来说,双花问题分为两种情况:
一种是由于信息同步有延迟造成的双花,被称为记账前双花;另一种是由于恶意节点攻击导致账本信息丢失造成的双花,被称为记账后双花。

三、双花问题的来源

1.实体货币

实体货币不存在双花问题,比如一张一百元人民币,不可能同时出现在两个地方。

2.中心化系统

中心化系统中也不存在双花问题,比如银行系统,假如A要向B支付100元,则银行系统会先检查A的账户余额是否足够支付100元,否,则报错提醒,是,则从A的账户中减去100元,同时向B的账户中增加100元。

3.去中心化系统

去中心化系统中会有双花问题出现,比如在区块链系统中,双花问题会在以下情况下出现:
1)由于共识机制导致区块确认时间长,用一个数字货币去进行一次交易,可以在这笔交易还未被确认完成前,进行第二笔交易。可以理解为“反应迟钝”“反射弧长”造成的问题。
2)控制算力来实现双花,第一次交易被验证通过并记录入区块后,在该网络中有更高的算力验证出新的更长链,在该链中这笔钱被第二次花费,由于第二次花费的区块链条更长使第一次交易区块所在链条为无效链条,这样一来,第一次交易所在的区块链被区块链网络放弃,第一次花费的钱又回到自己账户了,就导致了双花问题。

四、比特币解决双花问题的方法

比特币作为一个去中心化的点对点电子现金系统,主要依靠未花费的交易输出(unspend transaction output, UTXO)和时间戳来解决“双花”问题。

1.UTXO


比特币交易的基本单位是未花费的一个交易输出,简称UTXO。一个未花费的交易输出(UTXO)就代表一定数量的比特币。多个UTXO可以组合、单个UTXO也可以拆分,做出支付所需的任何面额。当一个用户接收比特币时,金额被当作UTXO记录到区块链里。一个用户拥有的比特币实际上会被当作UTXO分散到数百个交易和数百个区块中。

“一个用户的比特币余额”,这个概念是通过比特币钱包创建的派生之物。比特币钱包通过扫描区块链并聚合所有属于该用户的UTXO来计算该用户的比特币余额。事实上,比特币现金系统中并没有账户,没有钱包,没有余额,有的只是记录在区块链中,被所有者锁住的UTXO。

一个比特币交易可以包含任意数量的输入和输出。因此,用户可以任意组合和拆分UTXO来完成任意金额的付款。例如,Alice持有两个UTXO,分别价值0.5BTC和0.7BTC.当她向Bob支付1BTC时,可以使用这两个UTXO作为输入,然后将1BTC的输出发送给Bob。

Alice还另外创建了一个0.199BTC的输出作为找零发送给自己,由于需要支付交易费,她无法给自己发送0.2BTC,交易费不以交易输出(UTXO)的形式体现。它是通过输入值和输出值之间的差额推算得出。

比特币使用前后链接的区块链记录所有交易记录,当之前的UTXO出现在后续交易的输入时,就会被检查这笔交易的来源已经不在UTXO列表中,也就是说这笔钱已经被花过,这个UTXO已花费掉,不再是UTXO了。 如果你用同一笔UTXO构造了两笔分别付给A和B的交易。那么bitcoin-core客户端(比特币系统节点)的规则是只转发先侦听到的那个。但至于哪笔交易会被包含进未来的区块,则取决于矿工。

UTXO模型可以让比特币节点有效验证链上的每个交易。当某一笔比特币交易被创建并广播到区块链网络之后,接收到此交易信息的节点会对交易进行验证,检查其是否存在于UTXO中。如果交易输出已不存在于UTXO中,则验证失败。正因如此,比特币可以在不依赖可信第三方的情况下解决双重支付问题。

2.时间戳


比特币现金系统本身就是构造了一个永不停息、无坚不摧的时间戳系统。时间戳可以作为公证人的角色,为区块链上的每一个区块打上一个时间印记,确保他们依时间顺序相连,且无法被篡改。

时间戳是一份能够表示某项数据在一个特定时间就已经存在的,且完整的可验证的字符序列。其证明力基于哈希函数的数学原理,由于哈希函数具备匿名性与不可篡改性,若原始数据发生改变,则哈希值也会发生改变,后续带有时间戳的数据也无法与原始数据相匹配,从而实现对数据的认证。

假设用户将被存在于自己UTXO中的1个BTC同时转账给两个不同账户,两笔交易仅有一笔会成功完成。为什么呢?因为系统中的节点会选择性地记录先接收到的那笔交易。当两笔交易同时被同一节点记录,根据时间戳的数据,只有先被记录的交易才能被确认成功。

如果他的两笔转账的时间隔得非常非常近,“用户在12点34分56秒转给一号账户1个比特币”、“用户在12点34分57秒转给二号账户1个比特币”恰好被两个不同的节点记录,会出现“双花”吗?也不会。这两个节点会将各自挖出包含相关交易的区块同时广播到比特币网络中,此时区块链将出现分叉,剩余节点选择在他们认为的最长链上构建新的区块。最后,率先构建出新区块并成为当前最长链上的交易(通常为6个区块),才能被确认成功。之后的所有节点将在此最长链上构建新的区块。

五、双花问题的防范措施

1.如何防范记账前双花

在区块链应用中,防范未记账前的双花,最好的解决方案也是等记账后,再完成交易。不过,如果金额很小,人又熟交易是可以不记入区块链的,即没有记账的情况下,也可以完成支付。这叫“零确认支付”,只不过这种方式,收款方是要承担被双花的风险。

2.如何防范记账后双花

整个区块键技术的核心就是保障账本的安全,记了账就不能被双花。但安全不是绝对的,即使记了账,仍然有可能被双花。因为,区块链应用不是依靠中央银行这样的机构的权威来保障账本安全的,而是依靠分布世界各地的节点都保存统一份的账本,并且由全世界的矿工用算力来竞争记账,产生完全一致的新账页的。除非遇到“51%攻击”,即当有人掌握了全网51%以上的算力时,就能够将刚刚记过的账页作废,把里面的一笔花费恢复成没被花掉的状态。这就是记账后的双花了。

解决的办法是,等待更多确认。51%的算力要作废最新账页,其成功概率是51%,但作废连续两个新账页的概率就是51%*51%=26%,作废3个的概率是13.3%,作废6个的概率只有0.46%了。如果攻击者没有掌握51%的算力,只掌握20%的算力,那么攻击成功的概率就只有0.0064%了。

六、总结

双花问题:
双花问题指的是同一笔数字资产被重复支付。
比特币中解决双花问题的方法:
1)UTXO:通过查验当前交易内的UTXO是否真的有效且没有被花费,保证比特币可以在不依赖可信第三方的情况下解决双重花费问题。
2)时间戳:通过时间戳,用户发起的每一笔交易都能有时间记录,当攻击者在交易过程中发起交易时,系统能够辨别出交易发起的时间,根据时间顺序就能迅速确认第一笔交易时间,从而解决双花问题。

参考文章

[1]魏松杰,吕伟龙,李莎莎.区块链公链应用的典型安全问题综述[J].软件学报,2022,33(01):324-355.DOI:10.13328/j.cnki.jos.006280.
[2]https://www.jianshu.com/p/56617e91b12a