2.4 如何用区块链解决“双花”问题
在现实生活中,很多企业会遭受“双花”攻击。什么是“双花”攻击呢?“双花”攻击指的是同一笔比特币金额在不同的交易中的重复花费。通常情况下,“双花攻击”的方式有三种,如图2-8所示。
图2-8 “双花攻击”的三种方式
1. Race attack(Race攻击)
攻击者同时向网络中发送两笔交易,为了提高攻击的成功率,给一笔交易提供足够的小费,然后再把这笔交易发送给自己,把另一笔没有小费的交易发送给商家。由于发送给自己的交易中费用比较高,很容易被矿工打包成区块。
2. Finney attack(Finney攻击)
如果攻击者挖到了一个区块,这个区块中有一个交易:A向B转了10个比特币,其中A和B用的都是自己的地址。攻击者会先保留这个区块,不广播,直到找到一个能够接受未确认交易的商家购买物品,再向商家发送一笔这样的交易:A向C转了10个比特币,付款之后向网络广播自己挖到的区块。由于这个区块中已经包含了一笔向自己付款的交易,攻击者又私下完成一笔交易,因此就实现了“双花”。
3. >50% attack(>50%攻击)
“双花”的攻击者占据了超过全网50%的运算力,所以,能够创造出大于原有链高度的新链。新链创造之后,原有链中的交易就会被回滚。攻击者可以向新链中发送一笔新的交易。在“双花”中不会产生新货币,攻击者只能把自己花出去的钱再重新拿回来。
在区块链还没有加密功能之前,加密数字货币和普通的数字资产一样都可以被无限复制,如果没有中心化的第三方机构,用户就无法确认自己的数字资金是否已经被花掉。因此,在资产交易中,必须有一个可靠的第三方机构来保存交易的数据,从而保证每笔数字资产只能被花掉一次。
例如,我们在商场购物刷卡,可能会面临三种问题:
首先,刷卡时验证的是银行卡信息,只要刷卡机有相同的信息,账户里的钱就很容易被刷走。生活中有很多盗取银行卡进行复制的不法分子。尤其是在很多小店中刷过的银行卡更容易被不法分子效用并复制,然后刷掉里面的钱。
其次,在用户刷卡时负责结算和记账的银行服务器也很容易受到黑客的攻击,从而导致用户数据的泄露以及交易的伪造,这样的事件每年都会发生。
最后,刷卡人自己利用网络的延迟,在完成一笔交易,并且系统还没有记账之前,进行第二次交易。
面对这些问题,区块链是如何处理的呢?以比特币交易为例:
中本聪利用区块链时间戳的方式来保证每笔资金被支付以后不再用于其他支付。在区块链中,只要交易完成,每笔交易就会被盖上时间戳,时间戳都是唯一的,从而保证了不能多次支付,如图2-9所示。
图2-9 利用区块链技术解决“双花”问题
首先,拥有比特币的甲如果想要达成某一笔交易,需要向全网广播一条信息:甲向乙支付1个比特币来购买一件物品。与这条信息在一起的还有一条加密信息,而加密信息则是通过哈希函数对上一条信息加密生成的一条信息,必须用甲的密钥进行加密处理。
接收到信息的乙和其他用户会用相同的哈希函数生成摘要,再用甲的公钥对加密信息进行解密处理,如果解决之后的信息和生成的信息相同,就可以确认信息是甲发出的,而且中途也没有被篡改。
甲的公钥以及哈希函数都是公开的,只有私钥由甲自己控制,这样就保证了交易的顺利完成,在这个过程中,甲的信息根本无法被盗取。
其次,在运算力证明中胜出的矿工会负责这一时期的交易记录。区块链中存在无数个矿工,黑客因为无法获知是由哪一个矿工来记录这笔交易,所以就无法对系统进行破坏。
最后,在传统的系统交易中,结算速度比较快,不会出现重复支付的问题,而在比特币网络中,因为都是去中心化的管理系统,交易确认时间也会比较长,难免会出现比特币的双重花费问题。
把区块链技术应用到“双花”问题的解决中,每笔交易之后,系统都会确认比特币之前的状态,如果已经被标记为花掉,在新的交易中就会自动拒绝再次交易。如果事先发起了一笔交易,在这笔交易被确认并被记账成区块后,进行新交易就形成矛盾,而且也会被系统自动拒绝交易。
如果不法分子故意把一笔交易向一半网络中广播,另一笔交易向另一半网络中广播,两个矿工就都可以获得记账权,也都可以把各自记的区块发布出来。不过这种事件发生的概率很低,因为区块链规定,如果选择了任意一个账本,统一的账本就会出现分叉,这也就表示,在两个账本中只有一笔交易,不法分子根本无法从中获得好处。
如果另一个矿工选择了在甲账本的基础上继续记账,甲分支就会比乙分支更长,根据区块链的规定,最长的分支会被认可,而短的分支会被放弃,账本最后还是会合成一个,也就是说,只有一笔交易是有效的。要想知道有没有交易,需要查看交易的来源是否在UTXO未花费的交易列表中,不需要再追溯到Coinbase交易中。
在比特币系统中,所有的交易都会被记录到统一的时间戳中,然后再写到区块链上。我们可以把每一笔交易都当作是一张汇款单,把比特币中的每个区块都当作是一个账本。在每个账本中都会贴满很多张汇款单,每一张汇款单就是UTXO,如图2-10所示。
图2-10 比特币系统交易
UTXO作为一个数据结构,包含了很多交易数据和执行脚本,在这个数据结构中,有每一笔交易信息和未花费的交易输出。
例如,我们在钱包中放一张50元、一张10元、一张5元,共计65元。在比特币中的账户余额,也是根据账户UTXO来计算的。如果我们买东西花掉了46元,给老板50元,获得了4元的找零,那么,已经花出去的50元就不再属于UTXO,找零的4元钱就成了新的UTXO,而钱包里剩的19元就成了新的交易记录被重新记录在区块链中,但是区块链中以前的数据也不会改变。
比特币使用前后的所有交易记录都会被储存到区块链中,之前的UTXO如果出现在后续的交易中,系统会自己查看这次交易是否已经不再属于UTXO列表中,如果不再属于,说明这笔钱已经被花掉了。
如果用户用同一笔UTXO分成两笔来支付给两个商家。比特币客户端就会转发首先收到的那笔,矿工则会决定哪笔交易进入区块链中。
矿工在挖矿时的程序一般是预先设定好的,他们能够任意选择两笔交易中的一笔。例如,部分矿工会选择第一时间接收到的那笔交易,有的矿工会选择交易手续费比较高的那笔交易。
当两笔交易中的一笔被纳入区块链中,并且深度达到6个确认后,这笔交易就算完成了最终的确认。在6个确认过程中,比特币几乎不会出现“双花”问题。每笔交易中包含若干个资金来源和资金去向,通常情况下,每一笔交易中都要有一笔输出,这笔输出就是UTXO,资金来源都是来源于几个交易的UTXO的,以此循环往复,资金在交易中就流动起来。