作者:ademan

来源:https://delvingbitcoin.org/t/improving-the-security-of-lark-oor-channels-with-equivocation-bonds/2816

本文介绍了一种保证金,可以提升 Ark VTXO 的回合外(out-of-round)一次性分配的安全性。这样的分配是为了让小额的按需启用(just-in-time)闪电通道能够即时开启、为用户带来收款额度。这种保证金的工作原理是,使用 OP_CHECKSIGFROMSTACK,让 VTXO 的分配的出尔反尔(equicocation)在区块链上变得可以证明。每一次分配都由一个对分配交易的 BIP-341 sighash 的签名来授权,所以,相互冲突的授权签名正好能够用作出尔反尔的证据。 除了本文所述的应用场景,使用 OP_CHECKSIGFROMSTACK 来证明链外协议中的出尔反尔也许还有别的用处。

译者注:“equicocation” 原意为 “模棱两可、含糊其辞”,此处根据语境(Ark 服务商将同一笔资金先后分配给不同用户)译为 “出尔反尔”。

背景

LSP 的根本挑战在于通道流动性的高效分配(也即资金分配)。如果一个 LSP 在某个地方分配了太多流动性,就有浪费流动性的风险(也许把它们放到别的地方会更好)。如果分配得太少,又有可能在通道对手用尽这些流动性时不得不支付额外的链上手续费(以投放更多流动性)。吸引即将收取小额支付的新用户,带来了另一重挑战。只受到少量资金的新用户很容易放弃自己的通道,让 LSP 支付更多链上手续费来关闭通道、找回资金。在高手续费环境,小容量的通道甚至不值得关闭。

“lArk” 是 Ark 协议的一种修改版本,致力于提供类似 LSP 的服务,但提高链上效率。Ark 为 LSP 提供了非常有用的环境:通道拼接这样的 VTXO 操作可以在链外执行,批量的通道开启动作也可以减少链上踪迹。

对于终端用户,收取第一笔闪电支付是吸引新用户进入生态系统的重大门槛。对 LSP 来说,吸引新用户需要给新用户抛弃通道的风险定价(并算进 JIT 通道支持的价格中),可能因此提高手续费以及资本数量要求。但是,Ark 服务商可以在交易树中预先分配小额的 VTXO,然后用回合外操作(OOR)来按需开启通道。这使得 Ark 服务商可以即时开启通道而无需支付额外的链上成本,并且,被抛弃的通道也会自动回收,不影响交易树的其它部分!

问题

然而,OOR VTXO 的自治属性不佳,对服务商的合规也有影响。自治上的取舍也许对绝大部分小额资金用户来说是可以接受的,但单方面控制资金会给这样运营的 LSP 带来监管风险。VTXO OOR 转账在 Ark 服务商与 VTXO 持有者不会勾结的假设下是安全的,但在我们这里考虑的方案中,最初的 VTXO 持有者和 Ark 服务商是同一个实体。这个 Ark 服务商可以任意多次地重新分配这些 VTXO、开启没有真实比特币背书的 LN 通道。

解决方案(使用 CSFS)

我提议,Ark 服务商应该在链上放置一份 “出尔反尔保证金”,可以通过提供一个 “出尔反尔证据” 来罚没。

在本方案中, Ark 服务商预先分配 VTXO V_0 、V_1 … V_n。每一个 VTXO V_0、V_1 … V_n 都必须提供来自对应公钥 K_0、K_1 … K_n 的签名,才能分配。每个 VTXO V_i 的花费路径都必须提供 K_i 一个完全承诺花费交易的签名。公钥 K_i(K_0、K_1 … K_n)都是由 Ark 服务商自己选定的,但必须是全局唯一的,并且只能使用一次,以防止虚假的保证金没收。

为了分配一个预先准备好的 VTXO 给 Alice,Alice 和 Ark 服务商要对注资彼此闪电通道的分配交易达成一致。Ark 服务商使用公钥 K_i 来签名分配交易,从而产生对消息消息 M_a 的一个签名。如果这个 Ark 服务商签名了一笔冲突的分配交易、将同一个 VTXO 分配给了与 Bob 的 JIT 通道,那么这会产生同一个 K_i 对另一条消息 M_b 的签名。

