另外,即使双方都确认了某次提现,首先提出提现一方的资金到账时间要晚于对方,这就鼓励大家尽量都在链外完成交易。通过RSMC,可以实现大量中间交易发生在链外。
相关交易:funding transaction, commitment transaction, closing transaction, penalty transaction
【2】HTLCHashed Time Lock Contract,哈希时间锁合约。这个类似限时转账,通过智能合约,双方约定转账方先冻结一笔钱(发送比特币到一个多重签名地址),并由最终接收方生成的一个密码R的哈希值H(R)加锁,如果在一定时间内接收方知晓了密码R,使得它哈希值H(R)跟已知值匹配(实际上意味着转账方授权了接收方来提现),则这笔钱转给接收方。如果约定时间内,接收方未知晓密码R,则转账方可取回已冻结资金。主要由2部分构成:
哈希值锁定,确保了只有知晓最终接收方生成的密码R才可以解锁(即确保最终接收方已经拿到比特币后,中间节点才可以解锁去币,在最终接收方拿到比特币前,中间节点是无法知晓密码R的)。
时间锁定,即确保了转账方在一定时间内(最终接收方解锁取走比特币前)无法取走,又能保证在一段时间后如果最终接收方没有取走比特币的情况下,转账方可以拿回自己的比特币。
举个例子:A经过B向C转账1个比特币,过程如下:
C随机生成一个密码R,计算哈希值H(R),发给A;
A用哈希值H(R)创建和B的HTLC合约:A转1比特币给一个多重签名地址Q,如果B能在2天内知晓密码R,解锁Q,取到A支付的1个比特币;如果2天内,B没有R,2天后Q解锁,A取回自己支付的1个比特币。
B用哈希值H(R)创建和C的HTLC合约:B转1比特币给一个多重签名地址,如果C能在1天内知道密码R,则解锁,取到B支付的1个比特币;如果1天内,C无法知晓密码R,1天后解锁,B取回自己支付的1个比特币。
密码R是C生成的,它自然知晓密码R,所以C能在1天内,解锁B的HTLC,取到B支付的1个比特币。在这个过程中,B也看到了密码R。
在C解锁B后,B知晓了密码R,依此B解锁A,取到A支付的1个比特币。
至此,A给了B一个比特币,B给了C一个比特币,等同于A给了C一个比特币,转账完成。
三、闪电网络——路由部分如果交易的双发都加入了这个支付通道网络,你就可以通过这个支付通道网络与任何加入闪电网络的交易方进行交易。具体的,在确定了你的交易接收方后,你需要选择中间节点构建一条发起者到接收者的路由去完成交易。如何建立这条路径呢?
仅仅知道当前有哪些节点,本节点连接了哪些节点,这些信息是不够的。你需要知道当前网络拓扑以及各个支付通道的费用、离线余额等更多信息,才能选择一条满足要求的最佳路径。这就需要一个实现一个协议来同步全网的网络拓扑以及支付通道的费用、离线余额等信息。这里使用Gossip协议对这些信息进行同步。
主要同步节点和通道信息:
同步通道信息,使得我们维护一个全网通道网络拓扑,以进行路由选择。
同步节点信息,使得节点间建立连接以及建立支付通道。
相关消息:channel_announcement、node_announcement、channel_update等
【2】路由算法选择最佳路径有了上面这些信息,我们就能设计路由算法来建立这条路径。前面提到,进行交易时它们需要先建立一个通道,中间会经过若干支付通道,会有很多路由选择,不同的通道交易费用不同,同时有些通道可能不满足要求(额度太小),考虑到经过太多的支付通道也是不好的,最好有路由跳数的限制,即,选择一条经过有限跳数的的费用最低的一条路径。综上,这个路由算法归结为一个在有限跳数(闪电网络设为20)条件下,带有(负)权值的单源最短路径问题(这里路径中权值指的是费用,费用可能为正,也可能为负)。
解决这个问题的路由算法就是:Bellman-Ford-Gibson
/* Bellman-Ford-Gibson: like Bellman-Ford, but keep values for every path length. */构建通道时,满足条件的路由没有找到怎么办?与对方新创建直接支付通道。
【3】 (补充)闪电网络规模巨大时的路由方案——Flare