哈尔滨工程大学 区块链讨论课
2018201125 陈晓龙
2018201204 魏金龙
参考博客/视频:
https://www.bilibili.com/video/BV1yW411B7F5?t=16
https://www.bilibili.com/video/BV1et411d7m9?t=553
https://www.8btc.com/article/92887
https://www.zhihu.com/question/46515457
欢迎指正!
区块链可扩展性技术:闪电网络
区块链技术的瓶颈
区块链技术发展到现在遇到一个瓶颈,就是交易吞吐量和交易速度的问题。比特币在目前区块大小是1MB的情况下,处理交易的能力是7笔每秒。而VISA支付处理量大约是4000笔每秒,平时我们使用的支付宝、微信等工具交易处理量也远大于比特币网络。交易的缓慢,会造成网络的拥堵,这样用户之间就会就手续费这个问题产生竞争,从而能够尽早被矿工处理,进一步会使转账的手续费变的更加昂贵,这是非常不利于比特币的普及使用的。
闪电网络
闪电网络使小额的、经常发生的在两个用户之间的交易可以快速地完成,不需要很长的交易确认时间。
闪电网络的核心思想
闪电网络的核心思想是,小额的和日常经常发生的交易无需发生在链上,这就避免了每秒处理7个交易的限制,可以很快地处理交易,所以闪电网络被称为线下方案。
闪电网络的关键技术有两个:序列到期可撤销合约RSMC(Revocable Sequence Maturity Contract)、哈希时间锁定合约HTLC(Hashed Timelock Contract)。
RSMC
下面通过一个简单的例子来阐述一下闪电网络的整个工作过程。
每天早上上课的时候我都会从宿舍旁边买早餐。假设我使用比特币付款,想象一下我会遇到什么麻烦。第一个是我需要等待很长的时间,让比特币网络确认我的交易,这样我买一个早餐都要等上一个小时或更长时间,我就也不用上课了,可以直接吃午饭了。第二个是,我买一个早餐可能只需要0.00005 BTC,对于这种小额付款,手续费都可能比付款高。
那怎么解决呢?
我想向买早餐的大妈赊账,每个月结一次帐,这样我所有交易的处理时间都集中在一次交易上,手续费也只需要付一次交易的手续费。
大妈却是想让我直接预付,将一整个月的帐在月初提前支付。
其实我们都是无法相信彼此的,大妈怕我突然某天不来了赖账,我怕大妈哪天拿着我的钱跑路了,所以我们都无法说服对方让对方来使用我们的方案。
RSMC的解决方案是:
借助闪电网络,我与大妈之间可以建立一个支付通道。要实现这个通道,我们都要把一些比特币发送到一个多重签名地址。这个通道需要我们双方的共同的签名才能建立,同时建立一个账单。这个支付通道是建立在主链之上的,所有人都可以看到。
比如我发送了0.001 BTC、大妈发送了0 BTC(可以发送0,因为大妈不需要付款)到这个多重签名地址。如下图所示。
当我每天消费的时候,我只要对账单进行修改即可。如下图所示。
需要注意的是,修改账单之后,前面的账单应该是被舍弃的,应用的永远都是最新的账单。
我们两个人应该都是有权力去结束这个通道的,这个通道被结束的时候,最后的账单会被上传到多重签名地址中,然后主链会将我们两个之间的账单进行处理。
我们发现整个过程只会有两次在主链上的交易。
在这个过程中,我们可以发现两个安全性问题。以下面账单为例。
-
不合作
我们两个人应该都有权力去结束这个通道的,因为如果大妈想结束通道,结账,而我始终拒绝的话,账单就迟迟不能被主链所处理。但是当前的账单是只有一个账单,提交账单必须要两个人同意才行。我们应该合理地改变数据结构,使我们两个人都能独立地结束这个通道。
-
旧版本
我们在解决上面一个问题之后,我们两个人都能独立结束通道,但这就会引出一个新的问题。账单最终的版本应该是4号账单,我独立结束通道,提交1号账单到主链上,那就相当于白嫖了所有的早餐。这个问题也必须要解决,旧版本必须在有新版本之后被废除。
接下来我们来看RSMC是如何解决两个问题的。
通道建立
通道建立只需要双方在链下准备一套类似上图的交易结构,完成后仅将funding交易发布到区块链上即可。
交易图中带有尖括号的签名表示待填入。
流程如下:
- 双方各拿出0.5 BTC构造Funding Tx,Funding Tx需要Alice和Bob的多重签名,此时,两个人都未签名,不广播。
- Alice构造Commitment Tx,包括C1a和RD1a,并交给Bob签名,Bob签名后再发送给Alice。C1a有两个输出,第一个输出为多重签名地址,第二个输出为Bob 0.5 BTC。Bob构造Commitment Tx,包括C1b和RD1b,并交给Alice签名。C1b的结构与C1a类似。
- C1a的第一个输出为RD1a,这个交易需要Alice2和Bob的同时签名,会输出给Alice 0.5 BTC。此类型交易带有seq,seq=1000表示交易RD1a只能在包含其父交易C1a的区块得到1000个确认后才能被收录。
不合作
上面的交易结构其实就可以解决不合作的问题。
这套交易结构是完全准备就绪的一套结构。Funding Tx要提交到区块链上,只需要Alice和Bob的私钥签名。
如果Alice想要单方面结束通道:因为C1a中Bob已经签过名,所以Alice只要在C1a上用自己的私钥签名,然后就可以在区块链上发布交易C1a。这时候seq就会起作用,seq=1000,那么Alice必须等C1a被收录并得到1000个确认之后才能发布交易RD1a,这个输出的分配是给Alice 0.5 BTC。而第二个输出则是立即会给Bob分配 0.5 BTC。也就说,单方面结束交易通道的一方会受到延迟提款的惩罚,这个机制也为解决“旧版本”问题提供了基础。
交易更新
如果Alice从Bob那里买了0.1 BTC的商品,那么通道的余额分配就会发生改变,变成Alice :0.4 BTC,Bob:0.6 BTC。Alice和Bob会构建新的Commitment Tx,分别是上图的C2a、RD2a,C2b、RD1b。
那么上面提到的**“旧版本”**的问题怎么解决呢?
RSMC采用的方法非常巧妙。
在创建C2a,C2b之后,Alice和Bob会交换Alice2与Bob2的私钥,就意味着他们都放弃了C1a,C1b。如果说Alice想要提交旧版本的C1a来赖账,Alice在C1a上补完自己的签名,发布到区块链上。因为RD1a需要有1000个确认,也就是大约10000分钟的时间,7天的时间,才能收到分配给自己的0.5 BTC。但是Bob将会立马看到被废除的C1a被发布,而且他已经有了Alice2 的私钥,那么他就会立马发布交易块BR1a,交易块的内容是把原本分配给Alice的0.5 BTC也分配给自己,那么这1.0 BTC就全是Bob的了。因为BR1a中没有seq=1000的限制,而且他的父交易已经被放出,这个交易块会立即执行,Bob会很快收到0.5 BTC。这样,如果Alice敢这样干,她会有很大的损失。这个措施也正好照应了RSMC的含义——序列到期可撤销合约。
需要说明的是,在正常的情况下,如果C1a没有提交,Bob虽然有Alice2 的私钥,但是他没有Alice 的私钥,所以就无法提交C1a这个账单,也就无法发布BR1a。所以对双方来说都是安全的。
HTLC
参考
https://www.8btc.com/article/92887
协议内容
我们还会发现一个问题,这个支付通道是建立在两个人之间的,那么我每次与一个人交易,都要新建立一个新的交易通道。
在闪电网络中,我们并不需要这样做,我们可以利用闪电网络来传递 BTC,也就是说如果你想与Bob进行一次交易,但是与他之间没有交易通道。而你和Bob都和Charlie有交易通道,那么你们就可以通过Charlie来进行交易了。如下图所示
这个中转交易就要使用哈希时间锁定合约(HTLC)来实现了。
通过HTLC,Alice和Bob可以达成这样一个协议:协议将锁定Alice的0.1 BTC,在时刻T到来之前(T以未来的某个区块链高度表述),如果Bob能够向Alice出示一个适当的R(称为秘密),使得R的哈希值等于事先约定的值H(R),Bob就能获得这0.1 BTC;如果直到时刻T过去Bob仍然未能提供一个正确的R,这0.1 BTC将自动解冻并归还Alice。
实例
接下来来看一个例子。
Alice想要支付Dave 0.05BTC,但他们之间没有支付通道。Alice找到了通过Bob、Carol到达Dave的一个通道。
Dave生成一个秘密R并将Hash(R)发送给Alice,Alice不需要知道R。
Alice和Bob商定一个HTLC合约:只要Bob能在3天内向Alice出示哈希正确的R,Alice会支付Bob 0.052 BTC;如果Bob做不到这点,这笔钱3天后自动退还Alice。
同样地,Bob和Carol商定一个HTLC合约:只要Carol能在2天内向Bob出示哈希正确的R,Bob会支付Carol 0.051 BTC;如果Carol做不到这点,这笔钱到期自动退还Bob。
最后,Carol和Dave商定一个HTLC合约:只要Dave能在1天内向Carol出示哈希正确的R,Carol会支付Dave 0.05 BTC;如果Dave做不到这点,这笔钱到期自动退还Carol。
一切就绪后,Dave及时向Carol披露R并拿到0.05 BTC;现在Carol知道了R,她可以向Bob出示密码R并拿到0.051 BTC(差额部分的0.001 BTC成了Carol的佣金);Bob知道R后当然会向Alice出示并拿到他的那份0.052 BTC,差额部分的0.001 BTC成了Bob的佣金。
整个过程很容易理解。最终效果是Alice支付了0.052 BTC,Dave安全地拿到0.05 BTC,整个闪电支付网络为此收取的佣金成本是0.002 BTC。上述过程中的全部动作都发生在比特币区块链之外。