出尔反尔保证金可以惩罚这种行为,办法是允许用出尔反尔证据来罚没这笔保证金。这样的证据有以下几个元素:保证金所指定的公钥 K_i、K_i 对两条消息 M_a 和 M_b 两个有效签名。

在分配过程中,Ark 服务商要提供一个签名 sig(B, K_i),它可以用作 K_i 被包含在保证金中的证据。在罚没期间,sig(B, K_i) 会用 B 来验证,而 B 已被承诺到保证金输出的罚没花费分支中。 分配操作本身要求 Ark 服务商使用 K_i 签名一笔分配交易,并将签好名的交易交给客户端。这意味着,来自 K_i、对两笔不同的分配交易的签名,以及一个保证金包含证据,足以构成一个出尔反尔证据。

如果 Ark 服务商签名了一笔交易,将 V_i 分配给了 Alice,这会产生 sig_a = sig(K_i, M_a)。 M_a 必须承诺完整的分配交易,从而除非用 K_i 对另一条消息生产另一个 签名,否则无法产生冲突的分配。如果 Ark 服务商后来又签名了另一笔交易、分配了 V_i 给 Bob,那就会产生 sig_b = sig(K_i, M_b)。这两个签名以及对应的消息,就能证明 K_i 是出尔反尔,而 sig_delegate = sig(B, K_i) 证明了公钥 K_i 是保证金覆盖的。提供 sig_delegate、K_i、sig_a、sig_b、M_a 和 M_b ,并且能通过所有这些验证:valid_sig(B, sig_delegate, K_i)、 valid_sig(K_i, sig_a, M_a)、 valid_sig(K_i, sig_b, M_b) 以及 M_a != M_b。

客户端必须验证分配交易以及签名,以及每一条花费路径都需要 K_i 的承诺完整花费交易的签名。客户端也必须验证保证金输出已经得到区块确认、尚未花费并且资金充足,而且 Ark 服务商不能在通道的生命周期中将保证金取走、以及保证金可以被出尔反尔证据罚没。 客户端无法验证已经存在的分配交易的数量,因为 Ark 服务商可以生成秘密的分配;客户端也无法验证一笔保证金覆盖了多少个 VTXO 。客户端应该要求在 Ark 服务商广告的 VTXO 价值与可以被罚没的保证金价值之间有一定的比例。

软分叉假设

这个方案依赖于比特币协议激活一个能够检查对任意消息的签名的操作码,以及一种简单的限制条款,以限制花费交易的输出。 OP_CHECKSIGFROMSTACK 满足了签名检查要求,它对出尔反尔证据以及授权保证金罚没都是必要的。而 OP_CHECKTEMPLATEVERIFY(OP_CTV) 和 OP_TEMPLATEHASH (TH)两者中的任何一个都可以满足简单限制条款的要求,它是所有方案的前提(除了最粗糙的保证金罚没方案)。虚拟交易树本身也需要对树上的交易作出不可撤销的承诺,如果有 OP_CHECKTEMPLATEVERIFY 或者 OP_TEMPLATEHASH,效果会更好。因为在创建预先准备的 VTXO 时,Ark 服务商是唯一知道这棵交易树的一方,所以这棵交易树无法用所有参与者的 n-of-n 多签名来花费。当然可以使用外部委员会来构造交易承诺,但这同样需要假设至少一个委员会成员删除了自己的私钥(1-of-n 诚实参与者假设)。

其他考虑

VTXO 输出,分配公钥和签名

保证金包含证明以及验证 sig_a 和 sig_b 都需要 OP_CHECKSIGFROMSTACK。因此,B 和 K_i 都必须是能够兼容 OP_CHECKSIGFROMSTACK 的公钥。sig_a 和 sig_b 必须是能够兼容 OP_CHECKSIGFROMSTACK 的签名。在本文撰写之时,这意味着。 sig(B, K_i)、sig_a、sig_b,都必须是 BIP-340 Schnorr 签名。B 和 K_i 都必须是 32 字节的 x-only 公钥。如果预先安排去的 VTXO 是 Taproot 输出、没有脚本路径,那么 K_i 能够满足要求,并且 K_i 就是输出公钥。为了保证签名承诺分配交易的输入和输出,sig_a = sig(K_i, M_a) 中的 M_a 应该是一个使用 SIGHASH_DEFAULT 标签的 BIP-341 sighash 。

