比特币 - Ark 101 - Saravananmani

Ark 是一种比特币二层协议,旨在实现即时、低成本的比特币支付。它采用链下模式,通过中心化服务器进行交易协调,用户在服务器异常时可单方面退出。通过链上存款或接收 Ark 支付加入网络,通过合作退出或单方面退出机制保障资金安全,并定期进行 VTXO 交换以解决潜在风险。

比特币二层协议

什么是 Ark?

Ark 是一种比特币二层协议,可以实现即时且低成本的比特币支付。

它主要在链下运行,这意味着 Ark 支付发生在比特币区块链之外。Ark 是一种自托管协议,允许用户在需要时退回到链上,尽管存在一些细微差别,我们稍后会探讨。

与闪电网络不同,Ark 不依赖于发票、支付通道、HTLC 或路由。 相反,它使用客户端-服务器模型,所有用户交互都通过中心化服务器,而不是点对点网络。

Ark 遵循一种乐观设计,用户假设服务器将正确地协调交易。 如果服务器无响应、审查或行为不端,用户可以退回到单方面退出。 在正常情况下,退出是通过链下合作处理的,因此单方面退出并不常见。

Ark 支付遵循一种类似于链上的模型:它们是预先签名的比特币交易,在链下处理。 接收者无需在线即可接收。 用户也不需要提前锁定流动性。

Ark 仅限比特币。 它不涉及山寨币、代币、侧链或新的区块链。 它目前无需对比特币进行任何更改即可工作。 然而,covenant 可以显著增强该协议。

与所有二层协议一样,Ark 也存在一些权衡,使其更适合某些用例。

加入和支付

加入 Ark 有两种方式

  • 链上存款允许你使用常规比特币交易将你的比特币转移到 Ark 中。
  • 接收 Ark 到 Ark 的支付也可以立即将你加入 Ark。 这发生在链下,不需要任何链上手续费或事先设置。

所有 Ark 到 Ark 的支付都是即时、低手续费并且完全在链下进行。

通过链上存款加入是如何运作的?

在这个例子中,Alice 使用她自己的链上 UTXO(Alice 输入 UTXO)来创建一个 funding transaction(资金交易)。 该交易可以由 Alice 和 Ark 服务器 (AS) 随时共同花费,或者由 AS 在 30 天后单独花费。 在签署和广播 funding transaction 之前,Alice 和 AS 还会共同签署一个链下 exit virtual transaction(退出虚拟交易)。 该 exit transaction 花费 funding transaction 的 output UTXO(输出 UTXO),并且可以由双方随时花费,或者在链上确认后由 Alice 在 1 天的延迟后单独花费。 这种设置使 Alice 可以在需要时在 30 天窗口内单方面退出到链上。

这些链下交易包括一个额外的锚定输出,用于通过 CPFP(Child Pays for Parent,子为父支付)进行手续费提升,为了简单起见,在交易图中省略了该输出。

但是,为什么允许 AS 在 funding transaction 的 30 天绝对延迟后申领资金,而 Alice 必须等待 1 天才能单方面使用 exit transaction? 为什么 CPFP 被用作这些虚拟交易的唯一手续费机制? 我们将很快解释。

在 Ark 协议中,链下 UTXO 和交易分别被称为 VTXO(虚拟 UTXO)和 Virtual Transactions(虚拟交易)。

Ark 使用基于 Schnorr 的 Taproot 脚本来强制执行这些花费条件。 Alice+AS 多重签名遵循 N-of-N MuSig2 MPC 协议,生成单个聚合公钥和签名。

通过 Ark 支付加入是如何运作的?

在这种情况下,Alice 通过花费她自己的 VTXO(alice vtxo)向 Bob 支付 10 万聪(bob vtxo)。 她通过与 AS 共同签署交易来解锁 Alice+AS 花费条件。 她收到 90 万聪作为找零(alice change vtxo)。 Bob 的 VTXO 上的花费条件与 Alice 的相同,只是它使用 Bob 的密钥而不是她的密钥。 Alice 的找零 VTXO 保留与其原始 exit VTXO 相同的花费条件。

现在,Bob 可以像 Alice 一样使用他的 VTXO 进行 Ark 支付。 然而,Bob 的 VTXO 具有双重花费风险:由于这些是链下交易,没有链上双重花费保护,AS 和 Alice 可能会串通在其他地方花费 Alice 的原始 VTXO,从而在没有 Bob 参与的情况下使其失效。 相比之下,Alice 的找零 VTXO 没有这种风险,因为她没有欺骗自己的动机。

如果 Alice 和 AS 诚实行事,并且没有广播任何冲突交易,Bob 可以通过发布他的支付虚拟交易,然后是 exit virtual transaction 来单方面退出到链上。 他必须使用 CPFP 支付两者的链上手续费。

