深入解读闪电网络:HTLC 的工作方式与多跳支付的实现方式( 三 )


这样一个流程下来 , Alice 就给 Eric 支付了 1 btc , 无需在彼此间另开一个直接相连的通道 。整个支付链条中 , 也没有人需要信任另一个人 , 而且他们还因为中介服务赚到了 0.001 btc 。即使支付在某个环节卡住了 , 也没有人会遭受损失 , 因为资金还锁在那里 , 时间过了就可以取回 。
清除故障
在我们这个例子中 , 整个流程都是很平滑、没有阻碍的 , 但在现实生活就像所谓的 “墨菲定律”:如果某种坏事可能发生 , 那这种坏事就一定会发生 。于是我们要考虑闪电网络的 “保护” 机制 。
从实践来看 , 支付链条越长 , 最终无法交付资金的概率就越大:某些参与者可能会关闭通道 , 或者某些节点会掉线 。我们来考虑两种可能的出错情形 。
通道故障
先考虑一种情形:我们假设资金已经达到了目的地 , 但在秘密数值一路返回到支付起点的过程中 , 某个参与者拒绝合作或者无法配合 。假设是 Bob 。
深入解读闪电网络:HTLC 的工作方式与多跳支付的实现方式
文章图片

文章图片
- 因为一个通道关闭 , 资金无法交付 -
当 Diana 收到了秘密值时 , 就立即取回了资金 , 并把秘密值暴露给了 Carol 。Carol 也想从 Bob 发出的 HTLC 里面拿回资金 , 但 Bob 没有响应 , 为了避免风险 , 她关闭了通道 , 将自己手上的最后一笔承诺事务(也即 Bob 之前发出的、带有 HTCL 输出的事务)广播到了比特币网络中 , 而且 , 因为她知道秘密值 , 所以能取回资金 。此时 , Bob 还有三天时间可以从 Alice 处拿回自己的钱(因为 Carol 的事务已经上链 , Bob 可以很容易地知道 R 的数值) 。否则 , 等时间锁一解锁 , Alice 就可以收回资金 。
可以看出 , 即使某个参与者因为某种原因离开了网络 , TA 自己是唯一一个可能损失资金的人 , 而其他人的资金都是安全的 。
重新路由
在第二种情形中 , 我们假设资金无法到达目的地 , 也是因为某个参与者出了错 。假设是 Carol 。
第一种也是最明显的解决方法是 , 等待 HTLC 的时间锁过期 , 然后各参议者各自拿回自己的资金 。
- 支付路径中的某个节点没有响应 -
但如果 Alice 就是着急支付 , 该怎么办呢?当然 , Alice 可以通过另一条路径发起新的支付 , 不需要死等资金返回 , 但要是 Carol 突然之间又回来了 , 跟 Bob 把链条续上了呢?那 Alice 不就发送了两倍资金了吗?
- Alice 如果使用另一条路径 -
这是否意味着 , 但凡出现了支付失败的情形 , 都应该乖乖等时间锁超时 , 然后再发起新的一笔支付呢?
好在 , 要避免这种等待 , 我们可以 “取消” 这一次的支付 。Diana(收款方)要发送等量的一笔资金给 Alice , 也使用跟原来一样的哈希值 , 也可以使用另一条路径 。现在 , 如果 Carol 重新上线并参与中介 , 那么资金会走完一个环路 , 这就意味着那笔原来失败的支付被抵消了 , Alice 可以安全地使用另一个路径来支付了 。
- Alice “取消” 了旧的支付 , 新的支付现在可以安全地发送了 -
支付数额
你可以也注意到了 , 当 Alice “取消” 其第一笔支付时 , 现在的确是可以安全地发起新的一次支付了 , 但这并没有改变一个事实:她的第一笔支付的资金现在仍然是锁定的 , 而她可能没有足够的钱来发起第二次支付了 。这就是为什么在使用闪电网络时 , 用 HTLC 来支付时资金额度应该更小 。因为承诺事务不会上链 , 数额可以分割成多个很小的额度 。这样 , 无论什么时候一个路径不通了 , 都只有一小部分资金会被冻结(就是最后发送的那一笔) 。