作者:洛伦佐
网络中的计算机根据协议相互通信。这里,“协议”指的是一组规定消息应该如何传输和解释的规则。闪电网络协议的支付报文传输部分由BOLT#4描述,也称为“洋葱路由协议”。
洋葱路由是比闪电网络早25年诞生的技术。它也用于Tor,这是“Tor”(“洋葱路由器”)名称的由来。闪电网使用的是稍加修改的版本,名为“基于源的洋葱路由”,缩写为“SPHINX”。在本文中,我们将讨论洋葱路由的工作原理。
为什么使用洋葱路由?世界上有许多不同的通信协议,但由于闪电网络是一个支付网络,因此选择一个尽可能少地透露支付被转发信息的协议是合理的。
如果闪电网络使用与互联网相同的协议,每个中间人都会知道谁是付款的发送者,谁是接收者,以及整个路径上的其他中间人是谁。洋葱路由是一个很好的选择,因为它的特性可以确保中间节点:
我只知道我的上一个节点(谁给我发了消息)和我的下一个节点(消息转发到哪里)。
不知道整个路径的长度;
我不知道我在这条路上的什么地方。
洋葱路由概述我们使用包裹作为类比来解释洋葱路由是如何工作的。
假设爱丽丝想付钱给迪娜。首先,Alice应该为她的付款找到一个可行的路径:
然后,她构造了一个洋葱。她想从迪娜开始(从小路的尽头)。她在寄给迪娜的包裹里放了一条秘密消息(支付内容),并用只有她和迪娜知道的钥匙锁上。现在,她把这个包裹放在另一个要寄给Chan的包裹里,用一把只有她和Chan知道的钥匙锁住这个寄给Chan的包裹。是啊,等等。
Alice将最后一个洋葱(包裹)发送给路径上的第一个中间人Bob。Bob使用自己的密钥打开自己的包,然后看到下一个包被发送给Chan。所以他把包裹转交给陈。Chan也打开包裹,将它转发给Dina。最后,迪娜打开了自己的包裹,发现了付款短信。
在洋葱路由中,像Bob和Chan这样的中间人不知道给Dina的信息的内容以及整个支付路径的长度。他们唯一知道的是把包裹转发给他们的人和下一个收到包裹的人。这确保了消息的私密性和路径的机密性。每一个中间人都只能接触到专门为TA做的那一层新闻。
在闪电网基于源的洋葱路由中,发送方选择支付路径,并为该路径构造一个完整的洋葱,可以视为隐私漏洞。其他路由方案,如“盲路由”(中文翻译),通过混淆发送方的一些支付路径来解决这个问题。然而,在本文中,我们将重点放在斯芬克斯。
组装洋葱现在,我们来了解一下洋葱路由的规格。一开始,我们需要定义这些东西:
发送方是“原始节点”(爱丽丝);
接收者是“迪娜”;
支付路径上的每一个中间节点都是一个“跳”(Bob和Chan);
每一跳之间的通信信息称为“跳负载”。
一旦Alice选择了一条支付路径,她从gossip协议中获取每个支付通道的信息来创建每一跳的负载,这实质上是告诉每一跳如何为正在转发的支付创建HTLC (Hash Time Lock Contract)。
为了建立合适的HTLC,每一跳需要:
要转发的金额;
支付的秘密价值;
继续发送洋葱的支付通道的ID;
时间锁的长度。
这些数据大多来自“渠道更新”消息,其中包含有关路线费用、活动要求和支付渠道ID的信息。要转发的总金额是已付金额加上后续每一跳收取的手续费的总和;支付的秘密值由Dina计算并嵌入到支付发票中(路径上的每一跳都由onion消息通知)。
爱丽丝从最后一个节点迪娜开始。她将转发金额、时间锁长度值、支付秘密值和支付金额包含在包中。注意,她不需要添加渠道ID,因为迪娜是最终节点,不需要转发支付给别人。
乍一看,提供转发金额是多余的,因为这个金额和支付金额是一样的。但是多路径支付会通过多条路径交付总支付额,然后两个值就不一致了。
在Chan的加载中,Alice添加了Chan和Dina的通道ID。她还添加了转发量和时间锁定值。最后,Alice为Bob创建了一个负载。Chan通过她自己与Dina的渠道收取100元的付款,因此Alice需要告诉Bob转发金额是付款金额加上手续费。根据Chan的频道更新消息,time lock的值也增加了20(以块为单位)。最后,爱丽丝还要考虑鲍勃的手续费和时锁要求,给他一个时锁长度为700040,价值为100200丛的HTLC。
共享的秘密值和密钥生成下一个笔画。Alice通过为每一跳(包括最终节点)生成一个共享秘密值来准备洋葱。这个共享秘密值可以由Alice和目标跳通过将它们的私钥乘以彼此的公钥来生成。
共享秘密值对于洋葱路由是必要的,洋葱路由允许Alice和每一跳导出相同的密钥。然后,Alice使用这些密钥来混淆洋葱的每一层,并且那个hop使用密钥来解决混淆。
为了保护Alice的隐私,她将为一个洋葱创建一次性会话密钥,而不是使用她自己的节点公钥来导出共享秘密值。她在第一跳使用这个会话密钥,然后,对于随后的每一跳,Alice将最新的密钥乘以一个盲因子,从而确定地随机化该密钥。这些用于创建共享秘密值密钥,我们称之为“临时密钥”。
Bob、Chan和Dina都需要获得与Alice相同的秘密值,因此他们需要知道在他们的会话中使用的临时密钥。Alice只将第一个密钥放在洋葱中,以节省消息的大小。每一跳计算下一个临时密钥,并将其嵌入到下一个节点的洋葱中。每一跳都可以使用自己的公钥和共享秘密值来计算Alice使用的致盲因子,从而确定下一个临时密钥。
如上所述,共享秘密值将用于生成一些密钥,Alice和相应的跳可以使用这些密钥对洋葱进行一些操作。让我们看看每个键的用途。
Rho键
Rho key被爱丽丝用来加密一层洋葱;这会混淆负载的内容,使外人无法解读。只有rho密钥的所有者才能解密有效载荷。这就是接收洋葱的节点应该做的事情:用和爱丽丝共享的秘密值推导出rho密钥,然后解密洋葱,读取内容。
Mu键
Alice使用mu密钥为每次加载创建校验和。她还会将校验和交给接收洋葱的跳。反过来,这一跳将使用mu密钥来生成所接收负载的校验和,以检查它是否与Alice的相匹配。这是为了检查负载的完整性,并验证它没有被篡改。
键盘键
这个密钥仅由Alice用来生成随机的“垃圾”数据。这些数据也是洋葱的一部分,与支付路径的长短、洋葱经过了多少跳无关。它使洋葱总是保持相同的体积,即使它的一些内容需要是不相关的。洋葱路由就是这样隐藏路径长度的,实际上是在保护发送方和接收方的隐私。
Um键
这个键也用于检查洋葱中包含的数据的完整性,但是它只在返回错误时使用。是的,之所以叫“嗯”,是因为它是“木”的反义词。在支付错误的情况下,发现错误的跳将使用um密钥创建校验和,当当前节点收到此错误时,它也将使用um密钥验证消息的完整性。
封装洋葱层的最终洋葱包如下所示:
现在,Alice有了每一跳的负载和每一跳的共享秘密值。让我们看看爱丽丝如何将这些信息转化为最终的洋葱。她从最后一个节点开始,然后一步步往后推。
她首先创建一个长度为1300字节的空字段,这也是所有洋葱负载的总长度。然后,她用pad key创建一个长度为1300字节的随机字符串,这是对任何一跳都没用的垃圾。这一步是为了确保洋葱的每一层看起来都一样,所以不可能看到路径的总长度(有多少跳)或者谁是发送者,谁是接收者。
然后,她为需要使用的负载创建一个校验和,并将其放在负载的末尾。在发送到最终节点的消息中,校验和全为0,通知Dina她是这个洋葱的最终接收者。在净荷末尾加上校验和后,Alice将净荷(和校验和)放在垃圾的开头,并删除整个消息超过1300字节的部分,保证整个消息的长度为1300字节。
然后,Alice用rho key创建一个随机字节串,对上一步得到的洋葱负载进行异或运算,得到混淆负载。对混淆的文本使用这个随机字节串的异或运算就可以得到加载的原文(译者注:换句话说,这里的异或就是对称加密算法,随机字节串就是密钥)。异或运算对洋葱负载和随机字节串(rho key生成)逐位进行比较,只有其中一个数据的位为1时才输出1;这给了一个混乱的负荷。XOR运算的巧妙之处在于,只要得到正确的随机字节串和混淆的载荷,只需要和它们再次进行XOR运算,就可以得到混淆前的载荷。
因为接收洋葱的节点可以推导出相同的rho键,所以可以像Alice一样生成随机的字节串。沿途每个节点就是这样解决困惑,读取内容的。
在一次跳跃中准备好混合洋葱后,Alice为下一个节点重复相同的步骤。关键区别在于,迪娜的洋葱吃完后,不再需要产生垃圾。她只需要在有用的load和checksum之后连接上一步生成的糊涂洋葱,然后把超过1300字节的部分截掉。
最后,Alice得到最后一个混淆的洋葱,并添加一个校验和,以便Bob可以验证洋葱的完整性。然后,Alice添加会话公钥,这样Bob就可以使用这个公钥来计算共享密钥值。最后,她添加了一个表示版本的字节来告诉其他节点如何解释数据。对于BOLT#4描述的版本,版本字节应该是0。
向前的洋葱
为了发送这个洋葱包,发送者创建一个具有以下字段的update_add_htlc消息:
通道ID:与此消息相关的特定通道。
ID:这个HTLC的标识符。
金额:HTLC的价值。
付款哈希值:由付款接收方创建。
到期时间:该HTLC将在某个街区后到期。
洋葱包:为这个支付而创建的洋葱,也就是上面提到的那些东西。
额外数据:用于指定额外数据。
当消息准备好了,爱丽丝把它发送给鲍勃。收到消息后,鲍勃可以开始解码自己的洋葱。他首先从onion包中获得会话密钥,然后用它导出与Alice共享的秘密值。
利用共享的秘密值,Bob生成阿木密钥来验证嵌入在洋葱包中的负载的校验和。如果负载没有被篡改,校验和应该匹配。
为了防止路径中的其他节点知道路径有多长,Bob会在洋葱包中添加一个1300字节的全零字段。然后,Bob从rho key生成一个2600字节的随机字节串。Bob使用这个随机字节串对填充了0的洋葱负载进行XOR运算。
还记得我告诉你如何混淆洋葱负荷吗?将混淆后的洋葱负载作为输入,对相同的字节串进行异或运算,即可得到混淆前的洋葱负载。因为Alice和Bob使用相同的共享秘密值并生成相同的rho密钥,所以Bob可以解决这种混淆。这样做的额外好处是,它将1300字节的填充字符变成了随机字节。
Bob的混淆负荷包括他的跳跃的负荷数据和一个指纹。Bob保存了这个指纹,以便将其添加到发送给Chan的洋葱包裹中。在Bob从onion消息中分离出自己的有效负载后,他将onion包恢复为1300字节的原始大小,并像Alice一样随机化他的会话密钥。最后,Bob将版本字节、会话密钥和指纹添加到洋葱负载中,然后通过update_add_htlc消息将洋葱包转发给Chan。
这个过程将一直持续到消息被发送到最终节点Dina。当Dina收到update_add_htlc消息时,她可以推断出自己生成的秘密值的哈希值,这表明这个htlc是针对她的。因此,迪娜只需要检查指纹,解锁洋葱消息,并透露自己的负荷。
故障排除我们介绍一个成功的案例,就是一切按部就班的案例,但是如果在这个过程中出了问题,必须一路发回消息通知所有节点出了问题。这个过程类似于传统的洋葱路由。当发现错误时,节点需要从共享秘密值中推导出um key,并使用它生成一个随机字节串,然后使用XOR运算混淆返回的洋葱包。
发现错误的节点会将消息发送回支付路径中的前一个节点。每一跳都使用um key和ammag key做同样的操作,直到发送方收到包。最后,发送方使用ammag密钥和um密钥解决包裹的混淆,并进行验证。
错误可能是由洋葱包、节点或通道引起的。如果你经常使用闪电网,你可能遇到过这样的错误,比如“渠道不可用”或者“手续费不足”
本网站声明:网站内容来源于网络。如有侵权,请联系我们,我们会及时处理。
温馨提示:注:内容来源均采集于互联网,不要轻信任何,后果自负,本站不承担任何责任。若本站收录的信息无意侵犯了贵司版权,请给我们来信,我们会及时处理和回复。
原文地址"洋葱tor路由器怎么用,洋葱网络网桥用哪个":http://www.ljycsb.cn/qukuailian/217762.html。

微信扫描二维码投放广告
▲长按图片识别二维码