作者:Burak Keceli

来源:https://lists.linuxfoundation.org/pipermail/bitcoin-dev/2023-May/021694.html

更直截了当的表述可见:https://lists.linuxfoundation.org/pipermail/bitcoin-dev/2023-May/021720.html

各位好:

我非常高兴能够公开一种我开发了几个月的二层协议,称为 “Ark”。

Ark 是一种另类的二层扩展方案,协议的用户可以不受流动性限制地发送和接收资金。这意味着,接收者无需引导进入的设置,就可以得到支付(相比之下,在闪电网络中,接收者需要先获得入账流动性)。Ark 的链上足迹也比闪电通道要小几个数量级,因为没有开启和关闭通道的概念。

Ark 有一组链下的 UTXO,这些 UTXO 叫做 “虚拟 UTXO”,缩写是 “vTXO”。虚拟 UTXO 就像是带有过期时间的票据;在创造出来的 4 个星期以后,它就会失效。用户必须在收到这样的票据的 4 周内将它们花出去,或者将票据转给自己、从而重设计时器。虚拟 UTXO “生活” 在一个共享的 UTXO 中,并且可以在链上揭示。

当人们在协议上发起支付时,现有的一些 vTXO 会被赎回,新的 vTXO 会被创造出来,就跟 UTXO 的生命流程一样。为了提升资金所有权人的匿名集,vTXO 的价值是有范围的,从 1 聪到 100 万 聪。

用户可以从已经拥有 vTXO 的人那里获得,也可以通过一个叫做 “lifting” 的原子化双向锚定机制,将链上的 UTXO 按 1:1 的价值比例换成 vTXO。lifting 是不需要信任的。用户无需协助就可以从一个链上的 UTXO 中取出虚拟 UTXO 的价值。

在发送资金的时候,用户在一个链下的混币轮次中选择并销毁自己的某一些 vTXO,并创造新的 vTXO(给接收者)以及找零。新的 vTXO 的密钥是用一个共享的秘密值调整过的,并且这个秘密值会在花费的时候作为支付证据揭晓。支付的目的地是一个专用的、众所周知的公钥,类似于 “静默支付”,但是,支付的踪迹就被明文调整(plain tweaking)和盲化混币(blinded mixing)混淆掉了。

Ark 允许通过一个不被信任的中介(untrusted intermediary)(称为 “Ark 服务供应商(ASP)”)发起匿名的链下支付。ASP 是永远在线的服务端,向网络提供流动性并收取流动性手续费,类似于闪电网络服务商。而 Ark 上的 ASP 的角色有:(1)流动性供应商;(2)盲化的 coinjoin 的协调员;(3)闪电网络服务供应商。ASP 的主要任务是每 5 秒创建一个快速的盲化 coinjoin 会话,也叫 “pool”。用户加入 pool 会话以发起支付、初始化钱币选择并登记自己要花费的 vTXO、登记给接收者的 vTXO,最终联合签名一群 vTXO 以赎回他们。

Ark 可以部署在现在的比特币上,但这样就必须牺牲 “非交互性”。接收者必须在线,已签名 n-of-n 的多签名,从而约束共享 UTXO 的输出(也即 vTXO 中的价值)。因此,用户无法接收离线支付;他们需要自己运行一个 Ark 客户端(就像闪电通道一样)。为了让 Ark 可以无需服务端,我们需要 BIP-118 或 BIP-119 这样的限制条款元件。

BIP-118 ANYPREVOUTANYSCRIPT 可以通过在脚本中硬编码一个 65 字节的签名和一个 33 字节的未知公钥类型(unknown public key type),来约束输出的一笔花费交易。而 BIP-119 CTV 可以直接用模板哈希值给输出约束一笔交易。其它的替代方案有(1)TXHASH;(2)CAT + CSFS + TAGGEDHAHS;(3)XOR + CSFS + TAGGEDHASH 组合。

Ark 使用了一种新的锁定形式,叫做 “txlock”,以确保转账方案的绝对原子性。Txlock 是一种条件,只有双方同意(mutually agreed)的交易标识符的存在才能解锁这个条件。理论上,txlock 可以通过一个假想的操作码,叫做 “OP_CHECKTXIDFROMUTXOSETVERIFY” 来实现。不过,Ark 使用了另一种方法,达到了同样的效果,叫做 “连接器(connector)”。连接器是 Ark 协议的一种特殊输出。原理是,如果我们希望用比特币脚本来检查某一个交易 id 是否存在,我们可以直接为该笔交易附加一个输出;在交易中,签名实际上会承诺一笔交易的所有 prevout(前序交易 id);因此,如果花费这个输出的交易先被签名,它就预设了形成这个输出的交易的 id,从而使签名成为对目标交易 id 存在性的检查。这就是 txlock 条件,只有目标交易存在,才能让这个锁解开。而在 Ark 的语境中,要检查的交易就是给 vTXO 支付的 “池交易”。(译者注:此处部分语句没有直译。这种结构的目的是为了实现原子化互换:Bob 和 Alice 一起签名一笔承诺交易,以给 Alice 支付;但这笔交易若要生效,就必须存在另一笔 Alice 给 Bob 支付的交易,也即这里的 “池交易”。交互过程的逐步分解可见此处。)

