在上一篇从技术人视角看闪电网络之微支付通道 里,我们知道微支付通道在一对一高频交割场景下的作用。
如果打造这种保险箱(多签地址,合约),使这种保险箱必须在时限内传入一把钥匙R才能把币给解锁人,否则就返还给发布人,这样就变成HTLC(Hashed Time Lock Contract,哈希时间锁)
如果Alice和Eric之间要转账,但手续费不允许,又没有通道直接转账,就需要在已有的通道间进行价值传输(如果Alice和Eric特意再开个通道,需要再锁一定的准备金,可能会遇到资金短缺的问题),这里需要Eric打一把钥匙(秘钥R),然后给Alice一把对应锁头(对应的hash值H(R)),Alice把这把锁头的模型(也是对应的hash值H(R))发给其他人,让其他人能识别是不是R钥匙,并把R钥匙从Eric那里拿过来;并且在通道上串联一条HTLC合约,在指定区块高度之内给了正确钥匙的人,能拿到币,其他通道也发布类似合约。下图的情况是,闪电网络之中,路由的选路机制将Alice->Bob->Carol->Diana->Eric这4条通道连起来。
因为整个价值传输的过程可能要横跨BTC的出块周期,基础的区块高度不稳定,用在合约上的高度条件必须用相对高度差(相对现在的UTXO块高度)。
因为整个网络传输可能会有延迟,通道的价值传输可能要耗费时间,每条通道的合约指定的时限(相对高度差),离收款方Eric越近,时限越紧(高度差越小);反之亦然。
一般网络不会响应超过10分钟,高度差只需增减1就行。从Alice开始路由其他节点,每进过一条通道,时限缩小1个高度,传输的币也会少(要给结点路由手续费)。
这种合约也要在闪电通道上执行(不然干脆在主链上转账更好,手续费比多个结点全打包一次更低),双方在通道上创建新交易,格式是一样的,只不过需要锁定本次通道费用到单独的HTLC合约里,其他的费用放到RSMC合约和钱包地址。
HTLC合约要同时考虑断通道惩罚、违约惩罚和超时返回、H(R)锁头的解锁,故收发方的合约内容相似,但是内容可以说完全不同的:
在交易还没到下一阶段时,由A单方断开通道,并且对方时限内没拿到R;或者由B单方断开通道,并且在时限内拿到R开锁;这两种情况下HTLC的币是属于主动断通道的地址的,需要延时收币;另外2种情况,就是HTLC的币属于对方的,要优先取到币。这就是HTRD1a和HERD1b交易的作用。
无法理解的是为什么还有HED1a和HTD1b这俩交易。。。为什么会在同一个输出里面分叉出2个0.1BTC。。。
后面考虑到违约惩罚就好理解了,从同一个输出里面分叉出的2个0.1BTC其实是同样的BTC,属于同个输出的2个执行分支,作用是防止对方在下一次交易时发布本次交易。
这是上图交易作为历史交易被发布之后,所做的一系列违约惩罚行为。由于白皮书配图太大,只截关于HTLC合约的部分。
值得注意的是和HTLC有关的钥匙编码是不同的,那是因为钥匙都是另打的,双方都要防止不同分支(有没在时限内用R开锁)下,发布了交易,结果对方都能用同种钥匙开锁。