什么是双花问题?比特币是如果防止双花问题的?

 2023-08-01 22:00:22发布 2023-08-29 13:19:17更新

作为区块链的数字货币,最重要的事情,便是要解决双花的攻击。

什么是双花问题?

这是数字现金系统中的潜在问题,是指同一笔资金同时支付给两位收款方。通俗的说,就是一笔钱可以花出去两次。

如果没有适当对策,仅凭协议无法彻底解决该问题,毕竟用户无从验证自己收到的资金是否还曾经付给他人。

在数字现金领域,必须确保特定的货币单元不可复制。如果 Mary 可以接收10个货币单元,并复制粘贴 10 次,然后自己拥有了 100 个货币单元,那么整个系统将土崩瓦解。

同样,如果她能够将同一笔 10 个货币单元同时发给 Bob 和 Carol ,系统同样无法运转。

因此,必须有合适的机制防止这种情况发生,才能确保数字货币正常运行。

 

如何防止双花的发生?

中心化方式

中心化方式比去中心化方案更容易实施。通常,需要安排一名监督员来管理系统并控制单位的发行和分配。大卫·肖姆(David Chaum)的eCash就是通过中心化方式解决双花问题的一个有效例子。

要向用户发行类似于现金的数字资产(具有匿名性和点对点交易属性),银行可以使用盲签方式-密码学家David Chaum在1982年的论文《不可追溯的盲签支付方案》中对此进行了详细说明。

在这种情况下,如果某个用户(Dan)希望在银行账户中支取100美元的数字现金,则必须先通知银行。

如果他的帐户中有余额,那么他将生成一个随机数(对于较小的面额,则需要生成多个)。假设他生成了五个随机数,每个数字代表的价值为20美元。

为了防止银行能够追踪到特定的货币单元,Dan 通过为每个随机单位添加盲因子来混淆随机数。

然后,他将这些数据交给银行,该银行从他的帐户中扣除 100 美元的余额,并对消息进行签名,证明五条信息中的每条信息都可以代表 20 美元。

之后,Dan就可以使用银行所发行的数字现金了。现在他去Erin的餐厅用餐花费了40美元。

Dan可以消除盲因子,以暴露与每个数字现金“账单”相关的随机数,该随机数可以用作每个单元的唯一标识符(非常类似于序列号)。

他向 Erin 透露了其中的两个,Erin 现在必须立即向银行申请验证这笔资金,以防止 Dan 将其支付给其他人。银行将检查签名是否有效,如果一切正确,它将向 Erin 的帐户中存入40美元。

现在,上面所有的交易记录都已经核对无误,如果 Erin 希望以同样的方式使用她的账户余额,则必须在银行账户上执行相同的操作。

Chaumian eCash 的设置对于私人转账十分有价值。

但是,由于银行是中心化节点,可能存在单点故障,因此,某些情况下是无法正常工作的,而某种程度上,银行所发行的资产可能一文不值,因为其价值完全是按照银行的愿意,然后将其兑换成美元。

客户会受银行左右,必须依靠银行的信誉背书才能体现价值。这也正是加密货币旨在解决的问题。

 

去中心化方式

在没有监督机制的生态系统中如何确保不发生“双花”支付,是相当更具挑战性的。具有同等能力的参与者必须按照一组规则进行协商,防止欺诈的发生,并激励所有用户诚信经营。

比特币白皮书中提出的最大创新是双花问题的解决方案,中本聪提出了一种数据结构,尽管现在没有这样引用,但它现在被广泛称为区块链。

区块链实际上只是具有某些独特属性的数据库。网络上的参与者(称为节点)运行专门的软件,该软件使节点能够将其数据库副本与其他节点进行同步。促使整个网络都可以从创世区块开始,审核和追溯链上发生的交易。

通过公开查看区块链,可以很容易地检测和防止欺诈行为活动,例如识别出进行双花支出的交易。

用户广播交易时,不会立即将其添加到区块链中,必须首先通过挖矿将其打包在区块中。这样,接收者在确定交易已经添加到区块链之后,才可以认为该交易有效。否则,他们有失去资金的风险,因为发送方可能在其他地方支付了相同的代币。

如果交易被区块链正式确认,则代币就不可能被重复使用,因为所有权已分配给新用户,并且整个网络都可以对此进行验证。

出于这个原因,许多人建议在接受有效付款之前先等待多次确认。随后的每个区块的验证,都会对修改或重写区块链,增加极大的工作量。

让我们回顾一下刚才餐厅的消费场景,Dan 回到餐厅,这次在窗口上看到一个“此处接受比特币支付”的标签。他对上一次的用餐非常满意,所以他再次点了同样的套餐,花费了他 0.005 BTC。

