术语表 /闪电网络与 Layer 2
微额 HTLC
- 微额 HTLC 是什么?
- 微额 HTLC 是金额过小的闪电网络支付,无法在承诺交易中获得独立输出,因此强制关闭通道时,这笔资金归矿工所有,而不归通道任何一方。
对于任何价值低于粉尘限额加其救援手续费的在途支付,闪电网络通道都拒绝为其创建输出,这部分金额会变成矿工手续费。在粉尘限额为546聪、费率为每千权重单位5,000的情况下,低于3,861聪的支付都会被裁剪。只有在该笔支付仍在传递期间通道被强制关闭,这笔钱才会损失。
运作方式
微额 HTLC 由算术而非判断决定:通道所有者选定的粉尘限额,加上在链上领取该笔支付所需的成本。
BOLT 3将被舍弃的输出称为已裁剪。对于您发出的支付,通道检查的是金额减去 HTLC-timeout 手续费;对于您收到的支付,检查的是金额减去 HTLC-success 手续费。在没有锚点的通道上,这两笔交易的权重分别为663和703权重单位,因此在 feerate_per_kw 为5,000时,它们的手续费分别为3,315聪和3,515聪。对照546聪的粉尘限额,发出支付的阈值为3,861聪,收到支付的阈值为4,061聪。
BOLT 3的示例展示了这种损失。在该费率下有四笔在途支付:发出的 HTLC 分别为5,000聪和1,000聪,收到的 HTLC 分别为7,000聪和800聪。5,000聪和7,000聪的两笔各自获得一个输出。1,000聪和800聪的两笔被裁剪,承诺交易的手续费从基础的5,340聪升至7,140聪。多出的1,800聪恰好就是这两笔消失的支付,支付给了打包该关闭交易的矿工。
双方各自选择自己的 dust_limit_satoshis,因此同一通道的两份承诺交易可能对哪些支付算微额存在分歧。BOLT 2规定,如果对方提出低于354聪的值,节点必须使通道失败,并允许节点拒绝其认为过大的值,因为限额很高的一方可以发布塞满被裁剪支付的承诺交易。
锚点通道改变了这一算术。在 option_anchors 或 zero_fee_commitments 下,第二阶段的 HTLC 交易不带手续费,因此不再计入计算,阈值缩减为单纯的粉尘限额。BOLT 3告诉节点在这种情况下有意调高 dust_limit_satoshis,因为一个超过限额却无法按实际费率清扫的输出,只会污染 UTXO 集。
BOLT 2还限制总额,而不是单笔支付。超过节点的 max_dust_htlc_exposure_msat(这本身属于策略问题)后,节点应在传入的 HTLC 提交后使其失败,并且不应披露原像,从而把可能的损失变成一次干净的失败。
在哪里会遇到它
微额 HTLC 体现在钱包的托管模式中,而不是界面上,本站的41款钱包评测在这一点上界限分明。
Phoenix 在您的手机上运行真正的自托管闪电网络节点,因此通道属于您,这一风险敞口也由您承担;ACINQ 每次发送收取0.4%加4聪,而每一次发送都是一个可能被裁剪波及的 HTLC。BlueWallet 的闪电网络部分是 LNDHub 服务器上的一个账户,通道由运营方持有:您不会承担被裁剪的支付,但需要依赖该运营方。
裁剪在关闭通道时会再次出现。BOLT 2规定,只有双方承诺交易中都不再有 HTLC(包括微额 HTLC)时,才允许进行关闭协商,因此一笔链上观察者无法看到的300聪支付,仍会使协作关闭保持挂起。
微额 HTLC vs 粉尘限额
粉尘限额是节点选定的一个数值;微额 HTLC 则是在与该数值加手续费的比较中落败的一笔支付。
粉尘限额是通道参数,在 open_channel 和 accept_channel 中设定,之后的消息不再携带。裁剪则是一个会变动的结果:没有锚点时,阈值随 feerate_per_kw 变化,因此同一笔2,500聪的支付,在内存池清闲时是一个真实输出,在内存池拥堵时则被裁剪。
两者作用的阶段也不同。Bitcoin Core 的阈值(传统输出为546聪,pay-to-witness-script-hash 为330聪)是针对已存在交易的中继策略。被裁剪的 HTLC 永远不会经过这一检验,因为它的输出从未被写入。