Published: 2019-01-17

理解闪电网络2——引入HTLCs

1 网络概述

假设Alice和Bob已经建立了支付通道,Bob和Carol也已经建立了通道,这时候Alice转账1BTC给Carol。

Alice可以再和Carol建立通道,但她没有这个必要,Alice可以通过Bob这个中间点来进行:Alice给Bob 1BTC,Bob给Carol 1BTC。

但是Bob要是不可信的呢?如果Alice给了Bob 1BTC,Bob不给Carol呢? 或者Bob给了Carol 1BTC, Carol不承认Bob给了呢,这时候Alice要相信谁呢?

这时候需要一种机制,使得Alice仅当Bob赋给Carol 1BTC后才给Carol 1BTC,这个通过Hash来做到, 如下图这样:

Note: 图片较大,建议新建窗口浏览。图片来源于bitcoinmagazine,上面关于lightning network的文章写得很好,非常推荐阅读。

图1:加密的信任机制

流程解读:

  1. 当Alice想通过第三方Bob给Carol发送1BTC时,Alice告诉Carol,让Carol生成一个密钥1(value1),然后将其hash值发送给Alice,并且Alice告诉Carol如果Bob给Carol 1BTC,那么Carol将密钥1(value1)告诉Bob
  2. Alice将此hash发给Bob,并告诉Bob,如果Bob有Carol的value1(通过hash验证),那么自己会给Bob 1BTC
  3. Bob将1 BTC发给Carol, Carol将密钥1(value1)告诉Bob.
  4. Bob用获取到的密钥1来向Alice兑换Alice允诺的1BTC

问题: 上面这个流程中,Bob还是得“相信”Alice和Carol, 万一Bob给Carol 1BTC后,Carol不给Bob密钥呢,或者Bob拿到密钥后,Alice不兑现承诺,不给Bob 1BTC呢?

这时候就需要下面的“哈希时间锁合约”(Hash Time-Locked Contracts)。

2 Hash Time-Locked Contracts(HTLCs)

图2:Hash Time-Locked COntracts下信任机制

解读:

  1. 图中包含了2个HTLC,上面的是Bob和Carol之间的,下面的是Alice和Bob之间的
  2. 以Bob和Carol间的HTLC为例,Bob花费了自己的1BTC,输出是2选1,要么Carol使用密钥(Value)来花费,要么一定时间后Bob可以取回资金
  3. Bob和Alice之间的HTLC也是类似,Alice花费1BTC, 要么Bob通过Value来花费,要么一定时间后,Alice可以取回
  4. 第2步一旦Carol取走了1BTC,那么其同来取资金的Value将会公开,这时候Bob将会得知Carol的Value,并用来取回Alice的1BTC
  5. 可以看到,采用HTLC才保证了上面“信任问题”,使得:1.如果Carol获得Bob的1BTC后,一定会告诉Bob它的Value(因为交易公开),2. 如果Bob取得Value后,一定可以向Alice获取1BTC(因为资金已经到一个写好条件的合约中)
  6. 等等,上面一步中,如果Bob拿到Value后,Alice设置的期限到了,Alice已经取回了1BTC了呢?
  7. 所以需要Bob和Carol的HTLC的过期时间要早于 Bob和Alice之间的HTLC(通过CTLV),这样Bob获取Value后,确保Bob和Alice之间的合约不会已经到期

A和B之间的Hash Time-Locked Contracts(HTLCs)可以理解成:A想让B帮她做某件事,两人定额一个合约,规定时间内如果B做好了(做完事有凭证来证明),那么A一定会给她费用,如果时间到了,A取回这笔资金。

通过HTLCs,通道和通道间可以构建成一个网络,资金在这个网络上流转,就好像Internet一样。

3 HTLCs + Payment-Channel

上面的HTLCs例子是以广播在比特币网络上的交易为基础的,如果将其和支付通道相结合呢(好处是不需要每笔交易都记录到比特币网络)?

结合上一篇讲支付通道的文章来看,假设现在的状态是:Alice和Bob建立完通道后,发生了2笔交易,第一笔是Alice转账给Bob 1BTC(见图3), 第二笔是Bob转给Alice 1BTC(见图4), Alice和Bob现在各自拥有5BTC。

图3:Alice转给Bob 1BTC状态

