术语表 /闪电网络与 Layer 2
承诺交易
- 承诺交易是什么?
- 承诺交易是闪电网络通道双方各自持有的、已签名但未广播的比特币交易,它按当前的余额分配花费注资输出。
每一笔闪电网络支付都会用一对新的承诺交易取代双方原有的承诺交易,旧的一对被撤销而不是删除。BOLT 3将锚点通道承诺交易的预期权重定为1,124权重单位,另加每笔仍在途中的支付172。持有一份承诺交易,就等于持有一条可以单方面走的退出路径,其手续费由对等方在数周前已经同意。
运作方式
一份承诺交易只有一个输入,即通道的2-of-2注资输出,其输出则是这笔资金的当前分配。
任何时刻都存在两份承诺交易,每个对等方各持一份,且二者特意设计为不是同一笔交易。每份副本都将其持有者自己的付款置于 to_self_delay 个区块的 OP_CHECKSEQUENCEVERIFY 锁之后,而更早地向另一方付款,因此谁广播,谁就要等待。在 option_anchors 下,另一方也并非即时到账:to_remote 输出带有一个区块的 CSV 锁,加入这一设计是为了让任何对等方都无法通过给承诺交易附加廉价子交易来阻塞它。
这笔交易隐藏了自己的计数器。BOLT 3将版本字段设为2,取48位的承诺编号,与 open_channel 和 accept_channel 中两个 payment_basepoint 值的 SHA256 的低48位做异或,再将结果拆分到两个字段:高24位放入输入的 sequence 中,前缀为字节0x80;低24位放入 locktime 中,前缀为0x20。双方对等方都能瞬间重新算出该值。而链上的其他观察者只能看到两个看似任意的数字,无法数出通道承载过多少笔支付。
注资方承担退出的费用。在排布任何输出之前,基础手续费先从注资该通道的一方扣除;在 option_anchors 下,两个固定的锚点输出(每个330聪)也从同一方扣除。随后输出按金额从小到大排序,再按 scriptPubKey 逐字节比较排序,HTLC 输出则再按 cltv_expiry 排序,因此双方无需互相发送交易,就能得到逐字节完全一致的交易。
小到不值得记录的金额不会被写入。BOLT 3称这些为被裁剪的输出:若某个 HTLC 的金额扣除其自身二阶段交易所需手续费后低于所有者的 dust_limit_satoshis,则不会生成输出,这笔钱会变成矿工手续费,而不是任何人的余额。BOLT 3列出的阈值与 Bitcoin Core 的一致:支付到见证脚本哈希为330聪,支付到见证公钥哈希为294,支付到锚点为240。这些只是下限而非实际设定值,BOLT 3要求锚点通道将设定值设在该下限之上,因为在这类通道上,二阶段交易不支付手续费,因而不再对裁剪产生任何影响。
这种交易的最新形式则弃用了内置手续费。在适用 zero_fee_commitments 的情况下,版本字段变为3,feerate_per_kw 固定为0,并按240聪的限额增加一个 shared_anchor 输出,其支付到锚点的脚本为 OP_1 <0x4e73>。任何人都可以花费它,因此承诺交易通过子交易为父交易付费(CPFP)进入区块,所付费用取决于当天的手续费市场,而不是这对交易签名时的费率。
购买比特币时为何重要
承诺交易是闪电网络余额不再只是屏幕上的一个数字、而变成聪减去手续费的地方,其中有两条规则会花掉真金白银。
第一条是裁剪。通道内的小额不会被四舍五入,而是被直接删除;规范自己的示例就把1,800聪的在途支付交给了矿工,因为每一笔都低于粉尘限额加其二阶段成本。这就为值得转入闪电网络的金额划出了下限。Phoenix 是本站评测中 ACINQ 推出的钱包,创建通道收取1,000聪,并表示从强制关闭中恢复大约需要720个区块,约五天。用几千聪注资的通道,怎么算都划不来。
第二条是,承诺交易内的手续费是在签名时确定的。注资方的余额按当天的 feerate_per_kw 被扣减,如果此后内存池行情已变,您钱包里的这笔交易可能无法按其所带的价格确认。锚点正是为此而存在,而 zero_fee_commitments 的存在则是为了把这一决定推迟到广播时。
如果通道由别人持有,这两条规则都不会波及您。Strike 在本站交易所评测中评分为4.6,是闪电网络原生的托管型服务,您的余额存放在应用内;Coinbase 对小额闪电网络提币的定价低于链上转账,对大额则高于链上转账。您为此放弃的东西,钱包评测中有记录:Wallet of Satoshi 评分为2.7并被标记为需谨慎,已于2023年11月23日停止向美国客户提供服务,随后随着 MiCA 过渡期结束,又在整个欧盟撤销了其托管型闪电网络服务。您名下并不存在任何可退而求之的承诺交易。
逐步解读 BOLT 3的手续费示例
BOLT 3公布了一个手续费计算的完整示例,从头到尾跟着算一遍,就能看清通道里的钱究竟去了哪里。
设定为:feerate_per_kw 为5,000,dust_limit_satoshis 为546,有四笔在途支付:发出的 HTLC 为5,000聪和1,000聪,收到的 HTLC 为7,000聪和800聪。在该费率下,一笔 HTLC 超时交易的费用为3,315聪,一笔 HTLC 成功交易的费用为3,515。
权重从724起算,这是没有 option_anchors 的通道的数值,整个示例都以这种形态为前提。发出的5,000聪 HTLC 超过546加3,315,因此获得一个输出,权重升至896。发出的1,000聪 HTLC 未超过该值,被裁剪。收到的7,000聪 HTLC 超过546加3,515,因此获得一个输出,权重升至1,068。收到的800聪 HTLC 被裁剪。
基础手续费为5,000乘以1,068再除以1,000,即5,340聪,仅从注资方的输出中扣除。矿工实际收取的手续费为7,140聪,因为两笔被裁剪的 HTLC 也要加在其上。在途的13,800聪中,有1,800聪不再是任何人的余额;如果注资方自己的输出在扣除手续费后低于粉尘限额,这个总数还可能进一步上升。
承诺交易 vs 惩罚交易
承诺交易支付的是双方都已签名的分配方案;惩罚交易则把整个通道从一个发布了已被撤销的分配方案的对等方手里夺走。
两者花费的对象不同。承诺交易花费的是注资输出。惩罚交易花费的是一份已过期的承诺交易的输出,所用的是其持有者在该状态被替换时交出的撤销密钥。to_local 脚本把两种未来写进同一个输出:一个分支需要在 to_self_delay 个区块之后使用延迟密钥,另一个分支需要撤销签名,且完全无需延迟。
承诺交易 vs 强制关闭
承诺交易是您持有的一个对象;强制关闭则是有人广播了一份承诺交易这一事件。
这一区别之所以重要,是因为采取行动的不一定是您。如果对等方按当前状态强制关闭,其副本无需您做任何动作就会向您这一方付款,唯一的限制是锚点通道加在 to_remote 输出上的一个区块的 CSV 锁。您自己的副本是对等方失联时的后备,也是需要您等待完整延迟期的那一份。持有承诺交易是正常、持续且免费的;广播承诺交易则是您宁愿永远不要发生的事件。