芬尼攻击复盘:预挖、零确认与闪电惩罚的同一模型 图 1
芬尼攻击复盘:预挖、零确认与闪电惩罚的同一模型 · 图 1

芬尼攻击的原始剧本

中本聪在 2010 年夏天发布 v0.3.12 前后附了一段关于双花风险的简短说明,随后围绕快速支付(自动售货机)问题的论坛讨论里,Hal Finney 给出了后来以其名字命名的攻击雏形:收款方在收到某个有效支付的广播之前,先离线挖一条以该支付为支点的秘密链——因为他自己控制算力,他手里的副本一定有效;等秘密链至少领先一个区块,他再把那个支付花到别处,同时把早已挖好的链放出来。只要他的链更长,网络会把那笔支付给商家的那条历史淘汰。注意剧本的硬前提:攻击者必须预挖,这要求他本身就掌握可观算力;同时商家要在零确认下就交付商品。同一讨论串里也有观点强调,这一威胁模型需要矿池或大体量矿工参与才有像样的成功率。

芬尼攻击复盘:预挖、零确认与闪电惩罚的同一模型 图 2
芬尼攻击复盘:预挖、零确认与闪电惩罚的同一模型 · 图 2

它和抢双花、51% 的边界

芬尼攻击常被和另外两种双花混为一谈。抢双花(race attack)不需要算力,利用的是网络传播的时间窗:两笔冲突交易几乎同时从不同位置广播,让不同节点先看到不同版本。芬尼比它强在攻击者手里先有一条链,商家看到的零确认交易从一开始就大概率是输家。51% 攻击则是事后翻历史,公开算力碾压,成本量级完全不同。三者对商家的启示却同构:交付时点越早、依赖的链下信任越多,安全边界就越薄。确认数的作用不是”等得久就绝对安全”,而是把攻击方的成本从”预挖加藏链”推到”必须真金白银重写已公开的历史”。

闪电时代的新版本

同一剧本搬到闪电网络,名字变成惩罚交易:通道对手如果偷偷广播一个过期的余额状态,另一方手里留着带更新的承诺交易与撤销密钥,同样可以先”离线预挖”——在链下按最新状态重排,再等上链时机。区别在于闪电把芬尼式的博弈内置成了激励对称:作恶方一旦旧状态上链,守规矩方能在惩罚窗口内取走全部余额。因此闪电里防芬尼的正确动作不是”多等确认”,而是:保留完整的通道状态与撤销数据、确保自己的节点在惩罚窗口内在线,或者把 watchtower 服务(BOLT-13 一类草案思路)作为默认配置,以及给自己的退款路径留够手续费余量,防止窗口遇上费率高峰时上不去链。

零确认的现在时

今天绝大多数场景已不再需要零确认作为交付依据:闪电网络让小额即时支付天然有链下终局,而大额走链上确认。仍依赖零确认的主要是两类场景——静态二维码的隐私收款(静默支付让收款码长期公开)和某些”先发货后确认”的链上服务。对这些场景,芬尼威胁评估的通用公式没变:商品价值必须显著低于攻击者为此预挖并浪费的算力与机会成本,并且商家自身节点要第一时间看到冲突交易——双花尝试的可见性取决于商家广播与监听能力,这也是为什么”跑自己的节点+多地域监听”被反复写进防御清单,而不是一个可选项。

实操底线

把三条写进风控:不向任何”即时到账”承诺交付与等值或更高价值的东西,除非收款方要么在链上等了可量化的确认数,要么运行带惩罚机制的协议并留好了撤销数据备份;任何声称”已内置零确认保险”且无法说出威胁模型的服务默认跳过;把支付金额、确认数、时间戳、对方节点可达性做日志,双花事件复盘全靠这叠线索。芬尼攻击本身从未成为公开确认的大规模实战,但它的价值在于给出了一个可计算的安全模型——威胁不是”会不会被双花”,而是”在什么价格结构下双花才有利可图”。本文只做机制说明,不构成任何投资建议。