具有双重花费风险的 VTXO 以黄色显示,而无风险的 VTXO 以绿色显示。

更深入地了解 Ark 支付

正如你所看到的,用户可以像 Alice 到 Bob 的 Ark 支付一样相互支付。 然而,从具有双重花费风险的 VTXO 创建的任何 VTXO 也将具有相同的风险。 事实上,风险变得更大,因为 VTXO 链中的任何祖先都可能通过与 AS 串通进行双重花费。 源自原始 exit VTXO 的找零 VTXO 或自发送 VTXO(例如 Alice 的 VTXO)被认为可以免受双重花费风险的影响,因为用户控制输入和输出,从而消除了创建冲突交易或进行串通的任何动机。

此外,从长链支付虚拟交易创建的 VTXO 在单方面退出时可能会面临高成本。 这是因为用户必须支付链中每个虚拟交易的手续费,从原始的 Exit virtual transaction 开始。

我们将在接下来的章节中探讨如何降低双重花费风险和长链 VTXO 的高单方面退出成本。

由于 Ark 支付是纯粹的链下交易,仅由发送者和 AS 签名,因此它们是即时的,并且不会产生任何链上手续费或网络成本。

Ark 如何扩展其加入和支付流程?

任何用户都可以像 Alice 一样使用他们的链上资金加入 Ark。 在上图中,Wendy 也以类似的方式从链上加入。 为了简单起见,仅显示可花费的 VTXO。

链上加入的可扩展性受到比特币区块空间的限制。 相比之下,Ark 支付完全在链下进行,并且不受其限制。 它们的可扩展性仅取决于 Ark 服务器处理和协调这些交易的性能和容量。

合作退出

合作退出是如何运作的?

在合作退出中,用户向 AS 发出信号,表明他们打算用 VTXO 交换链上 UTXO。 用户将其 VTXO 余额转移到由 AS 控制的地址,同时 AS 将等量的其自己的链上资金转移到由用户控制的地址。 这种交换是原子地完成的,以确保公平。

在上面的例子中,Bob 和 Wendy 都想从 Ark 合作退出到链上。 AS 将构建一个链上交易,称为 batch transaction(批量交易),该交易将 AS 的链上资金转移给两个用户。 同时,准备两个 forfeit transaction(放弃交易),以将用户的 VTXO 余额转移到由 AS 控制的地址。

在这个阶段,所有这三个交易都未签名。 这是因为 AS 和用户都不想先转移他们的余额,因为这会使他们面临交易对手拒绝签署传入转移的风险。 为了公平地完成退出,我们现在需要一种原子地签署这些交易并确保 VTXO 和 UTXO 公平交换的机制。

我们的想法是,如果我们能使放弃交易仅在批量交易也可以花费时才能花费,那么交换就会变成原子的。

如图所示,当批量交易中的 connector output(连接器输出)用作放弃交易中的输入时,只有在批量交易签名并确认后,放弃输出才能在链上花费。 连接器输出的价值并不重要。 只要它高于灰尘限制,它就可以确保放弃交易只能在批量交易确认后才能确认。

现在,签署顺序很重要。 用户必须首先签署他们各自的放弃交易。 对于他们来说,这一步是完全安全的,因为除非 AS 也签署批量交易,否则放弃交易无效。

在收到用户签署的放弃交易后,AS 通过签署批量交易并将其广播以在链上确认来完成该过程。

为什么将“Wendy 相对于 1 天后”添加到 VTXO?

如果 Wendy 试图通过在她从批量交易中收到她的链上资金后试图重新申领她已经放弃的 VTXO 来欺骗 Ark 服务器,她可能会广播已放弃的 VTXO 以取回资金。

这可以通过对已放弃的 VTXO 进行为期一天的相对时间锁来防止。 延迟使 Ark 服务器有足够的时间广播和确认放弃交易,该交易已由 Wendy 在 Wendy+AS 花费条件下共同签署。 这使得服务器可以在 Wendy 之前在链上申领 VTXO。 时间锁周期由服务器配置。

批量交易中的连接器输出可能会变得很大。 有办法优化它们吗?

从批量交易到放弃交易的连接器输出数量随着合作退出 VTXO 的数量线性增长。 由于批量交易是在链上的,因此这会增加其大小和总体成本。

如上图所示,引入一个称为 connector transaction(连接器交易)的 buffer transaction 允许来自批量交易的单个连接器输出 UTXO 用作所有放弃交易的输入。 这消除了每个放弃交易都需要一个连接器输出,从而用单个输出代替了链上输出的线性增长,并显著降低了批量交易的大小和成本。

