术语表 /闪电网络与 Layer 2
短通道 ID
又称 scid。
- 短通道 ID 是什么?
- 短通道 ID 是闪电网络用来标识通道的8字节指针,由注资交易的区块高度、该交易在区块中的索引和输出索引三部分组合而成。
闪电网络用公开通道的注资输出在区块链中的位置来命名该通道,而不是用任意标签。其中三个字节表示区块高度,三个字节表示交易索引,两个字节表示输出索引,合计64位,供人阅读时写作539268x845x1。借助这一坐标,您可以对照区块链核实钱包正在途经的通道,而无需信任任何人的仪表板。
运作方式
短通道 ID 的三个组成部分按从高位到低位的顺序拼接:注资交易的区块高度、该交易在区块内的索引,以及向通道付款的输出的索引。固定的位宽将区块高度和交易索引的上限定为16,777,215,将输出索引的上限定为65,535。
供人阅读时,这些数字以十进制书写,并用小写字母 x 连接,因此高度为539,268的区块中索引为845的交易的第1个输出所对应的通道写作539268x845x1。规范给出的理由是:在大多数字体中,小写 x 明显比数字小,便于肉眼区分各部分,而且双击一下即可选中整个标识符。
打包后它是一个普通的64位数字,BOLT 11的测试向量对此作了演示:路由提示66051x263430x1800 依次对应字节序列01 02 03 04 05 06 07 08,因为66051即0x010203,263430即0x040506,1800即0x0708。
由于短通道 ID 是一个位置而不是哈希,如果它所指向的区块发生变化,它就不再成立。因此,通道要等到注资交易至少获得6次确认后才会公告,节点也应忽略输出确认数不足的公告。拼接(splice)同样会改变该标识符:经过拼接的通道会以拼接交易的短通道 ID 重新公告,而节点仍会继续转发仍使用旧标识符的付款。
未公告的通道没有公开标识符,因此对等节点会互相提供一个别名;带有别名的更新必须设置 dont_forward 标志,并且出于隐私考虑绝不能转发。
在哪里会遇到它
短通道 ID 是闪电网络 gossip 的寻址层,出现在每一条针对某个特定通道的消息中。
消息类型259(announcement_signatures)在两个对等节点同意公布其通道时携带一个。类型256(channel_announcement)携带其他所有节点用来在链上查找注资输出的那一个。类型258(channel_update)在每次手续费或到期时间变更时重复它,每个方向各一次。类型261(query_short_channel_ids)向对等节点索取一组短通道 ID 背后的公告,这组 ID 以升序数组发送,编码字节为0;编码字节1曾表示 zlib 压缩,现已被彻底禁止。如果某个通道在任一方向上的最新更新都已超过两周(1,209,600秒),节点可以修剪该通道。
普通用户唯一会遇到它的地方是付款请求:BOLT 11发票的 r 字段携带路由提示,每一跳都包含一个节点公钥、一个64位的短通道 ID、两个手续费数值和一个到期增量。规范中的示例指向589390x3312x1。
短通道 ID vs Outpoint
短通道 ID 和 outpoint 都用来指代一个交易输出,但二者的方向相反。outpoint 为36字节,由32字节的交易 ID 加上4字节的索引构成,通过生成该输出的交易来指代它;短通道 ID 为8字节,通过同一输出落在链上的位置来指代它。
二者的取舍在于体积与稳定性。outpoint 在交易存在的那一刻就有效,包括未确认的交易,并且永远不会改变。短通道 ID 要等交易进入区块后才存在,而如果发生区块重组,使该交易在不同的高度或位置被重新挖出,同一个通道就会得到不同的标识符。闪电网络接受这一点,因为该坐标同时也是查找输出的指引,而且每个通道以8字节进行 gossip,比36字节便宜得多。