术语表 /闪电网络与 Layer 2
发票过期时间
- 发票过期时间是什么?
- 发票过期时间是 BOLT11 支付请求中的 x 字段,是从发票自身时间戳起算的秒数,超过该时间后,付款方和收款方都应拒绝这张发票。
每张闪电网络发票都带有一个截止时间,倒计时从发票签名的那一刻开始,而不是从发票送达您手中的那一刻开始。没有 x 字段时,默认值为3600秒,即一小时。因此,一张在聊天记录中搁置了该小时大部分时间的发票,可能在送达您手中几分钟后就失效,且没有任何可见的原因。
运作方式
发票过期时间以类型为6的标记字段传递,写作字母 x,内容为以大端序表示的秒数。
一个 BOLT11 字符串以35位时间戳开头,该时间戳记录自 UTC 1970年1月1日起的秒数,随后是各标记字段,最后是签名。过期时间是其中一个字段,且是相对值:截止时间等于该时间戳加上过期时间,因此发票中没有任何可直接读取的时钟时间。BOLT11 要求付款方在该时间之后不要尝试付款,也要求收款方不要接受付款。
这两条要求都是 SHOULD 而不是 MUST,因此过期的发票在密码学上并未失效。支付哈希依然有效;阻止付款的是双方的策略,而不是某种锁。您的钱包会拒绝尝试付款,而已丢弃原像的节点无论如何也无法完成结算。
该数值按每五位一组打包,且必须使用能容纳它的最短长度,不得有前导零组。规范自带的示例展示了取值范围:60秒占两组,写作 pu;604800秒占四组,写作 jw5q。对字段做填充的编码器不仅不规范:规范要求读取方将 x、c 或9字段非最短编码的发票视为无效。
发票一经签发,任何人都无法延长其有效期。签名覆盖了人类可读前缀和整个数据部分,因此修改过期时间中的一个字符就会使签名失效。商家若想给您更长的时间,必须签发一个新的请求并重新签名。
一小时的默认值并非随意选定:规范的设计说明指出,这样可以留出时间改用链上支付,即通过 f 字段可携带的备用地址付款。
在哪里会遇到它
发票过期时间会以二维码周围的倒计时圆环、任何解码器中标有 expiry 的一行,以及您粘贴过期内容时钱包给出的拒绝提示等形式出现。
规范的测试向量展示了取值范围的两端。一张金额为2500微比特币、描述为1 cup coffee 的发票,将过期时间设为60秒,因为它要在柜台锁定三美元的价格。Blockstream Store 的一张发票,商品价值88.85美元,其中包括一台 Ledger Nano S,将过期时间设为604800秒,即七天,因为订单确认是一张账单,而不是柜台上的现场付款。
发票在哪里生成,决定了由谁选定这个数值。本站评测的 Phoenix 在手机上运行真正的闪电网络节点,而不是服务器上的账户,因此收款请求中的过期时间是其自身节点的设置。使用托管型应用时,该数值由运营方决定,解码其发票通常是了解该数值的唯一办法。
发票过期时间 vs CLTV 过期增量
发票过期时间和 CLTV 过期增量都是闪电网络支付上的时钟,二者使用不同的单位,作用于问题的不同部分。
发票过期时间是从发票时间戳起算的挂钟秒数,决定该笔付款是否还可以尝试。CLTV 过期增量以区块数计量,同一张发票的 c 字段携带收款方对最后一跳的最低要求;该字段缺失时,付款方必须将其视为至少18个区块。前者告诉您是否应当开始付款;后者告诉您开始之后,您的资金可能在 HTLC 中被锁定多久。