理想情况下,VTXO 的虚拟交易以及放弃交易和连接器交易永远不会在链上广播。 它们仅用作后备,并且仅在用户尝试广播已放弃的 VTXO 及其完整的虚拟交易祖先(从 exit virtual transaction 开始)时才使用。

但是,是什么阻止用户通过广播已放弃的 VTXO 来发起拒绝服务 (DoS) 攻击? 由于所有虚拟交易都依赖 CPFP 进行手续费支付,因此用户需要支付整个交易链的手续费。 即使该用户完成了此操作,AS 仍然可以使用预先签署的放弃交易来清扫已放弃的 VTXO。 这使得此类攻击成本高昂且毫无意义,有效地阻止了user试图这样做。

为什么将“AS 在绝对 30 天后”添加到 output UTXO 中?

在现实世界中,Ark 服务器 (AS) 的任何用户子集都可以随时请求合作退出。

从 funding transaction 的 output UTXO 创建的 VTXO 直接或间接地源自同一输出,形成一个多层后代层次结构。 这意味着多个用户有效地共享来自 funding transaction 的相同链上 UTXO。

但是,AS 无法强制与请求合作退出的用户共享祖先的所有用户也参与该退出。 这样做会导致糟糕的用户体验,而且不切实际,因为有些用户可能在合作退出过程中处于离线或不可用状态。

为了在不中断其他用户的情况下处理退出请求,AS 暂时使用其自己的链上资金来促进希望合作退出的用户的批量退出。

但是,AS 如何从已放弃的 VTXO 中收回其资金,以换取注入到批量交易中的自有流动性? 一种选择是广播已放弃的交易及其祖先 VTXO。 但是,这也会迫使同一祖先链中的许多不相关的 VTXO 在链上退出。 这种方法引入了不必要的链上成本和延迟,有效地破坏了 Ark 链下设计的目的。

同时,AS 无法承受永远锁定其流动性,等待与共享 funding transaction 的 output UTXO 相关联的每个用户完成合作退出。 这样做会对 AS 造成不可持续的负担,并使系统在规模上不切实际。

一个更实用的解决方案是强制执行一个截止日期,所有共享 funding transaction 的 output UTXO 的用户都必须在该日期之前完成他们的合作退出。 但是如何强制执行?

解决方法是将“AS 在绝对 30 天后”时间锁添加到 output UTXO。 此条件允许 AS 在 30 天后单方面花费 UTXO。 在此窗口期间,用户可以随时自由地合作退出。 但是,如果用户未能在该期间内退出,他们的 VTXO 将被 AS 与其他 VTXO 一起清扫——无论他们是否明确放弃。

这种机制使 AS 能够在可预测的时间范围内收回其流动性并继续高效运营。 到期期限由服务器配置。

缺点是未能在截止日期前采取行动的用户将失去他们 VTXO 的余额给 AS。

三个尴尬的问题

我们已经确定了三个主要的尴尬问题,这些问题可能使 Ark 在现实世界中不太实用或有吸引力:

  • 从 Ark 支付创建的 VTXO 相关的双重花费风险
  • 如果用户未能在 30 天截止日期前退出,则将 VTXO 余额丢失给 AS 的风险
  • 单方面退出的困难和高成本,特别是对于持有深埋在长虚拟交易链中的 VTXO 的用户

可以做些什么来解决 Ark 中的这三个问题?

幸运的是,所有这些问题都可以通过一个解决方案来解决:将受影响的 VTXO 换成由各自用户控制的新的 exit virtual transaction VTXO。

我们可以使用类似于合作退出过程的批量交易来解决这些问题。 每个用户不是被分配一个链上 UTXO,而是从一个新的 exit virtual transaction 中获得一个新的 VTXO。 这种新的 VTXO 更安全,因为它避免了双重花费风险,不是长链虚拟交易的一部分,并且将到期期限延长了 30 天。

在上面的例子中,Dave 正在原子地交换他携带双重花费风险的旧 VTXO,以换取一个新的、无风险的 VTXO。 他不是执行合作退出以接收一个链上 UTXO,而是使用批量交易安全地从 exit virtual transaction 中获得一个新的 VTXO。

有了这个新的 VTXO,Dave 现在可以像 Alice 从她的 Exit virtual transaction VTXO 中所做的那样,向另一个用户进行 Ark 支付。

如果你仔细观察,批量交易中链上输出 UTXO 的花费条件与 funding transaction 中的花费条件相同。 exit virtual transaction 也是如此。 主要区别在于资金来源:虽然 funding transaction 由用户自己的输入 UTXO 提供资金,但此批量交易由 AS 自己的输入 UTXO 提供资金。 为什么? 出于与 AS 为合作退出提供资金相同的原因——它暂时注入自己的流动性来帮助用户将他们的旧 VTXO 换成新的 VTXO。 一旦输出 UTXO 的 30 天到期过去,AS 可以清扫资金,就像它在合作退出场景中所做的那样。

