比特币的成长烦恼
比特币的发明者中本聪也许没有想到若干年后比特币会这么火,设计中存在的两个限制已经不能适应如今火爆的比特币交易:一是1MB的区块尺寸上限;另一个是PoW的共识机制和10分钟的出块速度。交易火爆,因此,一个区块中需要容纳的交易数迅速增加(如图1所示),目前区块大小的中值约700KB,而上限已被触达。受此约束,比特币网络每秒最多只能支持约7笔交易,相比之下VISA每秒交易数超过3000。另外,一个交易要确保可靠,需要6次确认(即产生6个区块
),10分钟的出块周期就使得确认时间平均需要60分钟,大额交易建议等待时间更长。这两个限制严重降低了将比特币作为实际支付手段的可行性。
事实上,几乎所有后出现的数字货币都在试图以各种方式突破比特币的这两个限制:更短的出块周期、PoS、更大区块尺寸等。然而并没有一种解决方案是完美的,相反,设计变得无比复杂,远没有比特币这么简洁优美。譬如,增大出块速度,分叉就变得十分频繁,需要设计非常复杂的机制来解决,例如以太坊(
出块周期:60秒
)的GHOST协议。
既然试图扩容难走通,那就另辟蹊径,给比特币网络减负好了,这便是闪电网络的解决思路。
闪电网络:轻装前行飞起来
闪电网络通过链下交易来为比特币区块链减负。如图2所示,每个圆圈代表一个比特币账号。按道理任意两个账号之间都可以交易,譬如,a和b,a和c,但实际上a只与A直接交易,即,a和A之间存在一条“微支付通道”。同理,b与A、A和B、c和B也存在微支付通道,图中以实线表示。如果a要与b交易,就得需要经过A来充当中介;而如果与c交易,就得经过A和B两个中介。A和B的作用类似IP网络中的路由器。
弄这复杂是什么鬼!因为“微支付通道”是光速路,可以瞬间完成确认,虽然一次交易可能要经过若干中介,却丝毫不减速;更妙的是,交易千万次,链上也可以一个BYTE的数据也不增加!!!要理解这一点,可以用两个经常合作的商人来打比方。
商人甲和乙有频繁的生意来往:今天甲找乙买✈️,明天乙委托甲托运货物,因此两人之间的现金转账十分频繁。每次转账银行都要收取手续费,两人就商量,要不每次交易别转钱了,咱们相互挂账吧,两相抵消其实基本不用实际走现金,也就不用经过银行了。于是两人各拿出一笔钱,譬如500W,在银行开了一个多方管理账户,需要两人同时在场才能支取。然后,每次交易后,两人计算一下公共资金新的分配并分别签字画押,分配证明一式两份由两人分别保管。最关键的是,在分配证明里还要注明:之前的分配证明全部失效。这一过程如图3所示。
就这样,两个伙伴一起愉快合作了多年,直到一天甲要退休享受生活了,便拿着他和乙最后共同签署的最后一份分配证明,来到银行,要求结算,拿走属于自己的那部分资金。银行核实两人的签字后,便将公共账户上的1000W按照分配证明分别打到甲和乙的账户上。当然,乙手上也有同样的证明,因此如果想退休的是乙,那么他也可以一个人持证明去要求银行结算,不需要甲的同意或在场。
甲乙之间经过多次交易,除了在最后结算时,一次也不用麻烦银行。虽然不需要经过银行,但银行的存在是必要的,因为如果甲或者乙突然想抵赖不认账,另一方就可凭着手上的分配证明要求银行立刻照实兑现。银行是双方线下交易可靠性的保证。
理解了这一点后,再来说更复杂的情况:假如甲偶尔一次需要支付丁一笔钱,而甲和丁没有也不想麻烦去银行开设多方管理账户,这时该怎么办呢?这时可以经过几个中介来完成。例如图4,假设甲和乙、乙和丙、丙和丁由于生意频繁,两两之间已开设了多方管理账户,那么甲可以找到合作伙伴乙,乙再通过他的合作伙伴丙把钱给到丁。每一步都如图3一样,都可以在银行以外完成。
与直接交易不同的是,因为钱不是亲手给丁的,甲如何知道乙和丙把钱送到而不是私吞了呢?解决的方法就是每一步,委托人都要求被委托人先垫钱,见到借据后再支付。同时,为了感谢和鼓励这些帮忙的,每一步都由委托人多支付一些给被委托人作为中介费。图4这个例子中,乙和丙各得到了5块钱酬劳,而甲一共为这次转账支付了5+5=10块中介费。
OK,现在回到闪电网络和比特币。上述比喻中的银行系统对应比特币网络,甲乙丙丁对应比特币网络中的用户,而他们两两之间在银行开设的多方管理账户相当于闪电网络中的“微支付通道”。像图4中乙和丙这种合作伙伴众多的用户,其地位就相当于闪电网络(图2)中的账号A和账号B,同样起到路由器的作用(或者更贴切一点,掮客
)。与挂账交易类似,闪电网络是通过用户的链下方式来实际完成交易的,链上并不会保存交易信息。比特币区块链的作用是在结算时(即微支付通道被关闭时
),将交易双方的最终账户余额可靠记录下来。
------------------------------------ 前方高能,游客到此止步 ----------------------------------
很好,你很勇敢!接下来便随我一道去探索闪电网络的技术实现,请坐稳扶好。
闪电网络的技术实现
闪电网络和其他区块链机制一样,不能假设人是遵守规则的。如果一方违约,你没法把ta摁倒海扁,更不能找ta家去堵门,甚至你连ta是谁、是人是狗都不知道。因此,可靠的机制需要完全抛弃信任前提,即使是最险恶、阴暗的心灵除了遵守规则也无他路可走。
从闪电网络的技术实现主要弄清楚两个问题:1. 交易不上链如何保证可靠?2. 如何委托不信任的人办事?下文就将为你解答这两个问题。
注:
(1) 文中图例引自详解最近大热的闪电网络、雷电网络和CORDA;
(2) 如对比特币实现机制尚不清楚,请参考比特币原理一文。
- 交易不上链如何保证可靠?
区块链代表全体共识,任何交易一旦上了链便不可更改、撤销,区块链建设的全体参与者都是这份交易存在及内容真实性的见证人。交易虽然不上链,但只要交易任何一方愿意,随时可将交易发布上链,交易的可靠性就有保证。通常的比特币转账是由转出方构建一个交易发布到链上,接收方只能被动确认,而在闪电网络中,任何一个交易都是有一式两份数据,分别由交易双方掌握,而且已经被另一方预签名,只要自己愿意,随时可以签上名发布上链。由于两份交易数据内容一致,谁来发布的结果其实都一样。
链下交易大致由以下几个步骤完成:
(1) 交易双方建立“微支付通道”,同时创建初始分配合同;
(2) 创建新合同;
(3) 废弃旧合同。这时,本次交易算完成;
(4) 重复(2)和(3)进行新的交易;
(5) 将分配合同发布上链,进行结算同时拆除通道。
在继续下面的讲解之前,有必要规范一下术语。如无特殊说明,下文中都遵守此术语规范:
- 交易:现实中的“一手交钱、一手交货”;
- TX(Transaction):比特币transaction,是比特币区块中存储的基本数据单元;
- TX爸爸:一个TX的输入是另外若干TX的输出,这些TX称为它的“TX爸爸”(
嗯,可能有好几个爸爸,真是有爱的家庭!
); - 合同(Contract):由若干相关联的TX组成,即TX祖孙几代,它们共同实现一次交易。合同是闪电网络技术方案的核心,方案定义了两种基本合同:RSMC(Revocable Sequence Maturity Contract,可撤销的序列到期合同)和HTLC(Hashed TimeLock Contract,哈希时间锁合同)。这两种合同可以组合成更复杂的合同。
图5便是交易双方Alice和Bob执行“步骤(1)-建立微支付通道”涉及的所有TX,它们组成了一个RSMC,即初始分配合同。图中每个圆角矩形都代表一个TX,而箭头线段代表交易的输出(也是另一个TX的输入
),箭头上标识的数字是比特币数量。括号中的字符表示TX输出的目标账号,如果是逗号分隔的多个账号,则表示这个输出需要多个账号签名才能解锁花出去,而打了勾的账号表示已经得到这个账号的签名了。另外,请注意RD1a和RD1b这两个TX中标注了“seq=1000”的条件,这是比特币协议的一个扩展,表示这个TX至少要等它的TX爸爸,即C1a/C1b上链并经过1000个区块后才能上链;这个特性可以为TX生效引入一个时延(作用后面介绍
)。
为了看懂一个合同,首先记住“合同看半边”,因为合同都是一式两份,两份的涵义相同,内容上是对称的,交易双方各执一份,无论谁将其手上的复本发布上链,合同都将执行生效(请注意funding TX下面圆圈中有个×的图标,这表示funding的输出要么被C1a TX花掉,要么被C1b划掉,就看哪个TX先上链了,而另一个就将成为无效的TX`)。图5中分别以粉色和蓝色表示Alice和Bob持有的合同复本。下面我们就从Alice的视角来解释一下此合同的含义(如图5所示):
- TX funding表示A(lice)和B(ob)各拿出0.5个比特币作为资金池,这笔资金只有当同时提供A和B的签名才能动用。这里并不要求交易双方出资相同,只要在相互多次交易过程中,一方的资金没有耗尽即可(
如果这个情况发生了,双方就需要进行结算
); - C1a便是一个用来使用这笔资金的TX(
funding是C1a的TX爸爸
),它将资金分作两份,各0.5个比特币,一份凭A2和B两个签名来提取(标识为#0的TX输出;这里的A2是Alice的另一个比特币账号
),一份凭B的签名来提取(标识为#1的TX输出
); - C1a的#0输出又经由TX RD1a易手,只要凭A的签名便可提走。结合C1a和RD1a,我们可以看出,这实际上是将资金池中的资金原路退还给了Alice和Bob。
这3个TX在Alice的钱包应用中构建好后,发给Bob的钱包应用由其对C1a和RD1a的输入进行签名(B账号上以√标识
),然后,Alice的钱包再对TX funding签名,并将其发布上链(注意到TX funding的边框较粗了么
),这样Alice和Bob就分别被冻结了0.5个比特币。这里请注意以下几点:
- TX funding由谁来发布不重要。假设由Alice的钱包应用来发布,那么必须等到Bob的钱包对C1a和RD1都签名后才能发布;否则,后续如果Bob拒绝对C1a进行签名,冻结在资金池里的比特币就再也拿不出来了;
- C1a和RD1a不需要发布上链,它们存储在Alice的钱包应用中,对比特币网络和其他用户,是不可见的;
- C1a和RD1a如果被Alice发布上链,Bob通过C1a可以立刻拿回0.5个比特币,而Alice需要等C1a上链并等1000个区块才能拿回她的0.5个比特币(
约60000分钟,即3个月。和中国联通学的么?
),这是对单方面拆除通道的惩罚。
微支付通道建立后,双方便可进行交易。假设Alice从Bob处购买了一台IPhone X,为此需要向Bob支付0.1个比特币。交易完成后,Alice和Bob在资金池中的最终余额就应分别变为0.4BTC和0.6BTC。为此,与步骤(1)类似,Alice和Bob的钱包创建了新的分配合同。从Alice视角看,相关的TX为C2a和RD2a,如图7所示。新合同相比老合同有两处差异:
- C2a两个输出#0和#1的金额与C1a不同,分别为0.4BTC和0.6BTC,反映了交易后资金池在Alice和Bob之间新的分配情况;
- C2a的#0输出需要A3和B的签名来解锁,其中A3是由Alice的钱包生成的新账号。
新合同双方签名确认后,Bob是否就可以放心地把IPhone X给Alice了呢?还不行!因为Alice可以在拿到手机后,将C1a和RD1a发布上链,这样,Alice又拿回了付出去了0.1BTC。为了防止Alice耍赖,需要同时废止老合同,方法就是要求Alice交出账号A2的私钥(见图7)。拿到A2的私钥,结合账号B的私钥,Bob便可构造BR1a(见图8),此TX将原本应由RD1a转给Alice的0.5BTC也转给Bob,即资金池中的所有比特币都将归Bob所有。由于BR1a可以立即上链,而RD1a最快也要等C1a上链再经过1000个区块才能上链,因此BR1a能赶在RD1a前生效,同时使后者失效;反过来,只要Alice不轻举妄动发布C1a,由于C1a是BR1a的TX爸爸,BR1a就无法生效。BR1a是Bob对Alice违反规则重用旧合同的反制措施。同理,Alice也可以此方法来反制Bob的违约行为。罪与罚,这是闪电网络的核心思想。当违规的成本大于守约时,所有人都会选择遵守规则。
由于Alice和Bob之间的交易只需要他们的钱包应用之间相互通信,没有任何TX需要上链(也就不需要为每个TX等待60分钟
),因此交易可以非常快的速度进行。
可是现实生活中,需要发生交易的人不计其数,总不能为了买个包子就邀请包子店老板一起开个资金池吧?这时就需要委托其他人替你交易,即使这些人是陌生人。
- 如何委托不信任的人办事?
图9与引言部分的图4相对应,是通过中介完成支付的过程,这一幕还是由我们的老朋友Alice和Bob主演,另外再介绍一位新朋友Cathy。背景介绍如下:Alice要支付0.1BTC给Cathy,Alice与Cathy之间没有建立微支付通道,而Alice与Bob以及Bob与Cathy之间是有的,因此Alice委托Bob来向Cathy支付这0.1BTC,并给Bob 0.01BTC作为酬劳。
为了证实是否Cathy本人收款,Alice的钱包应用发给Cathy的钱包应用一串数据R,Bob完成代付后,需出示R,Alice才会把Bob垫付的钱加上酬劳支付给他(见图9),口说无凭,因此Alice和Bob创建了一个智能合约,如图10所示。这个合约由一个前面介绍过的RMSC,和新事物HTLC(哈希时间锁合同)组成。
下面我们来解读这个复杂的合同,老办法,合同看一半,图11是从Alice的视角看到的部分,是不是立刻简单了很多:)。RMSC部分与上文介绍的直接支付一样,用以重新分配资金池中的资金。因为Alice需要支付0.11BTC给Bob(见图9,0.1BTC托Bob支付给Cathy,0.01BTC是给Bob的酬劳),因此资金被分为三份:一份是完成支付后Alice的余额0.39BTC(输出#0),一份是Bob原有资金0.5BTC(输出#1),最后一份0.11BTC输出给HTLC合同(输出#2)。请注意#2输出下面圆圈中有个IF的图标,这表示可以有多个方法解锁输出(以“OP_IF/OP_ELSE/OP_ENDIF”脚本语句实现
)。一是提供A1、B1的签名,对应HT1a。HT1a有一个时间锁定值(3 days,即432个区块周期
),表示3天后,Alice便可收回预备支付给Bob的0.11BTC。另一方法是提供A2、B2的签名,同时还需要提供R,使其哈希值等于预设的H(R);这对应着HED1a,表示:Bob提供R便可立即得到0.11BTC。最后请注意,RD2a和HTRD1a分别设置了1000区块的延迟(seq=1000
),延迟的作用是为了支持合同撤销(TX名称中的字幕"R"就是Revocable的缩写
)。
接着再来说说此合同的撤销。合同撤销发生在以下两种情形:1. Bob在规定时间内(3天
)提供了R,拿到0.11BTC;2. Bob没有在规定时间内提供R,Alice收回)0.11BTC。也就是说无论委托支付成功与否,这个合同都不会真正履行(也就是发布上链
),而是重新创建一份RMSC来约定资金池新的分配方式,从而继续保留支付通道以供下次交易使用。以RMSC来创建合同,请见图6、图7,不再赘述,下面介绍一下如何撤销这份委托支付合同。
从Alice这边来说,废弃合同需要Alice将Arsmc2、A1和A3的私钥交给Bob,Bob用它们构建三个反制TX:BR2a、HBR1a和HTBR1a,分别针对RD2a、HT1a和HTRD1a。BR2a和HTBR1a很好理解,一旦Alice想通过发布RD2a和HTRD1a上链来取回她的0.5BTC保证金时,Bob可以通过发布BR2a和HTBR1a来反制。HBR1a的作用需要解释一下。HBR1a存在的目的是为了防止Alice发布了C2a却故意不发布HT1a,如果Bob手上没有R,便无法拿走C2a #2输出的0.11BTC了。出于最大化惩罚力度的考虑,有必要构建HBR1a,这样就可以通过此TX拿走这0.11BTC了。守规矩大家都好,一动歪脑筋就拿走你所有,试问你怕不怕!!
闪电网络,解药还是毒药?
通过上述解读,相信你已能体会闪电网络设计之巧妙。闪电网络对“一钱多花”问题的解决比比特币的原始设计更好,同时交易速度及区块大小限制也很好的规避了。
然而,此方案问世后便面临巨大的争议,主要质疑是去中心化特性的损失:为了方便为任意两个账号之间寻找一条由微支付通道组成的路径,闪电网络会不可避免地演化出所有个人账号连接到少量中央账号的结构(见图2),这些中央账号在交易中起路由器的作用;这样的结构我们其实并不陌生,这就是目前的银行系统,而比特币试图颠覆的正是“万恶的”现行银行系统,这显然是一部分原教旨主义者无法接受的。当然,相比银行,闪电网络加持的比特币还是有明显优势。一则,不需要信任这些中央账号,因而任何人只要拥有足够的比特币资产与海量个人账号建立支付通道便能成为交易路由器,这不同于成立银行需要得到国家法律授权。另外,不用像担心银行破产一样担心自己的资产受损失。
即使抛开意识形态上的担忧,闪电网络实际应用还将面临两个主要问题。首先,闪电网络改变了比特币的安全模型,将更多职责加到了普通用户身上。用户除了需要保护好自己的私钥,还需要时刻注意已废弃的合同是否被发布到比特币网络,这就要求用户的终端保持在线,也增加了黑客攻击用户终端的可能和吸引力。其次,虽然闪电网络使得比特币理论上能支持无限大的交易速度,然而微支付通道的开启和关闭速度仍受限于比特币网络的原始机制,因而将成为新的瓶颈。一旦大量用户关闭通道,提取自己的比特币(譬如,受到最近比特币价格大幅跳水的影响
),便会引发类似银行挤兑的连锁反应,最终拖垮整个系统。
关于闪电网络更详细的优劣分析,请读者参考Lightning Network – Will it save or break Bitcoin?一文。此文最后一句话特别引人深思:比特币经常被称作“数字黄金”,然而正是由于金块携带不便、运输昂贵,才出现了金银票据系统,而后面发生的事情我们都看到了(注:银票 -> 纸币 -> 与黄金脱钩 -> 金融衍生 -> 通货膨胀&经济危机 -> 比特币???
)。