闪电网络
015年2月份,Joseph Poon和Thaddeus Dryja发布了“闪电网络”的草稿。当时,它仅是一份不完整的建议,并且没有代码,但却引起了比特币技术社区的极大关注,因为它构想了一个近乎实时的多方之间的比特币交易。其基本思路是交易双方建立一个新的支付渠道(或叫交易链),支付渠道中的所有交易只有最后一笔需要真实进入比特币区块链。
被认为是比特币创立以来最重要的革新。它利用了比特币的安全特性,在线下提供高速的实时交易处理能力。用户既可通过点对点的直接支付方式,也可以通过网络路由的方式实现间接支付。闪电网络并没有发明新的加密形式,也没有使用新奇的比特币脚本,却巧妙地实现了离线支付的功能。目前闪电网络还在实现阶段,相信不久将进入实用阶段。在其他加密货币(如以太币)系统中,也按照类似的原理实现了离线支付方案,如雷电网络(Raiden Network)。
在闪电网络提出之前,支付通道(Payment Channel)的概念就已经出现。支付通道可以实现某些特定场合的离线交易,但仅仅支持单向支付,有点像预付费的购物卡,只能不断地把钱从用户转向商户。闪电网络对支付通道进行了扩展,实现了无需信任第三方的双向支付通道。 双向支付通道可由参与的双方共同发起一个交易来创建,实质上就是双方往一个多重签名(multisig)地址存入一定数量的比特币。假定Alice打算给Bob发送1个比特币,Alice可直接在比特币的网络上广播一个交易,从Alice的地址转向Bob的地址。但是考虑到两人经常有来往交易,他们决定向同一个地址X各转入3个比特币,X拥有6个比特币的未花费输出(UTXO)。由于该地址是2分之2(2-of-2)的多重签名地址,因此需要两人同时签名才可以使用地址中的比特币。这个交易称为支付通道的“首次交易”(opening transaction),如图10-1所示。在向比特币网络广播“首次交易”之前,Alice和Bob各自确定一个随机数作为密码(secret),然后对密码进行哈希运算,把哈希值(hash)告诉对方(密码各自保留)。在后面可以看到,这个哈希值和密码还可以用来取消过期的离线交易。
Alice在上述交易中签名,由于输入地址X需要多重签名,这个交易还需要Bob的签名才能生效。Alice把这个缺少Bob签名的不完整交易线下发给Bob(即不通过比特币网络),这点正是闪电网络设计精妙之处:Bob可随时在不完整交易中签名,然后广播到比特币网络上去确认记账,也就是说,Bob任何时候能够确保自己获得4个比特币(需要等待1000个出块时间),而Alice可即时得到2个比特币。当然,Bob广播这个交易的同时,地址X的余额被用完,支付通道也就自动关闭了(相当于清算了两人的账目)。这里看到,闪电网络不鼓励关闭通道,发起关闭交易的一方,会比对方晚些获得比特币。 在Alice发给Bob不完整交易的同时,Bob也给Alice发送类似的不完整交易。不同的是,Bob的交易是给自己4个比特币,将2个比特币发给另一个多重签名地址Z,如图10-3所示。同样,Alice可以从地址Z中拿走2个比特币(需等待1000个出块时间),或Bob可拿走Z中的2个比特币(如果他知道Alice的密码)。
在Alice和Bob交换了不完整交易以及密码的哈希值之后,他们共同签名的首次交易就可以广播到比特币网络上去确认,支付通道正式打开。上面已经提到,任何一方都可以从通道中退出并结算比特币余额,但是发起方会比另一方晚得到比特币。在不需要结算的时候,他们各自保存对方发来的不完整交易。
过了一段时间,当Bob希望给Alice发送一个比特币这时候,他们可以在线下完成这笔交易,具体操作和上节的承诺交易一样。Alice发给Bob一个不完整交易,给自己3个比特币,给Bob 3个比特币;Bob也同样发给Alice一个类似的不完整交易,给自己3个比特币,给Alice 3个比特币。和上次不同的是,Alice和Bob各自要使用新的密码,并和对方交换新密码的哈希值。这样操作之后,通道中Alice和Bob的比特币数目将从2∶4更新为3∶3,实现了BoB转1个比特币给Alice的交易。 此刻,Alice和Bob各持有对方的2个不完整交易,为了防止任何一方广播已经过期的交易,闪电网络在更新支付通道余额的时候,要求双方把上一轮交易中各自的密码发给对方,这实际上等同于作废了上一轮交易中双方持有的不完整交易。例如,Bob如果把旧的交易签名发到比特币网络上(因为对Bob更有利),Alice可立刻得到2个比特币,Bob需要等待1000个出块时间才能拿到自己的4个比特币。可是在Bob等待之时,Alice可用Bob的密码立刻取走Bob的4个比特币!所以,Bob不会发布过期的旧交易。同理,Alice也不会发布过期的旧交易,两人都会尽可能地按照规则来办事。
支付通道解决了两个用户在线下直接交易的问题。但如果两个用户之间没有建立支付通道,他们怎样交易呢?闪电网络设计了一种中间人方案:若Alice希望发送1个比特币给Carol,她们之间没有直接的支付通道,但她们分别和Bob有支付通道,于是可以通过Bob作为中间人来支付。Alice把1个比特币给Bob,Bob再把1个比特币给Carole。 这种支付方法比较容易理解,在实施中需要解决各方间无信任的问题,例如,Bob需要确保他支付1个比特币给Carol后,会收到Alice发来的1个比特币。闪电网络采用了HTLC(Hashed Timelocked Contract,哈希时间锁合约),来保证交易能够畅通进行。 在HTLC中,Alice不会直接发送1个比特币给Bob,而是发送1个比特币给一个多重签名地址Q,如图10-4所示。地址Q有两种解锁方式:用Bob的签名加上其他人设置的一个密码;或者Alice用本人签名解锁,但需要等待一段时间,例如30天。这样的方式相当于在30天内,Bob如果得到密码,就可以用签名拿走地址Q中的1个比特币;如果Bob在30天内没有提供密码,被认为超时(timeout),Alice可以从地址Q中拿回自己的1个比特币。 同样的,Bob和Carol也设立这样的HTLC,并且满足两个要求:采用和Alice-Bob的HTLC相同的密码,以及稍短一些的超时设置,如29天。Bob-Carol的HTLC超时要比Alice-Bob的HTLC要早,目的是确保在Bob支付了Carol之后,可以从Alice取回相应的比特币,而不是因超时Alice取回比特币。因此,在HTLC中,采用了CLTV(CheckLockTimeVerify)锁,来确保在未来特定时间点(如某个区块高度)超时解锁。 从Alice到Carol的整个支付过程如图10-5所示。首先Carol随机生成一个密码R,再把R进行哈希运算后得到H(R),然后将H(R)发送给Alice。Alice用哈希值H(R)作为CLTV锁,创建和Bob的HTLC合同,包含1个比特币,有效期30天。Bob用同样的H(R)哈希值打开一个和Carol的HTLC合同,也包含一个比特币,有效期29天。 在29天内,Carol可以提供密码R,来解锁Bob的HTLC,从而得到1个比特币。Bob也看到了密码R,他可用R去解锁Alice的HTLC,也得到了1个比特币,这样就完成了从Alice到Carol的支付如果在29天内Carol没有拿走比特币,因为Bob的HTLC已经超时,Bob可以取回自己的比特币;因为Bob没有Carol的密码R,无法取走Alice的HTLC中的比特币,Alice等到第30天,也能取回自己的比特币
闪电网络还可以通过多个中间节点实现转账,像互联网的多节点路由一样,只要两个用户之间存在一条通路,就可以按照上述原理进行支付。 Alice或Bob两人都可随时把最新的不完整交易签名后发布的网络上,从而关闭支付通道,发起关闭的一方需要等待较多的时间才能拿到自己的比特币。当然,双方也可以协商共同发布一个正常的交易,按照大家认可的余额比例来转移首次交易中的输出,双方都无须等待时间,离线的所有不完整交易也同时作废。
闪电网络实现了在离线环境下提供比特币交易的方式,在支付通道打开后,参与方可离线发生任意数量的交易,而无须广播到比特币的网络上,从而大大提高了交易速度,也减轻了比特币网络的压力,这将成为比特币很重要的功能。目前,闪电网络依赖的一些必要的软件升级,如隔离见证(Segwit)等已经基本就绪,闪电网络本身的实现也即将完成,相信不久将进入使用阶段。