闪电网络节点之间的所有通信都是点对点加密的。此外,节点具有用作标识符和相互验证的长期公钥。
当节点希望向另一个节点发送付款时,首先必须通过连接具有足够容量的付款通道来构建网络路径。节点会广播路由信息,包括它们打开的通道、每个通道的容量以及它们收取的路由费用。路由信息可以通过各种方式共享,随着LN技术的发展,不同的路径查找协议也应运而生。当前实现的路径发现使用P2P模型,其中节点以“泛洪”模式将通道公告传播给它们的对等节点,类似于比特币传播交易的方式。
在我们之前的例子中,Alice的节点使用这些路径发现机制之一找到连接她的节点和Eric的节点的一个或多个路径。一旦Alice的节点构建了一条路径,她将通过将一系列加密的和嵌套的指令传播到相邻的每个支付通道来初始化该路径。
重要的是,此路径仅为Alice的节点所知。付款路由中的所有其他参与者只看到相邻的节点。从Carol的角度来看,这看起来像是Bob向Diana支付的付款。Carol不知道Bob实际上是在转发Alice的付款,她也不知道Diana将要向Eric转发一笔付款。
这是LN的一个关键特性,因为它确保了付款的隐私,并且使得很难对其进行监视、审查或黑名单。但是,Alice如何建立这个付款路径而不向中间节点透露任何信息呢?
LN实现了一种基于名为Sphinx的方案的洋葱路由协议。此路由协议确保付款发送方可以构建和传输一条通过LN的路径,以便:
- 中间节点可以验证和解密它们的路由信息的一部分,并找到下一个跳点。
- 除了前一个和下一个跳点之外,它们无法了解路径中的任何其他节点。
- 它们无法确定付款路径的长度或自己在该路径中的位置。
- 路径的每个部分都以一种方式加密,以使网络级攻击者无法将路径的不同部分的数据包相互关联。
- 与互联网上的洋葱路由匿名协议Tor不同,没有“出口节点”可以被监视。付款不需要传输到比特币区块链上;节点只需要更新通道余额。
使用这种洋葱路由协议,Alice将路径的每个元素都包装在一层加密中,从最后开始,逐层向后处理。她使用Eric的公钥对一条消息进行加密,以将消息发送给Eric。然后,将此消息包装在一个加密的消息中,发送给Diana,同时将Eric标识为下一个接收者。对Diana的消息再次被包装在一个加密的消息中,发送给Carol,同时将Diana标识为下一个接收者。对Carol的消息被加密到Bob的公钥。因此,Alice构建了这个加密的多层“洋葱”消息。她将其发送给Bob,后者只能解密并解开外层。在内部,Bob发现了一条地址给Carol的消息,他可以转发给Carol,但自己无法解读。随着路径的传递,消息被转发、解密、转发,以此类推,一直到Eric。每个参与者只知道前一个和下一个节点在每一跳中。
路径的每个元素包含有关必须传递给下一跳的HTLC、发送的金额、要包括的费用以及HTLC的CLTV锁定时间(以区块为单位)到期的信息。随着路由信息的传播,节点将HTLC承诺转发到下一个跳点。
这时,您可能会想知道节点如何不知道路径的长度和自己在该路径中的位置。毕竟,他们收到一条消息并将其转发给下一个跳点。这条消息不是变得更短了吗,以便他们可以推断出路径的大小和自己的位置?为了防止这种情况发生,数据包的大小是固定的,并填充了随机数据。每个节点只能看到下一个跳点和一个固定长度的加密消息以转发。只有最终的接收者看到没有下一个跳点。对于其他人来说,似乎总是还有更多的跳点要走。