Bupt3分享02— 状态通道和闪电网络

Hacker Dōjo Workshop:

资助金额:120 USDT

Bounty链接:状态通道和闪电网络 | Bounties | DoraHacks

创作者:北邮在读硕士 Syshems

本项目由Hacker Dōjo资助,文章转载请联系

Telegram: @DoraDojo0

WeChat: @HackerDojo0

闪电网络起源于比特币,中本聪在比特币 1.0 中提出了支付通道的想法(对交易池中的交易进行覆盖,矿工只打包最新的交易),并开始编写代码。几年后,比特币社区开始讨论如何扩容比特币,而闪电网络的目标是解决比特币扩容、交易即时确认和手续费高的问题。

我们可以简单地用打麻将来理解闪电网络:一桌子人打麻将,最开始用扑克牌计分,一张牌5毛钱,输的人**「支付」赢的人扑克牌。麻将打结束了,大家数一数手里的扑克牌,用现金进行「结算」**。

闪电网络也可以看作是两个人之间打麻将,最开始在链上质押本金,确保对方有能力支付,建立支付通道;之后在链下交换欠条,今天 A 要给 B 100 元,明天 B 要给 A 250 元;当双方中的一方用完押金,或想要结算欠条时,只需要将链下的最新的「欠条」发布到链上即可完成结算,随后双方之间的支付通道关闭。

当然,闪电网络的发展是极其漫长的,工程实现也更加复杂。感兴趣的朋友可以翻看这一篇文章。本文主要阐释闪电网络的基本组件——支付通道和支付网络的协议原理。

一、支付通道 Payment Channel

1、开启通道(Funding Txn & Initial Commitment)

假设 Alice 和 Bob 之间想用闪电网络进行结算,他们手里各自持有 5个 BTC 。Alice 和 Bob 先各自把 5 个 BTC 转给一个由两人共同控制的多签地址,作为建立通道的质押金。在通道关闭之前,这10个比特币只能在 Alice 和 Bob 之间使用。也就是说,在不关闭通道的情况下,主网只知道多签地址有10个比特币,并不知道 Alice 和 Bob 互相支付后各自有几个币。

如上所述,连接 Alice 和 Bob 间的支付通道实质就是一个普通的多签钱包。第一笔交易(Funding Txn)决定了一个通道的余额,这笔交易需要广播到网络中并记录到区块链上,表明通道开启。同时,为了保障多签中双方的资金安全,还需要构建一个 Initial Commitment 的交易,保障多签中的资金可以安全退出。

构建 Initial Commitment 时,需要用到隔离见证 SegWit 和 哈希时间锁 HCLT,在时间锁设定的时间后,可以将 Initial Commitment 发布到区块链上,用户花费多签钱包中的资金。

2、开始交易(Commitment Txns)

双向支付通道建立后,当 Alice 和 Bob 间产生交易时需要更新通道双方的余额,双方就需要手动交换签过名的欠条(Commitment Txn)。这些交易本身都是有效的,随时可以发送到比特币网络中,但双方都会暂时保存起来,不会广播出来,除非已准备关闭通道。如此一来,通道内双方的余额状态,一秒内变动几千次也没问题,更新的速度仅受限于双方创建、签名和向对方发送承诺事务的速度。每次双方交换了一笔新的承诺事务,他们也就把通道的前一个状态作废掉;因此,只有最新的一笔承诺事务可以 “执行”。这样设计的目的是防止某一方欺诈对方,把一个过时的但对自己有利的状态发送的链上来关闭通道。

2.1 如何防止对方广播错误交易

在一次 commitment txn 中,交易双方需要各自构建一个交易,这两个交易互为镜像。当 Alice 需要给 Bob 转一个币时,双方构建的交易如图所示。Alice 构建的交易(右)是给自己 4 个币,给 Bob 6个币,该交易只能由 Bob 签名和广播;同样,Bob 构建的交易(左)是给自己6个币,给 Alice 4个币,该交易只能由 Alice 签名和广播。

因此,对方构建的交易,广播权是在于自己的,也就避免了交易双方恶意广播交易。

2.2 如何防止对方广播历史交易

现在假设 Alice 和 Bob 又完成了第一笔交易,现在 Alice 有 2 个币,Bob 有 8 个币;这个时候如何避免 Alice 作恶把之前 4-6 的交易在链上广播。