Erin 向他展示了一个公共地址,他必须将资金发送到该地址上。Dan 支付后,广播了该交易,这实质上是一个已签名的消息,指出 Dan 拥有的 0.005 BTC 现在已经在 Erin 的手中。

无需过多透露细节,任何与 Dan 进行了签名交易的人都可以验证他确实拥有这些代币,因此有权发送它们。

但是,如前所述,该交易仅能够在被区块链确认后才能有效。如果在没有区块链确认的情况下就确认接收到该笔资金,就像接上一案例中接收40美元的eCash一样,如果不立即通过银行兑现,发送方可以将该笔资金又在其他地方。

因此,我们建议 Erin 在确认 Dan 的付款之前至少等待6个区块确认。

 

比特币如何避免双花问题?

比特币经过精心设计,可防止双花攻击,至少在协议使用符合预期的情况下确实如此。

也就是说,如果有人正在等待某笔交易获得区块确认,则发送者将无法轻易撤销该笔交易。只有“反转”区块链,才能撤销交易,这需要无比庞大的哈希算力。

然而,有些双花攻击专门针对接受未确认交易的用户,诸如小额购买,商户就不想等到交易装入区块。

因此,如果商家启用了“即时”付款,就有可能面临双花问题。

目前有三种普遍的双花攻击:

  • 51%攻击单个实体或组织设法控制超过50%的哈希率,以此删除或修改交易顺序。

  • 竞争攻击(Race attack):使用同一笔资金连续发布两笔有冲突的交易,但仅一笔交易得到确认。攻击者的目标是通过验证对自己有利的交易让另一笔支付失效。例如,将资金发送到他自己控制的地址。竞争攻击一般会让接收方接受一笔未确认的交易作为付款。

  • 芬尼攻击(Finney attacks):攻击者预先挖矿一笔交易放入区块,但并不立即发布到网络中。相反,他将同一笔代币支付到另一笔交易中,然后才发布之前已挖出的区块,从而使支付无效。芬尼攻击的必要条件是事件按照特定顺序发生,能否成功还取决于收款方是否接受未确认的交易。

当然,比特币的创始人中本聪早就想到这个问题,通过 UTXO 和 时间戳 以及规定每笔交易必须进行六次确认等方法,使比特币不会出现双花问题。

UTXO

UTXO 是比特币交易的基本单位,是指未花费的交易输出。

通俗理解就是:看有多少笔交易给了我多少钱并且我没花掉,我就有多少钱。当一个用户接收比特币时,金额被当作 UTXO 记录到区块链里。

比特币系统当中记录着每一笔未花费的交易输出。当某一笔比特币交易被创建并广播到区块链网络之后,接收到此交易信息的节点会对交易进行验证,需要去UTXO数据库里查,检查其是否存在于UTXO中。

如果交易输出已不存在于 UTXO 中,则验证失败。

时间戳

当一个用户同时将1个比特币同时转账给两人时,两笔交易仅会有一笔成功,因为矿工会选择记录优先接收到的,或者交付手续费更高的那笔交易。

当交易被矿工们先后记录后,根据时间戳数据来证明,最先被记录的交易才能被成功验证。

六次确认

是指在这当前区块之后又有5个区块被计算出来连接到区块链上,每一个都相当于对前面一个区块进行确认,区块链上每增加一个区块就增大了前面区块被篡改的难度,6 个之后就认为基本上没法被篡改,所以认为这笔交易就算完成了。

分叉

分叉,是指同一时间段内全网不止一个节点能计算出随机数,也就是同时挖到了矿,这些节点都会把自己挖到的矿,链到自己本地的区块链上,这就出现了区块链分叉,他们都会在网络广播他们各自打包好的区块,以便于其他节点同步完最新数据后,在最新的区块链上继续挖矿。

由于距离远近,不同矿工看到的这些区块是有先后顺序的,矿工会把先看到的区块复制过来,然后在该区块上继续开始新的挖矿工作。

最终其中的一条链被证实为较长的一条,那么其他分支链条上工作的节点将转换阵营,开始在较长的链条上工作,这条链就成了主链,其他分叉出来的链将会被网络抛弃、消失。

这也是避免双花问题的一大利器。

尽管比特币还没有发生过双花问题,但并不意味着绝对不会出现这种情况。上文提到的 51% 算力攻击就是一种可能性。

然而,为什么没有人这样做呢?

首先,这是因为这样做的成本非常高,没有人能轻易地掌握 51% 的节点,其次,假设有人已经掌握了51%的节点,他也会成为比特币网络中的最大受益者。

这种情况下,如果他发动了 51% 攻击,可以在短期内获得利润,但这将对比特币的价值造成毁灭性打击,届时他将成为最大的受害者。

推荐阅读