分配交易的手续费

因为同一个公钥 K_i 对两条不同消息的有效签名就能触发罚没,所以分配交易应该使用 CPFP 来支付手续费(或其他不需要签名交易修改版本的方法)。

树结构

在预先准备的 VTXO 的生命周期中,必须禁止花费这个 VTXO 在交易树上的祖先(除非展开整棵树)。从链上的 UTXO 到叶子 VTXO 之间的部分,输出不应能被 Ark 服务商花费,除非 UTXO 超市。实现这些特性的最简单方式是将这些预先准备的 VTXO 放在普通 Ark 的 UTXO 之外,并且让树上的层级只能在超时后被 Ark 服务商花费,或者被树展开交易花费(通过 CTV 或者 TH)。出于简洁性,Ark 树和预先分配树刻意共享同一个链上 UTXO,但这会让普通 Ark 的用法稍微复杂一些,并让紧急退出多一笔交易。

保证金的生命周期

保证金会定期过期、并且在持续运营中可以替换,也许是有用的。保证金刻意设置一个带有时间锁的 “复原” 路径,让 Ark 服务商刻意在超时后拿回保证金,从而实现定期回收。在保证金过期之前,唯一可用的花费路径就是经济上没有吸引力的保证金罚没;客户端必须拒绝允许提早花费的保证金。新的保证金必须使用新的保证金密钥 B,以隔离新的保证金和旧的公钥委托和历史密钥暴露。保证金的生命周期应该不仅覆盖 VTXO 的生命周期,还加入时延,从而允许侦测出尔反尔和确认罚没交易。

保证金价值

因为一份保证金只能罚没一次,让保证金符合一定的比例对于产生所需的反激励效果是十分重要的。Ark 服务商总是有能力自己产生出尔反尔证据,然后尝试拿回保证金;因此,弃权的数额是重要的参数。也正因此,保证金无法提供完美的经济威慑,但依然是一种有用的反激励措施。Ark 服务商出尔反尔的次数越多,就有越多的 half-proof 生成,被罚没的概率也越大。Ark 服务商可以重新分配同一个 VTXO 任意多次的能力,让主动式侦测变得重要(详见下文)。

为了能从出尔反尔中获利,Ark 服务商必须把将同一个 VTXO 分配给真实的受害者,或者跟愿意接受无背书通道的第三方勾结而获利。当一个 Ark 服务商再分配一个 VTXO 时,哪怕跟一个第三方勾结,也会产生一个 half-proof 。同一个 VTXO 的任何诚实的 half-proof ,已足以让一个串通者背叛。串通者可能也会使用第二个身份,来获得第二个 half-proof,从而获得一个完整的出尔反尔证据以及罚没 Ark 服务商的保证金的能力。这种风险应该足以反激励 Ark 服务商,即使是跟第三方勾结。相反,对 Ark 服务商和潜在的串通者来说,如果第三方愿意接受,使用完全无背书的通道会更有利。

(译者注:此处的 “half-proof” 应指完整的 “出尔反尔证据” 的一半。)

侦测

如果用户在一些公开的频道发布了自己的 VTXO 分配签名和消息,他们就能预防式侦测冲突的 VTXO 分配。一个用户依然可以跟 Ark 服务商串通,从而取消一个相互冲突的 VTXO 分配,但尝试在链上领取这个 VTXO 就会揭晓用户的分配信息(也就是出尔反尔证据的一半)。另一个持有自己那一半证据的用户(同一个公钥 K_i 的相互冲突的分配操作)就能罚没保证金。

