1. 引言
闪电网络可能是比特币之上部署的最受期待的技术创新。闪电网络,为由 Joseph Poon 和 Tadge Dryja 于2015年首次提出的支付层,承诺支持:
- 用户之间几乎无限数量的链下交易,
- 几乎免费,
- 同时利用比特币提供的安全性。
2016年时,至少三个公司——Poon 和 Dryja 的 Lightning、 Blockstream 和 Blockchain—— 目前正在致力于该技术的实施。但除了这个小型技术前沿之外,很少有人完全了解“小额支付的未来”将如何提升比特币的能力。
本文分3大块来介绍闪电网络协议
- 第一部分列出了闪电网络的基本构建块,并展示了如何将这些构建块组合起来创建“智能合约”,该合约可用于实现闪电网络的第一个要求:双向支付通道。
- 第二部分解释了双向支付渠道如何转变为网络,以及哈希时间锁合约(HTLC)如何将网络中的不同通道连接在一起。
- 第三部分解释了如何将 HTLC 放置在双向支付通道中,以确保交易可以完全在链下进行。
2. 闪电网络基本构建块
2.1 构建模块 #1:未确认的交易
从本质上讲,比特币协议由交易组成,这些交易通常与之前的交易相关联,也可能与未来的交易相关联。每笔交易都包含 输入(指比特币发送的地址) 和输出 (指比特币发送到的地址)。此外,输入必须包括发送比特币的要求,如证明输入地址“所有权”的签名。与此同时,输出建立了新的要求,这些要求必须包含在后续 交易的输入中 。
作为其主要功能之一,闪电网络是由或多或少的常规比特币交易构建的。只是这些交易通常实际上并不通过比特币网络广播。相反,它们存储在用户的本地节点上 - 但闪电网络交易可随时通过网络广播。
本文中:
- 黑色边框表示的是已确认交易
- 蓝色边框表示的是:仅当其前序交易已被确认后,可由Alice广播的交易
- 红色边框表示的是:仅当其前序交易已被确认后,可由Bob广播的交易
如上图中所示:
- Alice可随时签名并广播其未确认交易,并给Bob发送2个BTC
- 仅当Alice已签名并广播交易且得到确认之后,Bob才可以签署属于他的2个BTC,将其中一个BTC发送给Carol,另一个BTC留给Bob自己。
2.2 构建模块#2:双花保护
闪电网络的第二个构建模块可能不需要太多解释,因为它可以说 是比特币本身存在的理由 :双花保护。如果两笔交易(或:输入)依赖于相同的输出,则只有一笔交易可以确认。
这里要记住的重要一点是,即使是未经确认的交易也可能是冲突的,这意味着只有1笔交易可被确认。
如上图中所示:
- Alice必须选择其中一笔交易来签名并广播,无法同时签名和广播2笔交易(若同时,也只有一笔交易会被确认,即变成黑框表示)。
2.3 构建模块 #3:多重签名
闪电网络的第三个构建块也是一个简单的构建块:多重签名(multisig)地址。(或者更一般地说:P2SH 地址。)
多重签名地址是比特币地址,顾名思义,需要多个私钥才能“解锁”并从中花费比特币。多重签名地址可以在各种条件下设置。例如,需要三个可能的密钥中的两个,或者十五个中的十五个,或者几乎任何其他组合。
闪电网络通常使用2-of-2多重签名设置。从 2-of-2 多重签名地址解锁比特币需要来自两个专用密钥的两个签名。
如上图中所示:
- Alice和Bob之前设置了一个multisig地址,2人分别有一个密钥
- 若无Bob的签名,Alice没法自行花费该multisig地址
- 需注意,当某签名添加到某交易之后,无法修改该交易内容。
- 在密码学中,签名是交易和seal的混合,且是一长串独特的数字字串。
2.4 构建模块#4:时间锁
第四个组成部分是时间锁。时间锁可以在输出中“锁定比特币”,使它们仅在未来的某个时刻才可被花费(包含在后续输入中)。
有两种不同类型的时间锁:
- 绝对类型,称为 CheckLockTimeVerify (CLTV):CLTV 将比特币锁定到未来(或多或少)的具体时间:实际时间和日期,或特定的区块高度。
- 以及相对类型,称为 CheckSequenceVerify (CSV):CSV 使用相对时间。一旦 CVS 输出被记录在区块链上,从该 点开始需要一定数量的区块 才能再次被花费。【在闪电网络中,常将CSV表示为clock,用作delay】
2.5 构建块#5:哈希值和秘密
第五个也是最后一个构建块——密码学——是比特币本身最基本的构建块。但在闪电网络中,它以一种新的方式应用。
简而言之,“value”或“secret”是一长串独特的数字,即使对于具有无限尝试的计算机来说,实际上也无法猜测。通过特殊的计算,这个value(或secret)可以被“哈希”成不同的数字字符串,即“哈希值”。
诀窍是:
- 任何知道该value的人都可以轻松地重现哈希值。但反过来则不然。这是一条单行道。
这个技巧可用在比特币本身,再次“锁定比特币”。(事实上,这确实是比特币的工作原理。)如,哈希值可以包含在输出中,并要求后续输入包含相应的value才可被花费。
如上图中所示:
- 本文以带颜色的钥匙🔑来表示value或secret,相应的哈希值以相同颜色和相同数字的锁🔐来表示
2.6 第一个挑战:双向支付渠道
甚至在闪电网络出现之前, 支付渠道的概念 就已经存在了一段时间。典型的支付渠道对于某些目的很有用,但也有局限性:它们是单向的。Alice可以向Bob支付几笔链下交易,但Bob根本无法通过同一通道向Alice支付。
作为闪电网络的一个关键特征,Poon 和 Dryja 提出了无需信任的双向支付通道。
2.6.1 打开通道
要建立双向支付通道,双方必须首先就opening交易达成一致。此opening交易决定了各自存入通道的比特币数量。
假设Alice想向Bob发送一枚比特币。由于Alice和Bob希望更频繁地进行交易,因此他们决定开放一份双向支付通道,并用它来发送比特币。(发送一整个比特币对于支付渠道来说可能会很多,因为这对于小额支付可能更有用 - 但这是完全可能的。)
为了打开通道,Alice 和 Bob 各发送 5 个BTC到 2-of-2 多重签名地址。这就是“opening交易”。只有当Alice和Bob都签署后续交易时,才能从该地址花费比特币。
此外,Alice 和 Bob 都创建一个秘密(一串数字),并交换哈希值。
Alice 现在立即从opening交易中创建后续交易。这是“commitment交易”。通过commitment交易,Alice向自己发送了4个BTC,并向第二个多重签名地址发送了6个BTC。第二个多重签名地址有点奇怪。它可以由Bob自己解锁,但只有在它被包含在区块链上并开采了1000个额外的区块之后才能解锁;它包括一个 CSV 锁。 或者,它可以由 Alice 自己打开,但前提是她 还 包含 Bob 刚刚向她提供哈希值的秘密。(当然,Alice不知道这个秘密是什么——Alice只知道哈希值——所以Alice现在无法使用这个选项。)
Alice签署了其commitment交易,但不光播!相反,Alice将其签名后的commitment交易给了Bob。
与此同时,Bob也做了同样的事情,但是是镜像的。Bob还创建了一笔commitment交易,从中将 6 个比特币发送给自己,并将 4 个比特币发送到一个时髦的新多重签名地址。如果 Alice 再等待 1000 个区块,她就可以解锁该地址,或者 Bob 可以使用 Alice 的秘密来解锁该地址。
Bob签署了其创建的commitment交易,并将其创建并签名的commitment交易交给Alice。
在交换“half-valid” commitment交易和秘密哈希值之后,他们都签署并广播opening交易,以确保其记录在区块链上。该通道现已正式开通。
此时,Alice 和 Bob 都可以签署并广播他们从对方获得的半有效commitment交易。如果Alice这样做了,Bob会立即获得6个BTC。如果Bob这样做了,Alice会立即获得4个BTC。但无论谁签署并广播该交易,都必须等待 1000 个区块才能解锁后续的多重签名地址,并领取剩余的BTC。
然而,这是支付渠道的关键技巧:
- 既不签署也不广播自己的那份交易。
2.6.2 更新通道
过了一会儿,Bob想给Alice发回一个比特币。他们想要更新通道状态,使余额再次达到五比五。为了实现这一目标,Alice和Bob做了两件事:
- 首先,两者都重复上述过程(除了开仓交易已记录在区块链上;该部分被跳过)。这次,Alice和Bob都将5个BTC归为自己,并且都将5个BTC归为时髦的多重签名地址。这些多重签名地址的条件相似,只是它们需要 新的 秘密:Alice 和 Bob 都互相提供新的 哈希值。他们都签署了新的一半有效的commitment交易,并将其交给对方。
- 其次,Alice和Bob互相传递他们在 第一个 设置中所使用的 第一个 秘密。
此时,Alice 和 Bob 都可以签署并广播他们刚刚获得的新的“半有效”commitment交易。他们的交易对手将立即获得 5 个比特币,而广播方则必须等待 1000 个区块。因此,通道已更新。
但是是什么阻止Bob广播旧的commitment交易呢?该commitment交易导致了一条向他支付 6 个比特币的路径,而不是 5 个……。
当然,阻止Bob的是他的第一个秘密,他现在已经把这个秘密告诉了Alice。
Bob无法再安全地签署和广播旧的commitment交易,因为Alice现在知道Bob的第一个秘密。如果Bob要签署并广播该commitment交易,他将立即向Alice发送 4 个BTC……而他必须等待 1000 个区块才能领取自己的 6 个BTC。这是一个问题,因为现在Alice知道了他的秘密,Alice可以利用这段时间击败Bob,并夺取另外6个BTC!
由于Bob也拥有Alice的秘密,因此反之亦然。如果Alice尝试签署并广播旧的commitment交易,Bob可以窃取通道中的所有BTC。
这当然意味着Alice和Bob都有强烈的公平竞争动机,并且只签署和广播通道的最新状态。
3. 将双向支付通道扩展为支付网络
接下来,这种双向支付渠道设置需要扩展以允许通过网络进行支付。
Alice 和 Bob 建立了一个双向支付通道。现在,Alice想向第三人Carol支付1 BTC。
为此,Alice和Carol可以在他们之间开辟一条支付通道。但他们实际上并不需要这样做。事实证明,Bob 和 Carol 已经有一个双向通道,因此 Alice 可以通过 Bob 向 Carol 付款。
具体来说,Alice可以向Bob支付1 BTC,Bob可以向Carol支付1 BTC。
然而,Alice并不真正信任Bob——或者Carol:
- Alice担心如果她付钱给Bob,Bob永远不会真正付钱给Carol。
- 或者Bob可能会付钱给Carol,但Carol会声称她从未收到过这笔钱,而Alice不知道该责怪谁。
因此:
- 如果Bob也向Carol支付了1 BTC,Alice希望确保她只向Bob支付1 BTC。
这是通过简单的加密技巧(部分)完成的。
- 当Alice想要向Carol发送BTC时,她告诉Carol创建一个value(随机数字字符串)并向她发送哈希值。Alice还告诉Carol用原始value与Bob交换比特币。
- 与此同时,Alice从Carol那里拿到了哈希值,转向Bob,并告诉Bob,如果Bob向她提供相应的value(只有Carol有),她就会给Bob一个比特币。
- 因此,Bob转向Carol,并给了Carol 1BTC以换取value。
- 然后,Bob将这个value返回给Alice。Alice知道Bob一定是从Carol那里得到了value以换取BTC,因此得出结论Carol得到了她的BTC。所以Alice可以放心地给Bob 1BTC。
几乎每个人都很高兴。
在这种“天真的”场景中,中间人Bob仍然必须信任Alice和Carol:
- Bob必须相信Carol在向她发送了比特币后确实给了他value,
- 而Bob必须相信Alice在向她提供了value后确实给了他1 BTC。
因此,bitcoin -for-value trade必须在网络上得到绝对保证。更具体地说:如果Bob给Carol 1 BTC,他必须保证从Alice那里拿回1BTC。
这就是哈希时间锁定合约(HTLC)的用武之地。
3.1 Hash Time-Locked Contracts哈希时间锁定合约
所以Alice和Bob想通过HTLC完成bitcoin -for-value trade。(Bob和Carol也想以相同的value进行bitcoin -for-value trade- 但现在先不关注,后续会讲。)
为此,Alice 不是直接向 Bob 发送BTC,而是将BTC发送到一个新的(又是时髦的)多重签名地址。锁定在该地址上的BTC可以通过两种不同的方式解锁。
- 第一个选项是Bob包含他的签名和value。
- 第二种选择是Alice包含她自己的签名。然而,这个选项有一个CLTV 时间锁:Alice 只能在(比如)两周后签署并广播交易。
这意味着Bob有两周的时间来创建后续交易,其中包含他的签名和value,并将其广播以将比特币从时髦的多重签名地址发送给自己。因此,这笔交易是有保障的。Bob只有在提供value的情况下才能索取Alice的BTC:通过比特币网络广播它,使其公开可见,Alice可以看到。
如果Bob没有及时提供value,Alice可以通过“超时替代方案”取回她的比特币。简单的。
回到网络,因为这就是需要 HTLC 设置的真正原因。
如前所述,不仅 Alice 和 Bob,Bob 和 Carol 也建立了 HTLC。因此,如果Carol向Bob索要她的比特币,Bob将获得value作为回报;该value将在区块链上可见。
因此,如果发生这种情况,Bob也能从Alice那里得到比特币。Bob 可以获取 Carol 在区块链上公开显示的value,将其包含在他与 Alice 的 HTLC 中,并为自己索取BTC。两个通道有效衔接。
最后一个细节是,在Alice从Bob那里收回她的BTC之前,Bob必须从Carol那里获得value,这一点很重要。如果Bob在Alice收回其付款之后才从Carol那里获得value,那么Bob毕竟被困在中间。因此,Bob 和 Carol 的 HTLC 中的超时必须在 Alice 和 Bob 的 HTLC 中的超时到期之前到期。(如,正好十天之后,而不是两周。这也是 HTLC 需要 CheckLockTimeVerify (CLTV) 而不是 CheckSequenceVerify (CSV) 的原因。)
最后,还有一个问题需要解决:为了使闪电网络发挥作用,所有这些都必须在链下完成。
4. 闪电网络
到目前为止,Alice 和 Bob 开通了一个双向支付通道,他们都用 5 BTC为其提供资金。他们来回进行了两笔交易,在当前的通道状态下,Alice 和 Bob 都可以通过在区块链上“dropping删除通道”来为自己申领 5 BTC。
现在,他们希望在通道中包含 HTLC。这是为了确保如果Carol向Bob索要BTC以换取她的value,那么Bob也能从Alice那里得到比特币作为回报。
与上一步一样,Alice 和 Bob 首先创建一个新的commitment交易。在很多方面,这些commitment交易与之前的commitment交易非常相似,它们包括:
- 一个普通输出,
- 以及一个带有 CSV(CheckSequenceVerify)时间锁和特殊哈希锁的时髦多重签名地址的输出。
同样,与上一步一样,Alice 和 Bob 交换他们的旧秘密,以有效地使旧通道失效。而且,一旦交换,Alice和Bob都可以签署他们那份commitment交易,并可能随时将它们放到区块链上。
都是熟悉的领域。除了一处变化。Alice 和 Bob 的commitment交易现在都包含一项新输出,价值 1 BTC。(这使得余额为 4-5-1;Alice 为 4 个,Bob 为 5 个,新输出为 1 个。)
这个新输出本质上是 HTLC。它甚至比迄今为止的所有其他输出更时髦,因为有三种方法可以解锁HTLC输出:
-
1)首先,新的输出(在 Alice 和 Bob 的commitment交易中)会释放BTC,前提是 Bob 的签名和value包含在后续交易中。因此,无论 Alice 还是 Bob 签署并广播commitment交易,只有 Bob 可以解锁该输出——如果他包含该value。但这两个commitment交易之间有一个小区别:
- 如果 Bob drop删除通道,则会涉及 CSV 时间锁。他需要等待 1,000 个区块。(如果Alice放弃频道,Bob可以立即领取这1 BTC。)
-
2)如果 Bob 放弃通道,他必须等待 1,000 个区块的原因与之前看到的非常相似:它允许 Alice 拿走这1 BTC,以防 Bob 试图签署和广播旧的通道状态。这就是解锁输出的第二种方法的用武之地。如果Alice提供Bob的(最新)秘密,她就可以“窃取”资金。
两个人可以玩这个游戏:如果Alice试图欺骗并广播这个已经过时的通道,Bob可以使用Alice的秘密索取这个1 BTC。(他甚至不需要提供该value。) -
3)第三,与任何其他 HTLC 一样,两项commitment交易还包括 Alice 常见的 CLTV 超时回退。如果Bob在两周内没有包含该value(如因为他没有从Carol那里得到它),Alice可以收回她的BTC。同样,Alice 或 Bob 是否断开通道对于此选项并不重要。
那么这一切给带来了什么?
- Alice和Bob都持有半有效的承诺交易。如果Alice在区块链上放弃了她的commitment交易,她会立即向Bob发送5 BTC。此外,她还可以等待 1,000 个区块,并为自己领取 4 个比特币。另外,Bob 有两周时间提供value,并在“HTLC 输出”中领取BTC。(如果他在两周内没有提供value,Alice可以收回这个BTC。)
- 与此同时,Bob也可以随时放弃他的commitment交易,并立即向Alice发送4 BTC。然后,他需要等待 1,000 个区块才能从一个地址再索取 5 个比特币,如果他提供了该value,还可以从 HTLC 输出中索取另1 BTC。(如果他在两周内没有提供该value,Alice 可以收回这1 BTC。)
当然,如果Alice或Bob在未来的任何时候试图作弊,并在该通道过时时对其进行签名和广播,那么双方都可以完全阻止对方,并窃取该通道中的所有比特币。
4.1 Settling the Status
此时,Bob保证会收到BTC以换取该value(假设他拥有value)。他所要做的就是签署并广播他从 Alice 那里获得的commitment交易,将其价值包含在后续交易中,并签署并广播该交易。
Alice知道这一点。她不可能骗走Bob的BTC——即使她通过其他方式知道了该value。
因此,两人不妨在通道之外“settle”。Bob可以简单地将value交给Alice,Alice可以同意将通道状态更新到更正常的状态,而无需HTLC和超时期限。
假设双方都希望保持通道开放,那么他们自然会这么做:这比必须将通道放到区块链上要不那么麻烦得多。
4.2 通道关闭
最后,这是闪电网络的真正力量:
- 至此,以上描述的几乎所有内容通常都根本不需要访问比特币区块链。
如果 Alice 和 Bob 都想“和平”地关闭通道,他们可以简单地从原始opening交易中创建一个交易,以覆盖自opening交易以来发生的所有事情。从这次结束交易中,他们向自己发送了通道的公平份额——即表示最新的通道状态。
具体来说,这意味着如果Alice想要关闭通道,她此时可以简单地创建一个交易,向自己支付 4 个比特币,向Bob支付 6 个比特币,并要求Bob签署并广播该交易。既然他没有理由不这样做,那么他很可能会配合并关闭通道。
最终,只有两笔交易会通过比特币网络广播并包含在一个区块中:
- opening交易
- 和closing交易。
即使Alice和Bob之间交易一百万次,这也将成立,从而从区块链上卸下巨大的负担。
参考资料
[1] 2016年5月31日 Bitcoin Magzine博客UNDERSTANDING THE LIGHTNING NETWORK, PART 1: BUILDING A BIDIRECTIONAL BITCOIN PAYMENT CHANNEL
[2] 2016年6月7日 Bitcoin Magzine博客UNDERSTANDING THE LIGHTNING NETWORK, PART 2: CREATING THE NETWORK
[3] 2016年6月17日 Bitcoin Magzine博客UNDERSTANDING THE LIGHTNING NETWORK, PART 3: COMPLETING THE PUZZLE AND CLOSING THE CHANNEL