作者:Anony

本文旨在提出一种协议,让一笔交易可以近似保证在未来的某个时间段上链。其原理是,需要让交易上链的一方作为委托方,为交易设置一笔赏金,受委托方如果想获得这笔赏金就必须让交易上链,从而为交易的确认附加经济保证。搭配交易层面和脚本层面的时间锁,就可以约束交易的上链时间。

这样的协议有许多的用场:

(1)对需要让交易在未来确定时间段上链的人而言,这套协议允许他们将监控区块链和保证交易上链的任务外包出去;

(2)对整个网络而言,可以形成对未来手续费率的预测市场,解决手续费预测的难题;

需要指出的是,在完整构想出整套协议之后,我才意识到,这套协议受到了Jeremy Rubin 的 “在现有比特币共识下实现委托签名” 方案 [1] 的启发。但两者依然有足够多的不同,我们这套方案主要利用了经济激励。

协议与效果

假设委托方希望自己的交易 T 在未来某一段时间(起始点和终结点分别以 T0 和 T1 表示)上链,为此他愿意付出 X 的价格。而受委托方认为,在 T0 和 T1 期间,只需付出不到 X 的价格就可以让 T 上链。于是,双方按照下列步骤达成协议:

  1. 委托方构造交易 T,设置绝对时间锁 nLocktime = T0,并在其功能目的之外增设一个输出 A,并保证交易输出的总额等于输入的总额,即,这笔交易完全不附带任何手续费。交易 T 不应该表示支持 RBF 方法 [2](即不允许通过发出提供更高手续费的替代版本来替换掉 T)。

  2. 委托方构造交易 G,G 使用输入 A 和委托方提供的其他输入,确保输入的总额大于等于 X,并产生一个面值为 X 的输出 B 和找零;依然需要保证输入和输出的总额完全相等。交易 G 也不应该表示支持 RBF 方法。输入 B 的锁定脚本形式如下:

    OP_IF
        受委托方的公钥 CHECKSIG
    OP_ELIF
        设置成 T1 的 OP_CLTV
        委托方的公钥 CHECKSIG
    

    也就是说,在 T1 以前,只有受委托方可以花费这个输出;但在 T1 之后,委托方也可以花费这个输出。

  3. 委托方将交易 T 和 G 交给受委托方。

这套方案有一些良好的特性,满足了我们的设计初衷

  • 受委托方会积极让交易 T(以及 G)上链(得到区块确认),因为唯有 T 上链,G 才有可能上链,他才有可能拿走输入 B 中的价值。而他可用的办法就是生成一笔以 B 为输入的交易 N(也即 CPFP 手续费追加法 [2]),用它为矿工支付足够高的手续费,使得 T-G-N 交易包能够上链。最终,受委托方的收益为 X 减去 T-G-N 交易包上链所需的手续费
  • 因为交易 T 设置了绝对时间锁,所以 T-G-N 交易包无法在 T0 之前上链;
  • 因为输出 B 在 T1 之后将可以被委托方花费,所以受委托方会尽力在 T1 前花费掉它,也就是尽力让 T-G-N 交易包在 T1 之前上链。
  • 因为交易 T 和 G 都不允许使用 RBF 方法,它们就相当于是零确认交易(只是不携带手续费),所以委托方是不能反悔的,他不能通过发送 T 或者 G 的替换交易来撤销输入 B,所以受委托方的收益是有保障的。 (委托方的确可以跟多个受委托方签订协议,但如果需要付出的代价是相同的,这样做就没有意义;而如果需要付出的代价不同,他可以在协议外先找出一个 “要价” 最低的受委托方。)

但它也有一个不足:

  • 这个简化版的协议的外包效果是不完全的:受委托方只会在 T-G-N 交易包上链所需的手续费低于 X 时才行动,一旦手续费超过 X(也即他个人没有收益的时候),他就将无动于衷。
    • 为此我们提出一种优化措施:要求受委托方也给交易 G 提供一个输入,并将该输入的价值也完全注入输出 B。假定受委托方也提供价值 X 的输入,则输出 B 的价值就会变成 2X ,而受委托方无动于衷的手续费水平就要高一倍。
      • 从委托方的角度看,让受委托方也提供输入的方法有点像 “保证金”,是诚意的表示,因为它将放大受委托方不履行责任的损失,也可以当作是一种挑选受委托方的方法。

综上,整套协议的效果是,为求经济利益的最大化,在 T0 至 T1 期间,当且仅当让 T-G-N 交易包上链的手续费低于输出 B 的价值时,受委托方会通过提供合适的手续费,让委托方的交易 T 上链;当且仅当上链所需的手续费高于输出 B 的价值时,委托方需要自己追加手续费。所以,委托方和受委托方既不需要担心对方 反悔/不履约,也不会出现竞争入块的行为(race condition)[3]。

还需要指出的是,虽然我在这里描述委托方构造了两笔交易(T 和 G),但是,但许多场景下,这两笔交易可以合并成一笔交易,对协议的功能没有任何影响。拆分成两笔交易可能有一些好处:假设 T 的参与方不止一个,其构造过程就可以保持原样,不会受到影响;钱包的复杂性也更低。但合并成一笔可能具有一些隐私性上的好处。

结语

我们设计出了一套协议,允许委托方外包让某笔交易上链的工作。

从事前的角度看,要求受委托方也提供的输入的模式接近于 “对赌”:双方打赌 T0 至 T1 时间段内的最低手续费水平,如果该手续费水平让目标交易 T(及其后代)的上链代价低于 X,则受委托方有收益,反之则受委托方要赔钱;而不要求委托方提供输入的模式更接近于 “委托”。不过,这都是从事前的角度看,只要交易的模式和输出 B 的脚本模式确定了,受委托方在经济利益驱动下都会付出不超过输出 B 价值的手续费让目标交易 T 上链。

本协议并没有解决如何匹配委托方和受委托方的问题。此外,委托方也必须向被委托方暴露交易 T 的内容。

脚注

[1]:https://www.btcstudy.org/2022/05/28/delegated-signatures-in-bitcoin-within-existing-rules-no-fork-required/

[2]:https://www.btcstudy.org/2022/03/17/introduction-to-fee-bumping-by-Bitcoin-Optech/

[3]:唯一一种可能产生赛跑的情形是:在 T0 至 T1 期间,交易入块的手续费高于 X;而在 T1 之后,手续费立刻回落到 X 以下。这时候,委托方和受委托方可能都想从输出 B 中回收一些价值,但我们知道,双方都会竞相给出更高的手续费来花费输出 B,最终的结果是输出 B 会全部交给矿工,交易也得到确认。当然,也有可能委托方和受委托方可以达成协议,分配输出 B 中超过彼时手续费的部分,从而避免将输出 B 全部交给矿工。总而言之,具体的情形取决于双方的谈判能力和策略,但并无确定性的结果。

(完)