闪电网络:去中心化链下技术方案,解决比特币交易难题

2024-08-05
来源:网络整理

闪电网络是一种去中心化的链下技术解决方案,每秒可以支持数万笔交易,接近 Visa 系统所能达到的水平(举例来说)。比特币的区块链每秒只能处理约 7 笔交易,而且需要高额的交易费和漫长的等待时间来确认交易。这些因素使得发送小额交易几乎不可能。闪电网络解决了这两个问题。

介绍

闪电网络是一个支付通道系统,和常见的多重签名钱包没什么区别。要开通一个通道,参与者要创建一个多重签名钱包,并向其中存入资金,这个钱包收到的资金额就成为该通道的余额。此后,参与者之间所有后续交易都将在区块链环境之外进行。任何参与者都可以随时关闭该通道,此时最后一笔链下交易(决定了通道中参与者的余额)被发送到区块链,使所有中间交易无效,因为它们都使用相同的交易输出。因此,我们只需要一笔交易就可以开通通道,而用一笔交易来关闭通道,所有中间交易都是即时发送和接收的,而不会被记录在区块链上(因此无需等待)。

(译者注:比特币不是一个账户里的余额,而是一张支票;所有的支票都由特定的交易创建;每张支票只能使用一次,之后就失效了(即只能在一次交易中使用)。交易可以任意分配所用支票的价值,以产生任意数量的新支票。

此类渠道网络允许您向网络中的另一个参与者发送资金,即使你们之间没有直接的渠道。唯一的条件是你们之间必须有一条“路径”,即可以来回的通道。此外,得益于特殊的智能合约(HTLC,哈希时间锁定合约),您无需信任网络中的任何人,合约将保证您支付的资金安全交付。

要了解闪电网络的工作原理,首先需要了解支付渠道的运作方式以及构成支付渠道基础的 HTLC。这些主题并不小,所以我将文章分为两部分,首先解释支付渠道的工作原理。

付款渠道

如上所述,连接两个参与者的支付通道本质上是一个普通的多重签名钱包。第一笔交易决定了一个通道的余额,我们称之为“充值交易”或“锚定交易”。这笔交易需要广播到网络并记录在区块链上,以表明该通道已打开。

此步骤之后,要更新通道中双方的余额,双方需要手动交换已签名的“承诺交易”。这些交易本身是有效的,可以随时发送到比特币网络,但双方都会暂时保存它们。这样,通道中双方的余额状态每秒可以发生数千次变化,更新速度仅受限于双方创建、签名和向对方发送已承诺交易的速度。

每次双方交换新的承诺交易时,他们也会使通道的先前状态无效;因此,只有最新的承诺交易才能被“执行”。这种设计的目的是防止一方欺骗另一方。将过时但有益的状态发送到链上以关闭通道。下面我将解释几种防止这种欺诈的机制。

最后,可以通过双方协商关闭通道——向比特币网络发送关闭交易(称为“结算交易”)——或单方面决定向网络发送最终承诺交易。这是为了防止一方离线而另一方在通道中的余额被永久“锁定”的情况。

在通道的整个生命周期中,只有两笔交易被发送到比特币网络并记录在比特币区块链上(充值交易和结算交易),在这两笔交易之间,双方可以交换无数笔交易,而这些交易不需要提交到区块链上。

一个简单的支付渠道示例

在解释更复杂的机制之前,我们先考虑一个简单的单向渠道示例。为了简化解释,我们假设双方都是诚实的。稍后我们将考虑有助于我们防止欺诈的机制。

假设一个频道有两个参与者,分别是 Emma 和 Emma。Emma 提供付费视频流服务,观看者使用该频道进行小额支付——每秒观看 0.036 BTC,相当于每小时 0.036 BTC。A 是想要观看视频的普通用户。

Emma 和比特币使用一个特殊的程序来同步视频播放和支付渠道。Emma 在她的网络浏览器中启动这个程序,并在她的服务器上使用同一个程序。这个程序具有与普通比特币钱包软件相同的所有功能,它可以创建和签署交易。支付渠道的整个机制可以完全隐藏,用户只看到视频按秒计价的事实。

现在我们来看看这个付费服务的具体工作流程。一开始,Emma 想要打开一个通道:建立一个 2-2 的多重签名地址。从用户的角度来看,这个程序会创建一个 P2SH 地址(一个多重签名钱包),并要求用户充值足够的资金来支付一小时的视频服务费用。Emma 向这个地址转了 0.036 BTC,这笔交易就成了所谓的充值交易。

存款交易被打包成区块后,通道打开,视频开始播放。在第一秒,用户创建并签署承诺交易,改变通道中的余额:现在有 0. BTC,Emma 还剩下 0. BTC。这笔交易使用充值交易的输出,并创建了两个输出,它们的含义与这里描述的相同。从服务提供者的角度来看,程序收到了这笔交易,因此它也会对其进行签名,并将其与视频的第一秒一起发回给 Emma。现在双方都有了对方手动签名的、反映通道最新状态的承诺交易;如果需要,任何一方都可以将此交易发送到比特币网络。

第二秒,Emma的程序又创建了一笔新的承诺交易,使用与充值交易相同的输出(与第一笔相同)。这次,承诺交易的第一笔输出是0.BTC,给了Emma 0.BTC。这笔交易用于支付第二秒的视频下载费用。

我们假设 Emma 观看了 10 分钟的视频,然后退出。在这段时间里,她签署并发送了 600 笔承诺交易(600 秒的视频)。最后一笔交易有两个输出:0.03 BTC 给 Emma,0.006。Emma 关闭了通道,并将最后一笔承诺交易作为结算交易广播到比特币网络。这样,区块链上只记录了该通道的第一笔和最后一笔交易。

无需信任的渠道

当然,在这个例子中一切看起来都很好,但这是因为双方都是诚实的。不难想象,在某个时候,一方会欺骗另一方,而像上面这样的简单设计可能还不够。

时间锁

解决这些问题的一个方法是在承诺交易中使用时间锁(交易级时间锁())。为了确保资金不会永远锁定在通道中,Emma 使用她的存款交易的输出创建了退款交易。她首先发送交易,在交易签名并发回后,Emma 将充值交易广播到比特币网络并打开他们的通道。

这笔退款交易也成为第一笔承诺交易,其时间锁为通道的存在设置了一个上限。假设 Emma 将时间锁设置为 30 天(4320 个比特币区块)(即 30 天后,交易才可以记录在区块链上)。对于后续所有已提交的交易,设置的时间锁将逐一缩短,以便更新的交易可以更早地广播到网络。

通道费用_支付通道费_通道费的利与弊

现在Emma不用再担心了,她知道就算自己消失了,30天之后也可以拿回自己的资金(如果这是一个双向支付渠道,也就是钱都会存入里面,那么他也从自己的角度提出了退款交易)。

每一笔新提交的交易的时间锁都比前一笔交易的时间锁短,因此总有一笔新提交的交易能比旧交易更早上链,让旧交易无效(无法上链),这样可以防止任何一方恶意使用旧的承诺交易。如果一切顺利,Emma 只需要广播双方同意的正常结算交易,因此带时间锁的承诺交易只有在一方离线时才会派上用场。

例如第一笔承诺交易的时间锁是4320个区块,那么第二笔承诺交易的时间锁就可以设置为4319个区块,以此类推。这样,第600笔承诺交易就可以设置为比第一笔承诺交易晚4320个区块,已承诺交易早600个区块上链。

你可能已经注意到,虽然这种方法有助于防止一方在链上做出较早的承诺(欺诈),但它有两个显著的​​缺点:

因此,时间锁使我们能够使旧的承诺交易作废,并保证一个通道中的双方可以安全地关闭该通道:如果他们双方都同意该通道的最新状态,则可以发送一笔没有时间锁的结算交易(与上一笔承诺交易含义相同),关闭该通道;如果一方不在线,另一方也可以等待上一笔承诺的时间锁解锁,然后将这笔承诺交易广播到比特币网络。

不对称可撤销承诺

解决上述信任问题的另一种方法是取消较早提交的交易。其实“()”这个词并不准确,因为在比特币网络中,链上的交易(由区块确认)可以通过特殊的构造方法使链上较早提交的交易无利可图。你需要做的就是给每一方一个“撤销密钥”。

假设并决定开通一个通道。双方各存入 5 BTC 到通道中,确定通道的初始余额。现在,双方不再签署相同的标准承诺交易,而是创建两个不同的、不对称的承诺交易。

签名的交易有两个输出,第一个输出没有时间锁,立即支付 5 BTC,而第二个输出有时间锁,支付 5 BTC 但需要等待(此交易必须在 1000 个区块(链后)后才能使用该输出)。具体如下:

Input: 2-of-2 funding output, signed by Irene ​ Output 0 <5 bitcoin>: <Irene’s Public Key> CHECKSIG ​ Output 1: <1000 blocks> CHECKSEQUENCEVERIFY DROP <Hitesh’s Public Key> CHECKSIG

同时还可以得到一个经过签名的承诺交易,有两个输出:一个立即支付5BTC,另一个支付5BTC,但是要等1000个区块才可以花掉。

Input: 2-of-2 funding output, signed by Hitesh ​ Output 0 <5 bitcoin>: <Hitesh’s Public Key> CHECKSIG ​ Output 1: <1000 blocks> CHECKSEQUENCEVERIFY DROP <Irene’s Public Key> CHECKSIG

因此,双方都收到了对方签名的承诺交易,双方可以在任何时候签署并广播承诺交易,但是一旦这样做,对方就会立即得到钱,而自己只能等到 1000 个,但这还不足以保持双方的诚实。

这将带来我们的最后一个功能,可撤销密钥,这意味着如果任何一方试图实施欺诈,另一方可以惩罚他们并让他们失去所有的钱。

如上所述,每笔承诺交易都有一个“延迟”的输出。让我们将这个输出稍微复杂一点:这个输出可以由等待了 1000 个区块的承诺交易的发送者使用,也可以由通道的另一方使用,如果他/她持有撤销密钥。当创建承诺交易并交出时,他的第二个输出可以由他/她自己(等待 1000 个区块)使用,也可以由其他人使用。如果撤销密钥被攻击者获得。

密钥将被保密,只有当客户端决定使用新的已提交交易更新通道状态时,才会发送给客户端。交易详情如下:

Input: 2-of-2 funding output, signed by Irene ​ Output 0 <5 bitcoin>: <Irene’s Public Key> CHECKSIG ​ Output 1 <5 bitcoin>: IF # Revocation penalty output <Revocation Public Key> ELSE <1000 blocks> CHECKSEQUENCEVERIFY DROP <Hitesh’s Public Key> ENDIF CHECKSIG

(译者注:看一下代码就会更清楚:第一个输出是立即支付5BTC;第二个输出是有条件的,你可以使用撤销密钥立即获得5BTC,也可以在1000个区块内使用撤销密钥获得5BTC,之后再用这个输出使用的私钥。注意这里的“IF...ELSE...”条件,它的含义和其他计算机编程中是一样的。

举个例子可能更容易理解,假设你想发送2BTC给某人,此时他们需要更新通道的状态,也就是创建一个新的承诺交易,双方创建一个非对称承诺交易,并且在签名之前需要把最后提交交易的撤销密钥交给对方,这样最后提交的交易就被“撤销”了,如果你想用通道最后的余额来结算,而你觉得更老的状态对你来说更有利,她可以尝试签名手中最后的承诺交易并广播到网络,但是这个承诺交易的撤销密钥已经暴露给她了; 如果他发现这笔承诺交易在链上,他有足够的1000个区块的时间可以把通道里的所有钱都取走(第一个输出立刻给他,第二个输出只要他提供撤销密钥就可以立刻使用)(是的,这个“取消”动作无法自动化,你得注意老的承诺交易是否发送到网络然后使用撤销密钥)。

因此,使用非对称可撤销承诺的渠道更加高效,因为它不限制渠道的寿命或可以发送的交易数量。

结论

这是我们第一篇文章的结尾。可能需要一些时间来消化它。你也可以在评论中提问。在下一篇文章中,我们将解释 HTLC 的功能并最终解释闪电网络是如何工作的。

关联

(超过)

原文链接:作者:翻译:阿建

本文最初发表于:

分享