图4:Bob转给Alice 1BTC状态

现在Alice想要给Carol转1BTC(通过Bob和Carol之间的通道):

图5:HLTCs+Payment-channel状态1

图6:HLTCs+Payment-channel状态2

图7:达成共识,通道关闭

解读:

  1. 图5中, Alice生成类似的commitment tx:4BTC给Alice, 5BTC在1000blocks后给Bob(或者Bob给Alice取消的权利后给Alice),剩下的1BTC分3种情况:1.如果Bob获取到了Carol的Value后,在1000blocks后给Bob 2,一定期限后(CLTV)给Alice, 3.Bob给Alice取消的权利后给Alice. 生成完commitment tx自己签名后发给Bob。
  2. 同样的, Bob也生成commitment tx: 5BTC给Bob, 4BTC在1000blocks后给Alice(或者Alice给Bob取消的权利后给Bob),剩下的1BTC分3种情况:1. 如果Bob获取到了Carol的Value后给Bob, 2. 一定期限后(CLTV)给Alice, 3. Alice给Bob取消的权利后给Bob。生成完commitment tx自己签名后发给Alice。
  3. 现在考虑下Alice和 Bob生成的commitment tx的1BTC的部分:
  4. 第1种情况都是Bob获取Value后可以(可能要等待)得到这1BTC,第2种情况都是一定日期后,钱退给Alice,第3中情况都是如果一方作弊,钱给对方
  5. 现在考虑第1种情况:如果Commit Tx是Bob广播的Tx(Alice生成的那个),那么Bob如果有需要的 Value后要多等1000blocks后才可以获取这1BTC。如果是Alice广播的,那Bob一旦有需要的Value,那么可以立即获得。这么做的目的是防止Bob在广播旧的Commitment Tx,如果这样,给Alice留有时间去收回给Bob的1BTC。
  6. 如果Alice作弊广播了旧的交易,那么Bob可以用Alice新给的Key来收回这1BTC(而且还不需要Value)
  7. 现在假设Bob从Carol那里获得了Value,那么他就可以用来获得他应得的1BTC,只需要签名和广播Alice给他的Commitment Tx,并建立后续交易,将1BTC转到自己的地址上。
  8. 然而,Bob也可以告知Alice这个Value,就算Alice得知Value后,也无法改变Bob可以取走这1BTC的行为
  9. 所以Alice和Bob可以达成一种约定:现在Alice拥有4BTC,Bob拥有6BTC,并建立新的Commitment Tx,和旧的密钥一起交给对方。这时状态就变成图7(交换旧的密钥是为了交换惩罚对方作弊的权力)
  10. 这时候通道的状态就变成了普通的状态,接下来可以保持通道开放,或者任一方请求关闭通道,见图7

4 总结和体会

回顾整个通道和网络的流程,可以发现这样一个约束机制:如果两人要有条件的达成共识(比如我们各有5BTC,你要向我转1BTC,怎么确保数据不上区块链的情况下我们都统一这1BTC转账确实发生了),那么各自授权对自己有利的事情交给对方曲儿,如果对方确认了(对自己不利还确认),说明这件事是符合共识的。

什么是对自己有利的事呢,比如我可以立即获得6BTC,你得等一段时间才能获得4BTC,而且这段时间内,如果发现你作弊了,那么我有权利把属于你的4BTC也拿过来。

作弊惩罚的机制通过互相生成新的密钥和交换旧的密钥来实现,一旦双方达成新的共识,之前的共识(假设现在同意我有7BTC,你有3BTC,而不是之前的我6BTC,你4BTC)就会被作废(如果使用旧共识,那么会有惩罚)。

像上面的是确定数额的转账(比如我7BTC,你3BTC), 在现实生活中是确定的,要么发生要么不发生。当涉及到HTLCs后,这个通道的状态就变成不确定的了(可能Bob获取到了Value也可能没有),这时候生成的交易的3个条件分别是:事情发生了的情况、事情没发生了的情况、对方作弊的情况。考虑到可以对对方作弊进行惩罚的权利,对对方有利的事情得等待才能发生。

闪电网络的构建实现了一个事情:如果在防止对方作弊的条件下达成共识。

5 参考列表

6 END

Author: Nisen

Email: imnisen@163.com