闪电网络交易细节流程

Catalogue
  1. 1. 多重签名技术
  2. 2. 哈希时间锁定
  3. 3. 哈希密钥锁定
  4. 4. 闪电网络交易过程白话版
  5. 5. 双方支付通道的技术细节过程
  6. 6. 通过路由节点实现转账
  7. 7. 参考资料

作为铺垫,需要讲解以下三个概念

多重签名技术

多重签名技术(multisig)是多个用户同时对一个数字资产进行签名。可以简单地理解为,一个账户多个人拥有签名权和支付权。如果一个地址只能由一个私钥签名和支付,表现形式就是 1/1;而多重签名的表现形式是 m/n,也就是说一共 n 个私钥可以给一个账户签名,而当 m 个地址签名时,就可以支付一笔交易。例如,多重签名 2/3,表示 3 个人拥有签名权,而两个人签名就可以支付这个账户里的比特币;多重签名 1/2,表示 2 个人拥有签名权,谁都可以单独来支配这笔资金。

哈希时间锁定

这是在交易脚本里面设置时钟,必须要等设定时间之后,才能用地址的私钥签名解锁地址里的比特币。例如 Alice 收到了一笔 2 BTC 转账,但是对方设定了 1000 个区块之后才能解锁,所以 Alice 必须等待 1000 个区块之后才能用自己的私钥签署交易 , 花费其中的 BTC 转给 Bob。

哈希密钥锁定

哈希函数可以把一串输入转换成 256 位固定长度的输出,计算过程称为一次哈希运算,其中输入称为密文,输出称为密文的哈希值。哈希函数具有单向性,即从密文可以算出哈希值,但是从哈希值反向算出密文几乎是不可行的。计算的办法是暴力破解,逐一输入密文进行哈希运算,验证运算结果是否为要求的哈希值。基于这种特性,可以把一个密文的哈希值放入交易的输出当中充当哈希密文锁,也就是必须得输入该哈希值对应的密文才能解锁脚本中的比特币。例如,例如 Alice 收到了一笔 2BTC 转账,但是对方设定了哈希值锁定,所以 Alice 必须得到交易方的密文,同时配合自己的密钥签名才能签署交易,花费其中的 BTC 转给 Bob。

有了这些工具,让我们看看那群程序员天才们是如何构想出一个程序,使得互不相识的双方能够诚实记账的。

闪电网络交易过程白话版

闪电网络想要解决的是比特币扩容、交易即时确认和手续费高的问题。举个例子来说明闪电网络整体思路,设想我们的老朋友 Alice 要给 Bob 转 1 个比特币,她该怎么做呢?

传统做法是 Alice 可以挑选出其未花费的输出用对应私钥签名,并向比特币网络广播,矿工验证打包,一般来说 6 个区块之后即可确认交易。这个过程很慢,需要等待一个小时左右,并且还要支付给矿工的手续费。于是呢,天才的程序员们碰撞出了闪电网络的解决方案。

理解闪电网络主要分为两步,一是理解双向支付通道,二是诸多通道扩展成闪电网络。

操作过程是这样的,Alice 和 Bob 先各自把 5 个 BTC 转给一个由两人共同控制的多重签名地址。这笔交易和比特币网络上其他普通交易没什么太大区别,只是转出的地址是一个多签地址。这个过程称为开启通道。

开启通道后,这个多签地址里面就拥有 10 个比特币,这是被区块链记录了的,全网承认。接下来就是 Alice 和 Bob 私底下的交易了,不广播,不记在链上,正因如此,交易确认速度快,几乎零手续费(其实可能还有较低的路由费,后文会讲),这个过程称为链外交易,在交易通道(channel)中进行。

什么是通道?怎么在通道进行交易呢?它安全吗?

简单来说,Alice 和 Bob 都会在各自的小本本上记账,他们都知道对方怎么记的,且有密码学设计保证谁也不能多记耍赖。这当然也是由闪电协议精巧的设计保证的,后文再讲技术细节。

那么我们就可以想象出这样一个通道:在这个通道中,一开始 Alice 和 Bob 各有有 5 个,如果第一笔记Alice 有 4 个,Bob 有 6 个,这就相当于 Alice 给 Bob 转了 1 个比特币。如果,过了几天,Alice 又要向 Bob 支付 2 个比特币,那么他俩会再记一次账,这次记Alice 有 2 个,Bob 有 8 个,同时上次记的Alice 有 4 个,Bob 有 6 个在两人共同确认后作废,也就是说,本次记账后,Alice 只有 2 个比特币,她不能再拿出旧账单说Alice 有 4 个,Bob 有 6 个。

注意,在通道关闭之前,这 10 个比特币只能在 Alice 和 Bob 之间使用。也就是说,在不关闭通道的情况下,主网只知道多签地址有 10 个比特币,并不知道 Bob 已经拥有了其中的 8 个比特币,这就是所谓“双向支付通道”。