ATLC 是一种用在 Ark 协议中的条件式支付。当一个 vTXO 被创造出来的时候,它就附带着一个 ATLC,类似于在 Eltoo 通道中,一个 eltoo:trigger 被附加到注资交易的输出中。在一个 vTXO 被花费的时候,预先附加的 ATLC 连接到一个连接器,以形成一个 txlock。

这个 txlock 构造保证了,在服务供应商拿走被附加的 ATLC 中的价值之时,其连接器的输出点语境必须保持不变。换句话说,Ark 服务供应商不能重复花费自己所创建的池交易。这为发送者提供了一种原子化的结账技术,因为给 vTXO 结账的操作嵌在连接器的同一笔交易中。连接器之间的关联,以及新创建的 vTXO,通过它们之间的盲化混币混淆关联。

池交易由 ASP 每 5 秒创建一次,实际上就是盲化的、足迹最小化的、快速的 coinjoin 轮次。ASP 用自己的链上资金给交易池充值,以赎回 vTXO。因此,发布在链上的池交易只有一个或少数几个由 ASP 提供的输入。池交易有三种输出:vTXO 输出、连接器输出以及 ASP 找零。服务供应商在自己的池交易中为支付接收者提供 vTXO(在 vTXO 输出内)、为发送者提供连接器(在连接器输出内)。

池交易的第一个输出,vTXO 输出,包含了 coinjoin 轮次中新创建的 vTXO。vTXO 们被绑定和嵌套在这个共享的 UTXO 中,并且可以在链上揭示。vTXO 输出会在创建的 4 周后过期;而一旦它过期,为这个输出提供资金的 APS 可以独自取走其中所有的价值。在这个 vTXO 输出中具有 vTXO 的所有权人,被预期在这个 4 周的窗口内赎回其中的价值。嵌套的 vTXO 可以在这个时间窗口内在链上揭晓,如果运营者碰巧不合作或者长时间没有响应的话。在揭晓一个 vTXO 的时候,一个单方退出的窗口就可以通过附加预签名的 ALTC 来触发,类似于 Eltoo。不过,乐观来看,最终的结果几乎总是一笔带有少数输入和三个输出的池交易,而池的内容很少在链上曝光。因此, vTXO 和连接器几乎总是放在链下的。

Ark 可以通过向池交易附加 HTLC 和 PTLC(就像 ATLC 和连接器一样),跟闪电网络互动。被附加的 HTLC 存活在另一个共享的 UTXO(称为 “HTLC 输出”)中,也会在 4 周后过期。ASP 先将 HTLC 添加到池交易的 HTLC 输出中,然后转发到广大的闪电网络。这意味着 ASP 同时也是一个 LSP 。Ark 用户也可以使用嵌套了 HTLC 的 vTXO,从闪电网络获得支付。

Ark 是一种开放网络,任何人都可以运行自己的 ASP。这意味着,一个用户可以拥有关联着不同 ASP 的多个 vTXO。Ark 协议设计让用户可以使用多路径支付(MPP)、用多个 vTXO 支付闪电发票。在相关 ASP 将各个 HTLC(或者 PTLC)附加到池交易之后,HTLC 就可以通过 MPP 转发到目的地。

当一笔池交易还在交易池中的时候,Ark 服务商是可以重复花费它的。但是,与此同时,接收者也可以用入账的零确认 vTXO 支付闪电发票。所以,对服务商来说,重复花费一笔池交易是搬起石头砸自己的脚。

从发送者到接收者的转账天生就是原子化的。ASP 无法赎回发送者的 vTXO,如果他们重复花费了接收者的 vTXO 的话,这是靠双向同意(mutually agreed)的池交易 id 实现的。如有一些假设的数据控制操作码(OP_XOR 或者 OP_CAT)可用,可以给 Ark 添加插件以约束 ASP 用在签名中的 nonce,以反激励重复花费。如果 ASP 重复花费了一笔池交易,用户可以伪造 ASP 的签名,从而拿走 ASP 之前赎回的 vTXO。这实际上就是一种类似于入账流动性的取舍,只不过不会牺牲协议的设计。

在 Ark 中,支付每 5 秒登记一次,但每 10 分钟结算一次。支付立即就可以入账,因为用户无需等待链上确认,就能花费这个零确认的 vTXO。他们可以把零确认的 vTXO 转交给其他人,也可以用来支付闪电发票。这是因为可以重复花费用户的入账 vTXO 的 ASP,正是路由闪电支付的 ASP。

可以在这个网站中了解更技术细节:https://arkpill.me/deep-dive

(完)