55 / 736HTLC

HTLC

Hashed Timelock Contract — 哈希与时间条件

HTLC 把付款与披露正确的秘密值联系起来,并在付款未完成时提供收回资金的路径。在 Lightning Network 中,这让付款可以经过中间节点,而不必只依赖对方的承诺。不过,这种保护仍需要有效签名和及时行动。

HTLC 是 Hashed Timelock Contract 的缩写,指一种有条件的付款:一条路径要求提供秘密值,其哈希,也就是数字指纹,必须与事先已知的值相符;另一条路径则在满足时间条件后允许收回资金。这个秘密值叫作 preimage,不是钱包密码。知道它不能代替必要的签名,时间到了也不会自动退款。

安娜想通过 Lightning Network 向帕维尔发送 20,000 sat。Sat 是 satoshi 的缩写,指比特币在链上的最小单位。两人没有共同的支付通道,但都能通过伊娃建立合适的连接。通道是两名参与者关于比特币分配的约定,可以不断更新,而不必把每笔付款都写入区块。伊娃向帕维尔提供有条件的 20,000 sat,安娜则向伊娃提供 20,010 sat。在这个简化示例中,差额 10 sat 是伊娃的转发费用。这里发生的是两个通道中相互关联的余额变化,并不是同一枚具体的币穿过两个通道。帕维尔知道一个能满足收款条件的秘密;伊娃随后可以用同一个值向安娜收款。她不必仅凭帕维尔的承诺,先不可逆地把钱付给他。这些数字用于说明机制,并非通常或建议的费率。 [1]

帕维尔为付款准备一个 32 字节的随机秘密值,即 payment_preimage。SHA-256 据此计算出 payment_hash。检查公开的值是否产生正确指纹很容易,但仅凭指纹还原妥善选取的秘密,在实践中不可行。常见的 BOLT 11 发票,也就是 Lightning 付款请求,在 p 字段中包含哈希,而不是 preimage 本身。帕维尔履行付款条件时,秘密沿路径返回,关联相应的 HTLC。发票 s 字段中的 payment_secret 是另一个值:它帮助收款方正确处理付款,不能代替 preimage。这些值都不是 Seed Phrase(用于恢复钱包的一组词),也不是钱包私钥。 [1] [4]

如果两笔条件付款的期限相同,帕维尔可能很晚才公开秘密,导致伊娃来不及收取入站付款。因此,安娜向伊娃提供的入站 HTLC,要比伊娃向帕维尔提供的出站 HTLC 更晚到期。这个差值叫作 cltv_expiry_delta,给伊娃留出余量。对方停止回应、必须通过比特币链上交易执行约定时,也需要这段余量。它以区块数衡量,不是精确分钟数,并且必须考虑延迟和链重组。安全设置由软件和通道规则处理;余量过小会危及资金。 链重组会用另一条有效分支替换链的一部分,因此此前的交易确认可能发生变化。 [1]

在 Lightning 中,cltv_expiry 是区块高度,即区块在链中的位置。它不是 Unix timestamp(用秒数表示的日期和时间),也不是 BOLT 11 发票以秒计的有效期。满足时间条件后,timeout 路径可能开放,允许在没有秘密的情况下结算。资金不会自行移动:管理支付通道的程序,也就是 Lightning 节点,仍须正确完成通道更新,或使用相应的链上交易。有效的 preimage 也不会在到期时自动失效。如果同一输出(带有花费规则的一笔金额)尚未通过其他方式花费,多条允许的花费路径可能竞争;两笔花费不能同时在同一有效链上确认。因此,及时行动也是安全的一部分。 [1] [4] [5]

HTLC 连接的是条件,并不能让任何金额都通过任意路径。伊娃需要在出站方向拥有足够资金,也就是流动性,并有位置容纳新的待处理 HTLC。限额、费用或无法联系的节点都可能阻止付款。在待处理尝试得到妥善解决前,部分资金可能持续被占用。钱包状态描述的是整个尝试,不能只根据一条消息判断结果。公开 preimage 不等于比特币交易得到确认。普通的成功 Lightning 付款通过通道更新结算,不必把每笔付款写入一个新区块。 [1] [3]