之后 Alice 和 Bob 就可以在通道里过上你来我往的相互转账的愉快生活,远离主链的拥堵与高费用。这就好比俩人结婚了,夫妻们想要私下结算,只要俩人同意,想怎么算就怎么算。

天有不测风云,突然有一天,Alice 不想和 Bob 这么转来转去了,想取出自己在通道里的钱去外面的花花世界潇洒快活。那么就需要关闭通道了,常有两种方式,一是协议离婚,这种方式很和平,双方共同从最开始的多签地址签名发起一笔交易分别转到两人各自控制的地址对应数额的比特币,同时将之前记在小本本上的所有旧账一笔勾销。二是起诉离婚,Alice 想离而 Bob 不想离,这时 Alice 可以单方面强制关闭通道,将小本本最后一笔交易广播出去,只要矿工验证并打包进区块,这婚也算离了,代价是 Alice 并不能立马得到比特币,需要等待一定时间。

本着劝和不劝分的原则,闪电协议设置了哈希时间锁定合约,单方面强制离婚(关闭交易通道)会受到延迟收到退款的惩罚,这是为了保证双方交易的稳定。

以上最后一个过程是通道关闭。注意,不管是协议离婚还是起诉离婚,这都是要法院受理登记的。关闭通道一定要发起交易并广播到主网,最后矿工记录,所以还是要忍耐一定确认时间和支付手续费的,这与闪电网络无关。

至此我们已经知道了 Alice 和 Bob 链下互相转账的那点事儿了,这就是所谓“双向支付通道”。开启通道需要在主链交易,这是锁定资金,关闭通道也需要在主链交易,这是释放资金。中间可以进行任意多次转账支付,是 0 确认 0 手续费的。

新问题来了,世界上除了这两位,还有 Carol、Eric、Diana 等等。设想 Alice 想转给 Carol一个 BTC, 她该怎么办呢?自然地,她俩可以再重复上述操作建立一个双向通道。但是,如果我们为了应用闪电网络,需要世界上每两个人之间都建立一条通道,这将是非常大的工作量且不切实际的。为了解决这一问题,我们需要将双向支付通道扩展成闪电网络。

假如 Bob 和 Carol 之间已经建立了支付通道,而 Alice 和 Bob 之间也有支付通道,那么 Alice 可以先把钱转给 Bob 再由他转给 Carol,即 Bob 充当了支付的中间人,在网络里他就是一个路由节点。

当很多的节点相互建立通道,最后就会形成闪电网络。

双方支付通道的技术细节过程

关于通道的三个步骤:开启通道,通道内交易,关闭通道。

开启通道较为简单,Alice 和 Bob 分别向多签地址1转入 5 个 BTC。这是一个 2/2 地址,也就是必须两人都签名,此地址的比特币才可以转出去。

接下来是通道内交易,我们需要讲解 Alice 和 Bob 之间的两次交易才能完全明白双向支付通道的巧妙之处。第一次 Alice 需要向 Bob 支付 1 个 BTC,第二次 Bob 需要向 Alice 支付 1 个比特币。

Bob 在构建交易时需要通过闪电网络软件的通信模块和 Alice 建立联系,获得 Alice 创建的密文的哈希值,然后把这个哈希值作为哈希锁放在自己构建的交易里。这笔交易 Bob 把 10 个比特币分别转给 Bob 控制的普通地址 6 个和另一个“多签地址 2”4 个 BTC。通俗来讲,就是 A 和 B 的财产放在一起,但是 B 主动从 A 那里要了一把锁把 A 的财产锁住了,没有 A 的钥匙 B 也无法打开。

多签地址 2 是一个 1/2 地址,也就是两个条件有一个满足即可解锁。具体来说,需要 Bob 用自己的私钥和 Alice 的密文(此时 Bob 只有密文的哈希值,并不知道密文,所以 Bob 是不可能获得这 6 个比特币的)同时来解锁;或者 Alice 等待 1000 个区块后用私钥来解锁。这两个条件是双向支付通道的精髓所在。

Bob 构建完交易后会签名,然后把这笔未完成的交易以点对点方式发送给 Alice,而不是广播到全网。显然,上述交易是对 Bob 有利的,一旦 Alice 签名并广播,Bob 可以立即获得 6 个比特币,而 Alice 需要等到 1000 个区块之后才能拥有 4 个比特币。

这也就是上文提到的单方面“起诉离婚”会受到延时惩罚的技术实现细节。然而,这笔对 Bob 有利的交易的主动控制权却掌握在 Alice 手里,因为 Alice 不签名并不广播的话,这笔交易暂时不会生效的。

在 Bob 创建这笔对自己有利的交易同时,Alice 也创建了类似的一笔对自己有利的交易,两者是一种镜像。

这个过程相当于是 Alice 帮 Bob 在他的小本本上记了一笔账,这 10 个比特币 Bob 占 6 个,Alice 占 4 个,同理 Bob 也帮 Alice 记账了。具体来说,就是 Alice 电脑里保存着 Bob 创建并签名的未完成交易,Bob 保存着 Alice 创建并签名的未完成交易。两者合在一起,就完成了他们之间第一笔交易的记账过程。

