术语表 /闪电网络与 Layer 2
特性位(feature bit)
- 特性位(feature bit)是什么?
- 特性位用于告知其他闪电网络节点,您的节点支持某一项特定的协议扩展,奇数表示该扩展为可选,偶数表示该扩展为必选。
闪电网络没有可供对等节点比较的版本号,因此两个节点在连接的那一刻,通过交换一个位字段来确定彼此能够协同完成哪些操作。BOLT 9定义了25对有名称的特性位,范围从第0位到第67位,且任何一对特性位中的两个位不得同时设置。如果您的钱包拒绝另一款钱包能够支付的发票,缺少某个特性位是需要检查的事项之一。
运作方式
特性位从位字段的最低有效位开始计数,起始为第0位,其值为0x1,算作偶数位。
特性位成对分配,而成对分配正是关键所在:奇数位表示节点支持该特性,偶数位表示节点要求该特性。因此,一项能力可以先以可选形式推出,悄然普及,之后再升级为强制要求。BOLT 9指出,过时的节点将拒绝这种强制要求,因此不匹配的情况会在两个节点相遇时暴露,而不是在支付进行到一半时才出现。其余要求也写得很明确:源节点不得同时设置一对特性位中的两个位,而接收节点如果仍然看到两个位都被设置,则将该特性视为强制。
有些特性依赖于其他特性,发送方需要带上整条依赖链。基本多路径支付占用第16位和第17位,依赖 payment_secret;零确认(zeroconf)通道占用第50位和第51位,依赖 option_scid_alias;位于第66位和第67位的 option_onion_messages_only_channels 依赖普通洋葱消息。源节点必须设置所有传递性依赖,因此位于单个特性开关之后的代码可以假定相关支持位均已存在,而无需重新验证。
在25对特性位中,目前有五对仅显示为 ASSUMED:0/1、8/9、12/13、14/15和44/45。每一个特性都已普及到默认所有节点均具备的程度,其语义仅保留在规范的早期修订版本中。该表中的编号也存在间断,2/3、20/21、30/31、32/33、52至59以及64/65均未分配任何特性,因此出现空缺属于正常情况。
在哪里会遇到它
特性位会出现在多个不同的位置,BOLT 9表格中的 Context 列指明了每一对特性位应出现在其中哪些位置,在25行中有六行该列为空白。
I 表示两个对等节点在连接时交换的 init 消息,N 表示广播到 gossip 图中的 node_announcement,C 表示 channel_announcement,9表示 BOLT 11发票,B 表示盲化路径的 allowed_features 字段,T 表示开通通道时协商的 channel_type。许多特性位只出现在一种场景中:option_payment_metadata(第48位和第49位)仅用于发票,而位于第22位和第23位的 option_anchors 会出现在 init、gossip 以及通道类型中,但从不出现在发票里。
当两种场景的信息不一致时,以发票为准:BOLT 9的理由说明指出,对于同时出现在 node_announcement 和 BOLT 11中的标志,发票中的值会覆盖所公告的值。因此,钱包是从您粘贴的发票中读取能力,而不是依据数小时前目标节点向 gossip 网络公告的内容。
Phoenix 由 ACINQ 基于其 Eclair 实现构建,在您的手机上运行一个真正的节点,因此它是否接受多路径支付或盲化路由,取决于与对等节点交换的位字段,而不是宣传页面上的说法。Muun 将链上资金和闪电网络资金显示为同一份余额,其闪电网络支付归根结底仍取决于发票中的特性位。
特性位 vs 版本位
特性位用于在两个闪电网络对等节点之间协商能力;版本位则在比特币区块头中为软分叉发出信号。BIP-9将区块头版本字段的第0位至第28位提供给矿工,并在主网上于2,016个区块的窗口期内达到1,916时锁定部署,此后该部署对后续每个区块均生效。特性位对任何人都没有约束力:它只是两个对等节点之间的声明,在一次连接上为真,在下一次连接上为假,没有阈值,没有超时,也没有全网范围的激活。闪电网络协商的是一对节点将为彼此做什么;比特币决定的则是所有人必须接受什么。