以下部分是技术参考。通道状态记录每笔金额归谁,以及哪些 HTLC 仍未完成。Commitment transaction 是一笔已签名的比特币交易,可以在链上执行该状态。update_add_htlc 仅提出添加建议;update_fulfill_htlc 通知履约,update_fail_htlc 通知失败。仅仅宣布变化还不够。双方通过 commitment_signed 和 revoke_and_ack 交换新状态的签名,以及使旧状态不再能安全使用的信息。按照 BOLT 2,双方必须不可撤销地接受相关更新,后续义务才能依赖它。参与者之间的这种确认并不是区块确认。通道注资和可能发生的关闭,则依靠比特币交易。 [1]

字段是消息中的单项数据。Millisatoshi 是 satoshi 的千分之一,属于 Lightning 内部的记账单位,不能作为独立的小数份额在比特币链上花费。 update_add_htlc 消息的基本字段是 channel_id、id、amount_msat、payment_hash、cltv_expiry 和 onion_routing_packet。amount_msat 以 millisatoshi 为单位。节点检查通道限制、可用流动性和转发条件;出站 HTLC 有自己的参数。按照 BOLT 2,在入站 HTLC 的添加不可撤销地承诺之前,不得提出对应的出站 HTLC。 [1]

Onion routing 把每个中间节点的指令放进独立的加密层。伊娃得到的是自己这一步所需的信息,而不是所有参与者的明文列表。 节点解密自己的 onion 层并验证完整性。在普通的非盲化路径中,它将 amt_to_forward 和 outgoing_cltv_value 与入站金额、费用及要求的时间差进行比较。数据包不会向它公开整条路径。但这不排除流量关联或其他身份推断;onion routing 不保证绝对匿名。 [3]

输出是一笔带有花费规则的金额,规则用 Script 语言表达。Offered 和 received 从通道参与者的角度表示提供和接收的 HTLC。第二阶段是后续交易;CHECKSEQUENCEVERIFY(CSV)要求从被花费输出的确认开始等待。撤销密钥用于惩罚公开旧的、已撤销状态的行为。 BOLT 3 区分 offered 和 received 输出,以及 HTLC-success 或 HTLC-timeout 路径。仅仅知道哈希还不够:必须满足相应的签名、preimage 和时间条件。本地第二阶段输出有 to_self_delay 的 CSV 延迟,而持有正确撤销密钥的对手方可使用无需该延迟的惩罚分支。具体 Script 取决于通道类型。 [2] [6]

Trimming 表示将通道状态放到链上时,小额 HTLC 不会成为独立输出。Dust 是这些小额资金的称呼。Dust exposure 衡量受此限制影响的总金额。 若金额扣除适用的第二阶段费用后低于 dust_limit_satoshis,承诺交易便不创建 HTLC 输出。规则取决于协商的类型:option_anchors 和 zero_fee_commitments 没有这种第二阶段费用;zero_fee_commitments 可将被裁剪的金额计入 shared_anchor。不存在的输出无法单独在链上认领。这些 HTLC 的合计金额构成 dust exposure。 [2] [1]

下面的检查面向节点运营者和开发者。解码把记录转换成可读字段,不会发送任何东西,也不能单独证明所有条件已满足。 比较入站与出站的 amount_msat、payment_hash 和 cltv_expiry;用 SHA-256 验证 preimage。同时跟踪 commitment_signed、revoke_and_ack 和最终状态,而不只看一条 fulfill/fail 消息。链上执行时,解码实际承诺交易,检查输出是否存在、所用分支及 HTLC-success/HTLC-timeout。检查签名、时间条件和确认情况;解码本身不能证明有效性。 [1] [2]

要获得更完整的理解,请将本词条与以下词条结合阅读: Lightning Network, Payment Channel, Timelock, Hash, CLTV, CSV. 反向关联还来自: Timelock, Payment Channel, Lightning流动性, Lightning Routing.

DOC · 001BOLT 2 — Channel state and HTLC handling规范 DOC · 002BOLT 3 — HTLC transaction scripts and trimming规范 DOC · 003BOLT 4 — Onion routing and payload validation规范 DOC · 004BOLT 11 — Payment hash and invoice expiry规范 DOC · 005BIP 65 — CHECKLOCKTIMEVERIFY规范 DOC · 006BIP 112 — CHECKSEQUENCEVERIFY规范
修订日期: 来源优先 · 非投资建议