这个过程并不需要互相信任,只需双方同时在线,建立联系并交换哈希值,再在各自的电脑里创建交易最后发送给对方。整个过程不需要经主链由矿工打包确认,所以非常快速并且没有手续费。也可以看到,任何一方都可以随时强制关闭通道,将自己占主动权的交易签名并广播全网,代价是 1000 区块延时。

但是这里仍然有一个问题,就是外界无法知道通道内的交易次序,因此无法鉴别通道关闭后广播出去的交易,是否为最终交易。例如,如果双方在这个通道里不断发生交易,最后导致 Alice 手中有 9 个,Bob 手里有 1 个,但假设最后 Bob 强制关闭交易通道,并广播出去 Alice 有 5 个,Bob 有 5 个,Bob 便能凭空赚得 4 个。(虽然这 4 个要等到 1000 个区块后才能获得,但这是值得的。)该怎么解决这个问题呢?

这次我们就要再次用到上文提到的哈希密钥锁了。

现在我们考虑过了两天,Bob 要向 Alice 转 1 个 BTC,即双方发生第二笔交易 B。类似他们仿照上述第一笔交易操作进行第二次记账,此时应当是 Alice 5 个,Bob 5 个。

一个最大的区别是建立第二笔交易 B 之前,两人会相互交换第一笔交易中的密文,即对方第一把锁的钥匙。

这么做的目的在于作废第一笔交易记录 A,使得两人都只能承认最新的交易记录 B 有效。

设想 Bob 在第一笔记录中拥有 6 个比特币,而第二笔记录变成了 5 个,那么如果他想作弊去签名并广播第一条记录呢?

结果是他将失去通道内所有的比特币!

因为 Bob 签名并广播了下图交易之后,Alice 立马会获得 4 个 BTC,同时 Bob 则必须等待 1000 个区块之后才能解锁 6 个 BTC。然而,由于此时 Alice 已经获得了密文即钥匙 1,所以 Alice 可以赶在 Bob 之前解锁这 6 个 BTC。综合来看,只要 Bob 想要广播旧交易记录,他就会一无所有。

有了能作废旧账的保证,双方就可以在通道内反复任意多次交易,每次交易之后的状态都是资金池资金的划分比例的最新确认状态。

最后,关闭通道。如本文第二部分所讲,有两种方式关闭通道,一是单方面强制关闭,即某一方将自己控制的最新交易签名后广播出去即可。二是商议后关闭,此时双方再从最开始的多签地址构建一笔交易。

至此,我们明白了如何在无信任的条件下如何建立双向支付通道。

通过路由节点实现转账

同样的,在建立闪电网络的时候,我们同样会遇到信任问题:Alice 想转给 Carol
1 个 BTC,需要经过 Bob,但 Bob 会担心自己给 Carol 转 1BTC 后,Alice 耍赖;同样 Alice 会担心如果先给 Bob 转了 1BTC,Bob 也耍赖不转给 Alice。在传统的金融系统中,是由大型知名金融中介机构的信用提供保证的。但闪电网络中,并没有这样一个独立于交易者的第三方去提供信用担保。

闪电网络采用了一种 HTLC(哈希时间锁定合约) 完美解决了这个问题。

过程是这样的,第一,Carol 会选择一个随机密文并运算得到其哈希值,再将此哈希值交给 Alice。第二,Alice 拿到哈希值后,会构建一笔转账给 Bob 的交易。这笔交易需要 Bob 拿到 Carol 的密文才能解锁,如果 Bob 在限定的时间内没有解锁成功,这笔钱则退回给 Alice。第三,Bob 从 Alice 处拿到哈希值(该哈希值就是Carol密文生成的哈希值),他也构建一笔转账给 Carol 的交易。第四, Carol 提供密文给Bob,并从 Bob构造的交易中获得 1 个 BTC,Bob 立马会拿该密文从 Alice 构造的交易中获得 1 个 BTC,这就完成了从 Alice 给 Carol 转账的任务。

上述过程可以看作一个智能合约。故事类似于这样:A 想经过 B 转账给 C,那么 C 先给 A 一把锁,C 有钥匙 A 有钱。A 跟 B 说,你从 C 那里拿到了钥匙,我的钱就是你的了。B 就拿着锁去找 C,B用自己的钱跟 C 换钥匙,然后拿钥匙去换 A 的钱。如此一来,就实现了钱和锁从 A 到 B 再到 C,钥匙从 C 到 B 再到 A 的一个流转。

当然,在实际操作过程中,Alice 给 Bob 转账金额需要大于 1 个 BTC,支付必要的路由费以激励 Bob 充当路由节点。其次,要注意两笔交易之间的哈希时间长度设置,第二步时间必须长于第三步时间。如果 Bob 在 Alice 关闭交易之后拿到 Carol 的钥匙,他将无法找 Alice 拿回 1 个 BTC。

参考资料