有过比特币提币、转账等交易的人相信都感受到过,整个比特币网络拥堵不堪,交易费节节攀升,对比传统金融结算系统已经没有速度上的优势。究其原因,无非是比特币的设计原因:平均每10分钟出一个区块,每个区块大小为1M。所以,每10分钟能打包确认的交易是有限的,同时由于矿工是趋利的,会有限打包手续费高的交易,导致交易费的攀升。
于是,比特币社区开启了旷日长久的扩容大战。大区块派主张链上扩容,而小区块派则坚持链下扩容。链下扩容的方案就是我们今天的主角闪电网络。
闪电网络以比特币区块链为后盾,在链下实现真正的点对点微支付交易,区块链处理能力的瓶颈被彻底打破,时延、最终性、容量甚至隐私问题也迎刃而解。社区不少人甚至认为:“闪电网络”的论文(The Bitcoin Lightning Network: Scalable Off-Chain Instant Payments)对比特币的重要性仅在中本聪的创世论文之下,排名第二。
核心的概念主要有两个:RSMC(Recoverable Sequence Maturity Contract)和 HTLC(Hashed Timelock Contract)。前者解决了链下交易的确认问题,后者解决了支付通道的问题。
1.RSMC
闪电网络的基础是交易双方之间的双向微支付通道,RSMC定义了该双向微支付通道的最基本工作方式。
假设A(Alice)和B(Bob)之间要打开一个支付通道,A和B则需分别往一个2-2签名的多重签名地址转入一定额度的比特币。
假设为{Alice: 0.4, Bob: 0.6},意味着打入通道的资金共有1个 BTC,其中A拥有0.4 BTC,B拥有0.6 BTC。通道的设立会记录在比特币区块链上。通道的设立会记录在比特币区块链上。
假设B决定向A支付0.1 BTC,双方在链下对最新的分配方案{Alice:0.5, Bob:0.5} 签名认可,并签名同意作废上面的分配方案。
如果A打算终止通道并动用她的那份资金,她可以向区块链出示双方签字的余额分配方案。如果一段时间之内B不提出异议,区块链会终止通道并将资金按协议转入各自预先设立的提现地址。如果B能在这段时间内提交证据证明A企图使用的是一个双方已同意作废的分配方案,则A的资金将被罚没并给到B。
为了鼓励双方尽可能久地利用通道进行交易,RSMC对主动终止通道方给予了一定的惩罚:主动提出方其资金到账将比对方晚,因此谁发起谁吃亏。
2.HTLC
HTLC可以简单理解为,通过智能合约,双方约定转账方先冻结一笔钱,并提供一个哈希值,如果在一定时间内有人能提出一个字符串,使得它哈希后的值跟已知值匹配(实际上意味着转账方授权了接收方来提现),则这笔钱转给接收方。
这么做使得分配方案更复杂了,有何意义呢?
假设A想给C发送0.05 BTC,但A和C之间并没有微支付通道。但这没关系,A找到了一条经过B到达Ce的支付路径,该路径由A/B和B/C这样2个微支付通道串接而成。
A签名了一个转账密文H给C,由于A与C没有直接的支付通道,C收不到这笔转账。
现在,A和 B商定一个HTLC合约:只要B能在2天内向A出示正确的密文,A则支付B 0.051 BTC,否则钱会自动退还给A。
B和 C商定一个HTLC合约:只要C能在1天内向B出示正确的密文,B则支付C 0.05BTC,否则钱会自动退还给B。
现在,由于A已经把密文告诉了C,C只要向B出示正确的密文,就能收到0.05BTC。而多的0.001 BTC成了B的佣金,也可以理解为旷工费。
3.闪电网络
这个交易机制可以扩展到非常多的人,也就形成了闪电网络。在整个交易中,智能合约起到了中介的重要角色,而区块链则确保最终的交易结果被确认。
闪电网络是基于微支付通道演进而来,创造性的设计出了两种类型的交易合约:序列到期可撤销合约RSMC(Revocable Sequence Maturity Contract,哈希时间锁定合约HTLC(Hashed Timelock Contract)。
RSMC解决了通道中币单向流动问题,HTLC解决了币跨节点传递的问题。这两个类型的交易组合构成了闪电网络。
RSMC 创建
我们先来创建一个序列到期可撤销合约(RSMC),爱丽丝和鲍伯是合作方,经常有比特币往来,所以他们决定各拿出0.5BTC放入通道中,便于业务往来。
解释一下下方RSMC交易的结构(图X),左侧为爱丽丝的视角,右侧为鲍伯的视角。中间Funding Tx为共同可见,C1a和RD1a为爱丽丝持有,C1b和RD1b为鲍伯持有。交易图中带有尖括号的签名表示待填入。
RSMC交易的结构图
1、双方各拿出0.5BTC,构建Funding Tx,输出为爱丽丝和鲍伯的2/2多重签名。此时, Funding Tx未签名,更不广播。
2、爱丽丝构造Commitment Tx:C1a和RD1a,并交给鲍伯签名。C1a的第一个输出为多重签名地址,爱丽丝的另一把私钥爱丽丝2和鲍伯的2/2多重签名,第二个输出为鲍伯 0.5BTC。
3、RD1a为C1a第一个输出的花费交易,输出给爱丽丝0.5BTC,但此类型交易带有sequence,作用是阻止当前交易进块,只有前向交易有sequence个确认时才能进块。
4、鲍伯构造Commitment Tx:C1b和RD1b,并交给爱丽丝签名。结构与C1a、RD1a是对称关系。
5、鲍伯对C1a和RD1a进行签名,并将签名给爱丽丝;同理,爱丽丝对C1b和RD1b签名,完成后给鲍伯。此时,由于并未对Funding Tx进行签名,任何一方均无法作恶,任何一方也不会有任何损失。
6、双方均完成对commitment Tx的签名并交换后,各自再对Funding Tx进行签名,并交换。此时,Funding Tx是完整的交易,广播之。
上述过程以及结构图的描述,就是创建RSMC的全部过程。
C1a, C1b两笔交易花费的是同一个输出,故他们两个交易只有一个能进块。若爱丽丝广播C1a,则鲍伯立即拿到0.5BTC(C1a的第二个输出),而爱丽丝需要等C1a得到1000个确认,才能通过RD1a的输出拿到0.5BTC。另一方,若鲍伯广播C1b,则爱丽丝立即拿到0.5BTC,鲍伯等待C1b得到1000个确认,才能通过RD1b拿到0.5BTC。也就是说,单方广播交易终止合约的那一方会延迟拿到币,而另一放则立即拿币。
交易更新
爱丽丝和鲍伯各自0.5BTC的余额,此时爱丽丝从鲍伯处购买了一件商品,价格为0.1BTC,那么余额应该变为爱丽丝 0.4BTC,鲍伯 0.6BTC。于是创建新的Commitment Tx,对于爱丽丝来说是C2a 和RD2a,对于鲍伯来说是C2b和RD2b,过程与上面类似。
交易更新时的交易结构
此时两个状态均是有效的,那么最核心的问题来了,如何才能彻底废弃掉C1a和C1b呢?
RSMC采用了一个非常巧妙的方法,在C1a的第一个输出中,采用了爱丽丝2和鲍伯的多重签名,爱丽丝将爱丽丝2 的私钥交给鲍伯,即表示爱丽丝放弃C1a,承认C2a。
交易更新时的多重签名
爱丽丝交出爱丽丝2的私钥给鲍伯,那么鲍伯就可以修改RD1a的输出给他自己,形成新的交易BR1a。若爱丽丝破坏合约存在C2a的情况下依然广播出C1a,那么爱丽丝的惩罚就是失去她全部的币。爱丽丝交出爱丽丝2的私钥,或者对交易BR1a进行签名,两者是等同的,都是对C1a的放弃。
反之亦然,鲍伯交出鲍伯2的私钥给爱丽丝即意味放弃C1b,而仅能认可C2b。
引入sequence的目的是,阻止后续交易进块(RD1a),给出一个实施惩罚窗口期,当发现对方破坏合约时,可以有1000个块确认的时间去实施惩罚交易,即广播BR1a代替RD1a。若错过
1000个块时间窗口,则无法再实施惩罚了(RD1a进块了)。
交易关闭
关闭RSMC,直接按照最终的余额构造出一个Commitment TX即可,例如输出为爱丽丝0.1BTC,鲍伯0.9BTC,无需再设置多重签名,构造惩罚交易等。
中转交易
爱丽丝想要支付0.5BTC给鲍勃,但她并没有一个渠道来和他进行交易。幸运的是,她和查理有一个交易渠道,而查理正好和鲍勃有一个交易渠道。这样爱丽丝就能借助查理的交易渠道,通过哈希时间锁定合约(HTLC)来和鲍勃进行交易了。
中转交易示意图
为了完成这次交易,爱丽丝就会给鲍勃发短信说:“嘿!我要给你付笔款。”这时鲍勃自己将收到一个随机数字(R),接着鲍勃便会回一个被哈希的数字(H)(你可以认为被哈希的数字R是随机数字的一种加密形式)给爱丽丝。然后爱丽丝的钱包紧接着就会联系查理说:“嘿,查理。如果你给我生成(H)的未加密值(R),那么我就同意更新我们渠道的支付分配,这样你就可以得到的就会比0.5BTC多一点,我得的比0.5少一点。”尽管查理并不知道R,但他也会同意。之后查理便会去找鲍勃说:“嘿,鲍勃。如果你给我那个能生成H的未加密的值R,我将同意更新我们渠道的支付分配,这样你就可以得到的会比0.5BTC多一点,我得到的比0.5少一点。”
因为R就是从鲍勃这里生成的,所以他肯定知道。接着他马上将R告诉查理,并更新了其渠道的支付分配。然后查理将R告诉给了爱丽丝之后也更新他们的渠道,最后交易完成,爱丽丝以脱链的形式付给鲍勃0.5BTC。
总结
RSMC通过巧妙的设置Commitment TX的多重签名输出,以及sequence的延迟进块形成惩罚窗口期,解决了在微支付通道中的币单向流动问题。
Alice 会把自己的 1BTC 放到一个 MultiSig 地址里面,这个 MultiSig 需要 Alice 和 Bob 一同 sign
才会执行具体的操作(即这 1BTC 要还给 Alice 多少,多少要转到 Bob 的账户里面去),在 Alice 转钱到这个 MultiSig 之前,Bob 会首先签名一条消息,这条消息里面说: 把 MultiSig 里面的 1BTC 退还给 Alice,但是,这里还有一个 Time Lock,下面图里用的 Time Lock 用的是 30 天,Alice 只有 30 天之后才能 sign,执行退钱的操作。这个部分的操作还需要在区块链 上进行操作。
Alice 要转账 0.1 BTC 给 Bob,那么她 sign 一条消息,里面说,这 1BTC 有 0.9 要还给自己,0.1 给 Bob.
Bob 如果这个时候也 sign 了这个 message,那么就可以 broadcast 到 blockchain,使得上面的 MultiSig 执行操作,实现了转账。
但 Bob 也可以不 sign,因为之后 Alice 可能还要转账。比如,这里Alice 又 sign 了一条新的 meassage,如果 Bob 也 sign 了这条,那么他会得到更多的 bitCoin,因此在这条和上面那条旧的 message 中,他肯定更加倾向于选择这一条。当然,同样的,Bob 可以不考虑 sign 了然后 Broadcast 出去,而是等待 Alice 可能会再次向他转账,比如这里 Alice 又转了 0.1 BTC 给 Bob:
那么,假如现在 Bob 想要还 0.1 BTC 给 Alice 呢?当然,你可以说 Bob 也去创建一个 MultiSig,那么就是对等的了。但其实 Bob 可以不那么做,他只需要把 Alice 给他的 0.2BTC 中的 0.1 BTC 退回去就可以了。
如果要实现这一点,那么一开始 Alice 在 sign 消息的时候,还需要给一个 lock time。
我们来重新看这个过程:
Alice sign message 说,0.8 BTC 留给自己, 0.2 给 Bob,这条消息 Bob 只有在 第 29 天的时候才能 sign:
而 Bob 想要还 0.1 个 BTC 给 Alice,于是他 sign 了一条新的消息,这条消息在第 28 天才是有效的,接下来,他们之间还可以有更多的转账操作,直到 lock time 变成了当天,一方为了自己的利益,必须马上 sign,并且把 消息 broadcast 到 blockchain,完成在 Blockchain 上的转账 :
如果每两个人之间转账,都需要先建立一个 MultiSig,这似乎对 Blockchain 的压力也不小。
于是,假如存在的第三个人,他或许不是一个个人,而是某个交易所,他收取一点点的手续费。
根据上面的描述,现在你已经知道 Alice 和 Bob 之间,可以建立一种关系来互相转账,在接下来的描述中,我们不再关注 Alice 和 Bob ,以及即将加入的 Carol 和 Bob 之间的转账细节了。我们只需要抽象地知道,他们之间是可以互相转账的,且不需要每一笔都经过 区块链。
那么,我们现在要让 Carol 加入,Alice 要转账给 Carol:
Carol 会首先会构造一个 R,不告诉别人。同时会计算出 R 的 hash H.
Carol 把 H 给 Alice:
Alice 转账 0.01 BTC 给 Bob,Bob 要拿到这 0.01 BTC 的话,他还需要提供 R :
于是 Bob 就转账给 Carol,同样的,Carol 要拿到钱需要提供 R 给 Bob:
转账似乎就可以顺利完成了。
上面的设计叫做 “Hash Lock”,这个设计是有问题的:
如果 Alice 和 Bob 之间的转账先失效了,那么 Alice 的 0.01 BTC 会退回,Bob 就拿不到了;而 Bob 和 Carol 之间的转账要是后失效,那么 Carol 从 Bob 那里拿到 0.01BTC 之后,Bob 就损失掉了 0.0.1 BTC.
所以,我们需要 “Hash Time Lock”,其实就是保证 Carol 和 Bob 之间的转账一定要比 Alice 和 Bob 之间的先过期。
这样的话,我们就得到了闪电网络: