在以太坊和整个加密货币世界里,“双花”是一个经常被提起的词。简单说,双花就是同一笔钱被花了两次。听起来不可思议,毕竟在现实生活中,你花出去的现金不可能再花一遍,但在数字世界里,钱本质上就是一串数据,数据是可以复制的,所以如果没有防护机制,同一笔钱确实可能被重复使用。这就是双花问题,也是所有数字货币必须解决的核心难题。
举个例子:你钱包里有1个以太坊,你先转给朋友小明,然后又用同样的1个以太坊转给商家换商品。如果这两笔交易都能成功,你就等于凭空多拿到了一份商品,而小明和商家中肯定有一方收到的钱是无效的。这就是典型的双花场景。
传统金融里,银行作为中心机构负责记账,你花一笔钱,银行扣一次余额,自然不会出现双花。但以太坊是去中心化的,没有银行,全世界成千上万个节点共同记账,所以必须靠一套共识机制来保证每笔钱只能花一次。
第一种是竞态攻击,也叫速度竞赛。攻击者同时向网络广播两笔交易,把同一笔钱转给两个不同的地址。一笔发给商家,另一笔转回自己钱包。由于两笔交易几乎同时发出,部分节点先看到A笔,部分节点先看到B笔,如果商家在交易还没被最终确认时就发货,攻击者就有机会让发给商家的那笔交易作废。
第二种是芬尼攻击。攻击者先挖出一个区块,里面包含一笔转给自己的交易,但先不公布。然后找商家用同一笔钱付款,等商家发货后,立刻把之前藏着的区块广播出去,这样包含付款给商家的那笔交易就会因为冲突而被网络拒绝。
第三种是51%攻击,也是最严重的。如果某个攻击者控制了全网超过一半的算力或者质押量,就有能力自己重组区块,把已经确认的交易推翻,从而实现双花。不过对以太坊这种体量的网络来说,控制51%的质押量需要天文数字的资金,实际操作难度极大。
以太坊靠三道防线来解决双花问题。第一道是账户余额机制,每笔交易发出前,节点会检查你的账户余额够不够,余额不足直接拒绝,nonce机制还会保证每笔交易的顺序唯一,防止重复提交。
第二道是共识机制。以太坊现在采用权益证明,也就是PoS,验证者需要质押32个以太坊才能参与出块。如果有人作恶,比如同时给两条分叉链签名,一旦被发现,质押的以太坊会被罚没,这叫罚没机制。作恶的成本远高于收益,从经济上遏制了双花的动机。
第三道是区块确认和最终性。交易被打包进区块后,还需要后续区块不断在其上叠加。以太坊引入了检查点机制,每两个epoch之后区块就达到最终状态,一旦最终确认就不可逆转。想要推翻最终确认的区块,攻击者至少要损失全网三分之一的质押量,代价是毁灭性的。
虽然以太坊网络本身很难被双花攻击,但作为用户还是有需要注意的地方。首先,接收大额转账时,一定要等足够的确认数。小额转账等几个确认就够,大额交易最好等到区块最终化,通常十几分钟就完成了。
其次,商家和交易所要警惕零确认交易。在交易还没上链之前就发货或放币,等于给了攻击者竞态攻击的机会。尤其是线下场景,有人拿着转账界面截图说是已经付款,这时一定要在链上查到这笔交易并且有确认才算数。
另外,如果你是做链上业务的开发者,涉及大额资金的服务建议接入最终性监控,确认交易达到最终状态再执行后续逻辑,不要只看交易被打包了就放行。
双花问题是数字货币的天生挑战,而以太坊通过账户模型、权益证明共识和最终性机制,构建了层层防御,让双花攻击在实际中几乎不可能得逞。对普通用户来说,只要记住一条原则:大额转账等最终确认再交付,基本就能避开双花带来的风险。理解双花,也能帮你更深刻地理解区块链为什么有价值,它本质上就是用技术和经济激励,替代了银行的角色,让互不信任的人可以在没有中介的情况下安全地转账。