这就需要用到哈希时间锁和哈希密文锁。当 Alice 和 Bob 之间构建下一次 Commitment Txn 时,同时需要双方交换上一个 Commitment Txn 交易中的密文,用于作为上一笔交易的欠条。

假设 Alice 广播了上图 4-6 的交易(左),此时 Bob 能立刻获得 6个币,但 Alice 需要等待1000个区块的时间才能从多签中解锁她的 4 个币。而此时 Bob 已经拥有了 4-6 这笔交易的密文,Bob 此时可以多签地址中直接提走剩下的 4个币,Alice 作恶的结果是通道内的 10 个币都归了 Bob。

3、关闭通道(Settlement Txn)

最后,通道既可以双方一致同意关闭,就是把一笔关闭事务的交易(Settlement Txn)发送到比特币网络中;也可以单方决定关闭,就是把最后一笔 Commitment Txn 发送到网络中。这是为了防止某一方离线导致另一方在通道中的余额一直 “锁定” 的情形。

在通道存在的整个生命周期里,只有两笔事务被发到了比特币网络中并记录到了比特币区块链上(就是充值事务和结算事务)。在这两笔事务之间,双方可以交换无数次承诺事务,这些事务都不需要提交到区块链上。

二、支付网络 Network

新问题来了,世界上除了 Alice 和 Bob ,其他人也想接入闪电网络该怎么办?如果支付的双方间没有构建直接的通道还能实现支付吗?有什么办法可以把所有人都接入网络并保证可以向网络中的任一节点发起支付?

为了解决这一问题,我们需要**将双向支付通道扩展成闪电网络。**假如 Bob 和 Carol 之间已经建立了支付通道,Alice 和 Bob 之间也有支付通道,那么 Alice 可以先把钱转给 Bob ,再由 Bob 转给Carol,这样看起来就实现了从 Alice 到 Carol 间的支付通道,其中 Bob 充当网络中的路由节点。当许多节点之间建立起通道,最后就形成一个支付网络。

2.1 如何防止路由节点作恶

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

闪电网络采用了哈希密文锁和时间锁合约完美解决了这个问题。

过程是这样的:

第一,Carol 会选择一个随机密文并运算得到其哈希值,再将此哈希值交给Alice。

第二,Alice拿到哈希值后,会构建一笔转账给 Bob 的交易。这笔交易需要 Bob 拿到 Carol 的密文才能解锁,如果 Bob 在限定的时间内没有解锁成功,这笔钱则退回给 Alice。

第三,Bob 从 Alice 处拿到哈希值,他也构建一笔转账给 Carol 的交易,Carol 必须拿密文来解锁。第四,Bob 和 Carol 交换密文;当 Carol 提供密文从 Bob 处获得 1个币,Bob 立马会拿密文从 Alice 处获得 1个币,这就实现了从 Alice 给 Carol 支付。

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

2.2 洋葱路由Tor(The Onion Router)

如果闪电网络使用跟互联网一样的协议,每一个中间人都会知道谁是支付的发送者、谁是接收者、整条路径上的其他中间人是谁。洋葱路由是一个好的选择,因为其特性保证了中间节点:

  • 只知道自己的上一个节点(谁给自己发来了消息)和下一个节点(要把消息转发到哪里去)。
  • 不知道整条路径的长度;
  • 不知道自己在路径中的位置。

假设 Alice 要给 Dina 支付。首先,Alice 要为自己的支付找出一条可行的路径:

Alice → Bob → Chan → Dina

然后,她构造出一个 “洋葱”。她要从 Dina 开始(从路径的末端开始)。她把一个秘密消息(支付内容)放在一个发送给 Dina 的包裹中,并且使用一个只有她和 Dina 知道的密钥来上锁。现在,她把这个包裹放到另一个准备发送给 Chan 的包裹中,并且使用只有她和 Chan 知道的密钥,给这个发送给 Chan 的包裹上锁。对以此类推。

Alice 把最终的洋葱(包裹)发给路径上的第一个中间人,Bob。Bob 使用自己的密钥解锁自己的包裹,然后看到下一个包裹是发送给 Chan 的。于是他把包裹转发给 Chan。Chan 也一样,解开包裹之后,把里面那个包裹转发给 Dina。最后,Dina 打开属于自己的包裹,发现其中的支付消息。

在洋葱路由中,像 Bob 和 Chan 这样的中间人,并不知道给 Dina 的信息的内容,也不知道整条支付路径的长度。他们唯一知道的,就是给他们转发这个包裹的人,以及下一个接收包裹的人。这保证了消息的隐私性和路径的机密性。每一个中间人都只能触及专门为 TA 制作的那一层消息。