值得探究一个完全透明的日志方案,也许能够提升我在此处提出的侦测机制,但为了简洁起见,我会提出更加简单的办法。将 half-proof 公开在多个第三方 Nostr relay 上,使用对应于该 VTXO 的 K_i 的可用于过滤信息的公钥。对 relay 的挑选很重要,但超出了本文的范围。Half-proof 也可以使用客户端可验证的、与 K_i 确定性绑定的密钥来加密,并在 Ark 服务商和 VTXO 收款方之间分享。这将提供应对 relay 观察者的更强隐私性,同时不会阻止被欺诈的用户发现其他人的 half-proof 。客户端必须从 Ark 服务商处收取 sig(B, K_i) 以及他们的 VTXO 分配签名,然后从 relay 检查相互冲突的 half-proof 。然后,他们可以发布自己的 half-proof,然后继续建立通道,但他们不能认为来自这个 VTXO 的资金是安全的,而要等到一段时间过去、依然没有相互冲突的 half-proof 出现才可以。这种额外的等待降低了需要赛跑的概率(在 Ark 服务商欺诈两个用户,而他们同时发布 half-proof 的时候)。这种等待必须足够长,长到匹配的 half-proof 可以到达这个客户端。应该是几百毫秒的等级,但几秒的延迟可以提供显著的缓冲,而且不会伤害用户体验。因为罚没保证金消除了 Ark 服务商的欺诈激励,客户端必须也观察保证金在其 VTXO 分配的生命周期中被花费的情况,如果有,就退出。

罚没的详述

上文所述的出尔反尔证据,以及足以罚没保证金,从而在多个方面反激励 Ark 服务商的不轨行为,而具体的罚没机制对出尔反尔证据来说是次要的,可以讨论。重要的是,如果罚没流程会支付一笔奖金,那么 Ark 服务商总是可以生成一个证据,尝试自己领取奖金。在我看来,支付一小笔奖金来激励报告欺诈是有用的,但奖金不应该太丰厚。

带有奖金的幼稚罚没

最明显的惩罚机制就是,让出尔反尔证据可以花费保证金输出,让证明者可以将保证金拿走,作为奖金。没有任何其它身份认证,矿工就总是可以自己盗窃输出。因此,这种幼稚的奖金是不合意的。

带授权的奖金领取

上述幼稚奖金可以通过仅允许特定公钥来花费保证金输出、将它作为奖金来提升。一种直截了当的协议是这样的:允许特定的分配消息 M_a 所包含的的一个具体公钥 A 来领取奖金;而 M_a 是 Ark 服务商使用 K_i 签名的、将 VTXO 分配给 Alice 的消息。为此,Ark 服务商要建立一个委托公钥 D,它跟 B 很相似,但只用于委托。B 和 D 都在保证金输出中承诺,而客户端要加以验证。Ark 服务商使用 D 来签名一个临时公钥 X ,从而委托给 X 。然后,Ark 服务商使用 X 仅 签名 M_a 和 A,从而授权 A 使用包含 M_a 的出尔反尔证据领取奖金。 X 不应该重复使用(签名超过一对消息和公钥),不然,其他的用户就可以领取奖金。客户端无法验证 X 的唯一性,但 Ark 服务商本就可以伪造额外的授权,所以这里的出尔反尔不会扩大其非法领取奖金的能力。

请注意,奖金的用意是激励罚没;无法期待它总是会给正确的用户补偿,所以这也不是我们的设计目标。公钥 A 想要花费保证金输出,需要使用跟上文一样的出尔反尔证据,加上 sig(D, X)、sig(X, M_a) 和 sig(X, A) 这些东西,它们能证明 A 有权花费保证金。领取保证金的人可以转而提供一个普通的 OP_CHECKSIG 交易签名(来自 A)、授权一笔交易花费这笔奖金。在收到 sig(D, X)、sig(X, M_a) 和 sig(X, A) 之前, Alice 不能认为 VTXO 分配已经完成。与出尔反尔证据一样,验证这些签名需要 OP_CHECKSIGFROMSTACK 。OP_CHECKSIGFROMSTACK 当前要求 D 和 X 是 32 字节的 x-only 公钥,而且 sig(D, X)、sig(X, M_a) 和 sig(X, A) 是 BIP-340 Schnorr 签名。在公钥 A 的授权验证完成后,一个 OP_CHECKSIG 操作码会验证来自 A 对奖金领取交易的签名。OP_CHECKSIG 反过来又要求 A 是一个 32 字节的 x-only 公钥,以及来自 A 的签名是一个 BIP-340 签名。

使用 OP_PAIRCOMMIT,奖金领取资格的授权可以大大简化,Ark 服务商只需提供 D 和 sig(D, pc(M_a, A)) 给用户。