当新的 VTXO 接近其到期时,用户必须执行另一次交换,通过相同的过程获得一个新的 VTXO。 这可以防止 AS 清扫过期的 VTXO。 如果 AS 确实清扫了它,用户实际上已将他们的币移交给了服务器。 该协议不保证将返还被清扫的 VTXO 的价值。 但是,在实践中,当用户返回在线时,AS 可能会出于礼貌向用户发放相同价值的新 VTXO。

当然,这些定期的交换会产生手续费,因为它们涉及一个链上批量交易。 但成本通常很低,因为它在所有参与用户之间分摊。

Ark 如何扩展将旧 VTXO 换成新 VTXO 的过程?

这种设计的关键优势在于可扩展性。 在上面的例子中,Carol 和 Dave 都在将他们的双重花费风险 VTXO 换成来自新的 exit virtual transaction 的新的 VTXO。 通过将更多的用户密钥添加到链上多重签名并在 exit virtual transaction 中包含更多的 VTXO,此过程可以在单个批次中支持数千个用户。 主要瓶颈是 AS 和所有参与用户之间的交互式签名。

更多关于批量交易和退出虚拟交易

AS 多久创建一次批量交易?

通常,AS 会定期(例如每小时一次)创建一个新的批量交易。 想要合作退出或将其 VTXO 换成新的、无风险的 exit transaction VTXO 的用户可以向 AS 发出他们的意图,然后 AS 会与他们的钱包协调。 此间隔由 AS 配置。 在需求旺盛的时期,也可能会启动额外的临时批次。

退出虚拟交易遇到一些问题

在基本的 exit virtual transaction 中,如果一个用户单方面退出,它会强制同一批次中的所有其他用户也链上退出。 这会破坏链下连续性,导致意外的手续费、延迟,并要求每个人重新加入。

此外,退出费用随着 exit virtual transaction 中 VTXO 的数量线性增加。 例如,在一个包含 1,000 个 VTXO 的批次中,退出用户必须支付所有 1,000 个输出的链上手续费,这使得单方面退出非常昂贵。

我们如何解决 exit virtual transaction 的问题?

我们可以使用基于二叉树的 exit virtual transaction 结构,而不是单个 exit virtual transaction。 在这种设置中,如果 Carol 打算在她 VTXO 源自的批次中的任何其他参与者之前单方面退出,则她需要广播一个特定的虚拟交易序列:首先,锚定整个批次的根虚拟交易; 接下来,通往她 VTXO 在树中位置的左侧分支虚拟交易; 最后,她自己的单独的退出虚拟交易。

随后,如果 Dave(他的 VTXO 与 Carol 的位于树的同一分支中)选择启动他自己的单方面退出,他可以通过仅广播他的退出虚拟交易来做到这一点,因为所需的祖先交易(例如根和分支虚拟交易)已经在 Carol 之前的退出期间在链上确认。

基于树的 exit virtual transaction 比基本的 exit virtual transaction 具有多个优势。 在基本的 exit virtual transaction 中,单个用户的单方面退出会强制批次中的所有其他用户也链上退出。 相比之下,基于树的结构可以防止这种情况:当其他人退出时,非启动用户不会受到影响,从而避免了强制链上退出并保留了链下体验。

单方面退出的费用负担也显著降低。 费用不是随着 VTXO 的数量线性增长,而是随着树的深度呈对数增长,这使得单方面退出更加经济实惠。 非启动用户受益更多,因为他们只需要发布他们的子分支或叶交易,从而最大限度地减少了他们个人的链上手续费。

这种树结构还提高了可扩展性,允许每个批次比简单的批量交易容纳更多的 VTXO。 然而,它带来了更高的复杂性:交互式签名随着树深度的增加而增加,并且需要参与者之间的更多协调。

当用户选择单方面退出时,他们必须确认从根到他们的叶子的树中的每个链接,这使得该过程更加复杂。 尽管如此,根和分支交易遵循与任何批量链上交易相同的脚本规则和到期条件。 主要区别在于这些交易是链下预先签名的,仅在需要时才广播。

最后,如果用户单方面退出,并且 AS 稍后需要在到期后清扫剩余的 VTXO,它必须广播并确认相应的分支交易才能完成清扫。

有关 Ark 协议的更多信息,请查看以下资源:

特别感谢 tiero 审阅了这篇文章。

  • 原文链接: medium.com/@saravananman...
  • 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
saravananmani_
saravananmani_
江湖只有他的大名,没有他的介绍。