跳转到正文
buybitcoinsmart

术语表 /闪电网络与 Layer 2

Keysend

Keysend 是什么?
Keysend 无需发票即可发送闪电网络支付:付款方生成32字节的原像,将其哈希为支付哈希,并把该原像放进洋葱数据包中一并发出。

Keysend 颠倒了闪电网络的常规流程:常规流程中由收款方选定秘密值,并在发票中公布其哈希。发送方的秘密值放在自定义 TLV 记录5482373484中,这是一个偶数,BOLT 1规定,不认识 keysend 的节点必须拒绝它,而不是忽略它。您可以只凭节点公钥直接付款,无需往返交互,但同时放弃了发票本可留下的密码学收据。

运作方式

Keysend 依据的是 BOLT 1中一条规则较严格的那一半:读取方遇到类型为奇数的未知 TLV 记录时会将其丢弃并继续处理,但遇到类型为偶数的未知记录时,必须使整个数据流失败。

2^16以下的类型标识符保留给各项 BOLT,从2^16起的范围可供自定义记录自由使用,BOLT 1规定:当普通节点应忽略该数据时选奇数,应拒绝该数据时选偶数。bLIP-3记载,5482373484是原始的 lnd 实现随机选定的,它以四结尾,因此 keysend 落在了拒绝的一侧。这就是它需要功能位的原因:愿意支持的节点会通告54/55位,名为keysend,它依赖于var_onion_optin,bLIP-3指出,发送方应先查找该功能位,而不是盲目发送再眼看着失败。

bLIP-3所列的发送方任务很简短:生成一个密码学安全的随机32字节值,放入该记录,并把update_add_htlc中的payment_hash设为其 SHA-256。切勿重复使用原像,也切勿使用已付款发票中的原像。数据包在每一跳都会被混淆,因此每一跳只能恢复出下一跳的地址,中间任何节点都看不到该记录。最终节点对找到的值进行哈希,与被要求接受的哈希核对,然后完成结算。

拒绝是刻意保持低调的。BOLT 4对节点无法理解的负载有一个字面意义上的应答,即PERM|22 invalid_onion_payload,它甚至可以指明出问题的 TLV 类型。bLIP-3则要求接收方改为返回PERM|15 incorrect_or_unknown_payment_details,这样被拒绝的 keysend 就与节点从未签发过的支付哈希无法区分。

在哪里会遇到它

Keysend 是播客打赏(boost)背后的底层机制。

bLIP-10定义了第二个记录,类型为7629169,最初由 Breez 选定,它携带一个附在 keysend 支付上的扁平 JSON 数据块:播客标题、剧集、表示播放位置(以秒计)的ts、设为 boost 或 stream 的action,以及可选的message,正是它构成了 boostagram。按分钟的流式支付会把seconds_back设为60。该记录是奇数类型,因此 bLIP-10对向后兼容性不作考虑:忽略这些元数据的主播仍会收到聪。之所以需要它,是因为单独的 keysend 不会告诉收款方任何信息,应用必须自行标明节目。

同样的缺口也使 keysend 不在购买路径之中。交易所提币要么给您一张发票,要么请您提供一张,因为平台必须把这笔支付与您的账户绑定,而本站的63份交易所记录和41篇钱包评测中都没有出现这个词。bLIP-3如实陈述了这一取舍:它预计 keysend 将让位于设计更好的自发支付,并点名了 offers 和 AMP,同时列出在此期间要放弃的东西,即支付证明,以及收款方对最终 CLTV 到期时间的任何决定权。

Keysend vs 闪电地址

Keysend 和闪电地址都能让您向从未给过您发票的人付款,但只有其中一个真正省去了发票。输入 user@example.com 会让您的钱包发起一次 HTTPS 查询,返回一张全新的 BOLT11 发票,因此原像仍由收款方选定,您最终持有的是一份有对方签名支持的收据。Keysend 不需要网络请求,也不需要服务器,只需33字节的节点公钥和通往该节点的路由,事后不会给您留下任何可供证明的东西,因为这个秘密值从一开始就是您的。如果您将来可能需要证明自己已付款,请使用发票。

请勿混淆

常见问题

Keysend 是闪电网络规范的一部分吗?

不是,keysend 记录在 bLIP-3中,这是一份闪电网络改进提案,创建于2021年12月8日,用以记录各实现已经上线的功能。它无需修改 BOLT,因为从2^16起的 TLV 类型标识符可供自定义记录自由使用,但 keysend 的类型5482373484是偶数,因此 BOLT 1规定,不支持它的节点必须拒绝该负载,而不是忽略它。

Keysend 支付能证明我已付款吗?

不能,因为原像由您而不是收款方生成,也没有发票签名把这笔支付与对方关联起来。bLIP-3把丧失支付证明列为 keysend 的主要缺点之一,因此只要收据重要,请使用发票。

我的 keysend 支付为什么失败了?

最常见的原因是目标节点不接受 keysend,而您无法从错误信息中判断这一点。拒绝自发支付的节点会返回 PERM|15 incorrect_or_unknown_payment_details,这与原像错误或支付哈希从未由该节点签发时的失败相同,因此 bLIP-3规定只向公布了 keysend 功能位的节点发送,该功能位在 bLIP-2中登记为54/55。

接着阅读

相关术语

闪电网络与 Layer 2中的更多术语

阅读本页英文版