这种带有身份认证的奖金领取机制,可以防止矿工或其他观察者通过观察到出尔反尔证据而领取奖金。但是,它不能防止 Ark 服务商自己创建新的签名来领取奖金、找回其保证金的价值。因此下一节,“强制造成经济损失”,将提议一种机制,让 Ark 服务商预期会遭受损失,即使自己领取奖金。

强制造成经济损失

为了防止 Ark 服务商通过领取奖金来拿回整笔保证金,至少一部分保证金应该弃权、无法通过奖金来拿回。使用 CTV 或 TEMPLATEHASH 来承诺罚没交易,这笔罚没交易可以弃权一部分保证金作为手续费,办法是指定罚没交易的总输出价值低于来自保证金的输入价值。弃权成手续费是一种较为温和的反激励措施,因为 Ark 服务商也许能够跟矿工串谋来取回一部分价值,但假设 Ark 服务商无法跟所有矿工串谋,那么 Ark 服务商旧依然会有预期损失(平均来说)。

更健壮的反激励措施可以通过完全烧毁一部分资金来实现(变成非零价值的不可花费输出)。在我看来,一部分保证金应该用作给得到授权的领取人的奖金,而一部分应该弃权。不论什么情况下, 弃权的具体的类型和比例都是可以讨论的。

暂定的联合方案(使用 CTV 或者 TH)

我建议的方案结合了保证金弃权成手续费与带身份认证的奖金。

保证金使用 CTV 或者 TEMPLAHASH 来承诺罚没交易,将 绝大部分 保证金花费成手续费,另外带有一个奖金输出。这个奖金输出只能被可以提供一个授权密钥以及与之关联的出尔反尔证据的人花费。虽然不保证能成功领取奖金,但用户依然有激励去罚没保证金来获得奖金,这应该会让 Ark 服务商有预期损失,但还是取决于 Ark 服务商能否与矿工勾结。

也可以考虑设置两个奖金输出,但强迫要由不同的人来领取,不过这有些复杂,而且我还没有想出怎么实现它而不会验证损害保证金罚没的基本可靠性。

相关工作

Keer et al. (2026) Ark: Offchain Transaction Batching in Bitcoin

除了正式定义 Ark 以外,Keer 等人还提出了一种 “快速终局性” 协议 (在章节 4),可以跟我在这里提议的基于 OP_CHECKSIGFROMSTACK 的方案直接相比。因为缺乏特定的操作码,他们在论文的第二版中将这种方法换成了一套 BitVM 方案。虽然已经被取代,但他们论文的第一版包含了与我的想法最阶段的功能协议,因此是我下文的比较目标。我的第一份公开的草稿是在他们的论文出版前 8 天发布的;方法上的相似性似乎反映了趋同思维以及对 OOR 转账的信任需求的普遍不满。

Keer 等人的第一版提议通过罚没一笔保证金来惩罚一个运营者(Ark 服务商)。为了模拟 OP_CHECKTEMPLATEVERIFY(CTV)的功能,一个保证诚实的委员会要预先签名保证金罚没交易,然后销毁自己的私钥。只要至少一个签名人是诚实的,那么罚没交易就固定下来了。这跟前文 “软分叉假设” 中构造交易树的机制是一样的,只是用在了保证金罚没交易中。他们还让每一个 VTXO 的签名的 nonce 固定成了一个静态的数值。如果 Ark 服务商使用同一个密钥在不同的交易中花费同一个 VTXO,就会产生两个签名,然后泄露私钥,导致保证金被罚没。这种固定 nonce 的方案允许只用一个普通签名来罚没保证金,也就避免了密钥委托的需要。Keer 等人的第一版强调了跟现有的比特币协议的兼容性,但正如他们在论文第二版中指出的,这种固定 nonce 的强制执行脚本,与当前的比特币脚本是不兼容的。第二版的备注 4.4 也指出了 OP_CAT 在这种场景的有用性。我的方案转而使用体积更大的出尔反尔证据,由两条消息、两个签名以及一个委托签名组成;需要使用 OP_CHECKSIGFROMSTACK 来检查,而这个操作码在当前的比特币脚本中也不存在。