三、闪电网络的应用

3.1 潜水艇互换

一种特殊的原子化互换,是将比特币链上的资金换成闪电网络中的通道余额(反之亦成立)。发起互换的一方在自己的环境中给出哈希值和 HTLC,接受互换的另一方在自己的环境中制作使用相同哈希值的 HTLC。

这种互换功能对闪电网络用户来说非常重要,因为闪电支付通道是一对一的(它是一个 2-of-2 的多签名合约),用户发起支付和接收支付的能力分别受限于自己的 “本地余额”(在该用户参与的各个通道中属于 TA 自己的资金)和 “远端余额”(分别属于各通道对手的余额),某一些用户可能经常支付或收取支付,从而用尽余额(因此无法支付)或让通道中的资金全部归属于自己(因此无法接收支付)。潜水艇互换可以让用户置换出闪电通道中的资金,或向通道内注入资金,而无需 关闭/重新开启 通道。

已有的应用:LoopBoltz

3.2 LND

LND(Lightning Network Daemon)是一个开源的比特币闪电网络实现,是构建在比特币和其他一些加密货币之上的第二层支付协议。它是由Lightning Labs开发的,旨在提供快速、低成本和可扩展的支付解决方案。

LND 的主要特点和功能包括:

  1. 支持多种加密货币:LND 最初是为比特币设计的,但现在也支持其他一些加密货币,例如比特币测试网、Litecoin、Groestlcoin等。这意味着可以在不同的区块链上使用 LND 构建闪电网络。
  2. 快速支付:LND 实现了闪电网络协议,允许参与者在支付通道内进行快速的点对点支付。由于交易不需要被写入主链,支付可以几乎即时完成,从而提供了比传统链上交易更快的支付体验。
  3. 低成本支付:闪电网络的交易费用相对较低,因为支付在通道内进行,只有在通道关闭时才需要将最终结算结果写入区块链。这样可以节省交易费用,并为小额支付提供了低成本的解决方案。
  4. 支持多种操作系统和接口:LND 支持在不同的操作系统上运行,包括Linux、macOS和Windows。它提供了易于使用的命令行接口(CLI),以及适用于开发者的API和软件开发工具包(SDK),使开发人员可以集成闪电支付功能到自己的应用程序中。
  5. 安全性和隐私保护:LND 借助比特币的安全性作为底层网络,同时利用闪电网络的隐私保护特性,提供了更高的安全性和隐私保护。闪电网络使用基于哈希锁定和解锁的交易机制,保护参与者的资金安全和交易隐私。

LND 是一个活跃的开源项目,得到了社区的广泛关注和贡献。它的目标是通过构建闪电网络生态系统,为比特币和其他加密货币提供可扩展、高效和私密的支付解决方案。

3.3 其他场景

  • 社交平台支付打赏:近期火热的Damus支持了闪电网络支付及打赏功能,用户可选择使用Strike、Cash App、Blue Wallet等数十个钱包。
  • 跨境汇款:数字支付平台Strike于2023年1月宣布与Send Globally合作,使得美国和菲律宾的用户之间可以通过闪电网络进行快速、安全、低成本的汇款。通过Send Globally,美元可以转换成比特币,通过闪电网络发送至收款人所在国家的第三方合作伙伴,再转换成当地货币并直接发送到收款人的账户。
  • 商户支付:Strike和 Shopify、Blackhawk Network、NCR 合作建立了比特币支付系统,该系统允许商家在客户使用加密货币付款后快速接收美元。目前支持该支付系统的商家包括麦当劳、CVS、Walgreens、Whole Foods 和沃尔玛等。
  • 转账交易:Jack Dorsey领导的支付公司Block旗下的支付平台Cash APP可支持通过闪电网络发送和接受比特币。

参考:

podcast-Payment channel:
#6 - Lightning Network 的技术演化史 - Fork It | 小宇宙 - 听播客,上小宇宙
podcast-Network:
#6 - Lightning Network 的技术演化史 - Fork It | 小宇宙 - 听播客,上小宇宙
Chaincatcher
解读闪电网络,探寻比特币支付通道的前世今生 - ChainCatcher
硬核:
AI新智界-智能涌现,看见未来

洋葱路由:https://mp.weixin.qq.com/s/SbTr-iV2UaGK9BqjG5DnXg