Keer 等人的的密钥复原方案有一个重大的缺点:运营者的私钥暴露将允许伪造运营者签名。一旦运营者的私钥是已知的,一个 VTXO 的唯一 nonce 就可以通过对该 VTXO 的任何一个签名反算出来。这种伪造可能会作废与这次出尔反尔无关的其它 “快速终局性” 交易,让其它未决的快速终局性交易被输入 VTXO 的前任所有者抢占。我的方案不会泄露密钥材料,因此也不允许伪造签名,但在保证金被罚没之后,同样会经历完整性的降级: Ark 运营者失去了不出尔反尔的经济激励。

虽然第二版中的 BitVM 方案可以在今日的比特币上实现,快速终局性也只能在快速终局性团体的现有成员中实现。添加一个成员需要该用户拥有已经承诺到快速终局性协议的担保品,并且需要在更新后的团体中建立新的 BitVM 实例。没有任何一个能够跟引导新的 JIT 用户兼容。

Ruffing et al. (2015), Liar, Liar, Coins on Fire!

Ruffing 等人提出了一种密码学方案,使用 chameleon 哈希函数,让参与者可以从出尔反尔的断言中抽取出私钥,来花费作为保证金的钱币。Ruffing 的提议有一个明显的优势,就是不需要任何软分叉。Ruffing 等人也预料到了与我相似的方法。我的提议依赖于 OP_CHECKSIGFROMSTACK(需要软分叉),换来了不需要使用 chameleon 哈希,它在比特币中非常罕见。Ruffing 等人也对这些方案的经济学给出了更加透彻的处理。使用 Ruffing 的工作在当前的比特币网络上实现这种提议也许是有趣的,但 Keer 等人的第二版论文指出,比特币无法在链上包含一个可以审计的断言,这就留下了一个显著的执行力鸿沟。我提议的方案通过让授权签名成为出尔反尔证据的一部分而弥合了这个鸿沟;没有单独的断言出现在链上。

超时树和 Ark

“超时树” 与我的方案和 Ark 有显著的共同点。超时树、Ark 和我的方案,都使用一个 UTXO 来承诺链外的许多 VTXO 所组成的树。在 Ark 和超时树上,VTXO 从创建时刻开始,就由终端用户和树的构造者联合持有。然而,VTXO 的免信任的所有权只有创建树的时候参与了的用户及其资金才能获得。Ark 也允许 OOR 转账给不属于原本 Ark 树的用户,但代价是信任需求的显著增加。这里提议的 CSFS 出尔反尔保证金正是尝试缓解 OOR 分配提前准备的 VTXO 的风险。

BitVM

BitVM 是一个广泛的协议家族,支持在链上强制执行信任最小化的计算,通常使用可罚没的保证金还激励正确的运营者行为。它也包含这里提议的罚没功能,但显然更加通用,而且并不天然跟一种特定的交易授权方式绑定。Keer 等人的第二版论文 使用 BitVM2 来强制执行无法模棱两可的 VTXO 授权签名。这种方法在吸引 JIT 用户时的局限性在前文已经讨论过。

开放问题

  1. 保证金规模。Ark 服务商可以任意多次分配同一个 VTXO 的能力,让挑选有效反激励的问题显著复杂化。在实践中,在敌意很少的环境下,我认为少量保证金,就已经足够了,但在最坏情况下,可能需要很大额度的保证金。
  2. 罚没激励。这里提议的保证金奖金是否足以吸引用户报告不轨行为?在所有环境下(比如高手续费环境)都是如此吗?
  3. Relay 挑选。受害者必须向至少一个 relay 分享,以侦测出尔反尔;但是,对使用同一个 relay 达成一致,在 Nostr 中就已经是个难题。信任 Ark 服务商来挑选 relay 是危险的,因为他们也许会提议审查 half-proof 的 relay 。随意挑选 relay 则可能让受害者无法看到其他人的 half-proof 。
  4. 透明日志。一种替代性的透明日志系统也许能提升侦测 half-proof 以及/或者 出尔反尔 的可靠性。防止透明日志的模棱两可也可以使用 OP_CHECKSIGFROMSTACK 来强制执行,虽然这还不足以创造一个安全的系统。
  5. Chameleon Hash。这个方案能在现有的比特币网络上实现而无需任何软分叉吗?使用另一种 chameleon hash 能否允许在链上检查可追责的断言?我很怀疑,但如果有,就是非常有用的发现。

(完)