什么是闪电网络及如何试用-翻译

介绍 Introduction

当比特币网络开始处理越来越多的交易的时候,网络的不可扩展性变得越来越凸显起来:区块的大小限制为1Mb,随着交易数量的不断增长,总有一天会打破这个限制,然后交易池中的待打包的交易会增长然后导致大量交易被延后处理。关于扩展性,人们基于原来比特币的实现,克隆了很多不同的解决方案,致力于构建切实可扩展的一个区块链。其中一种是Bitcoin Cash,通过将区块大小提高到8Mb来解决扩展性问题,并且后续根据需要继续提高区块的大小。

比特币核心开发者也知道这一问题的存在并且不停地寻找一个合适的解决方案。简单地增加区块大小可能不是一个很好的解决方案,因为这样会增加个人运行节点的难度,可能只有大公司才能够负担得起。并且,更大的区块也只能是一个临时的解决方案:在以后,当比特币被更加广泛地采用地时候,区块大小需要再次增加。这会造成区块链越来越中心化。

2017年8月24日,隔离见证(Segregated Witness)在比特币主网中被激活。虽然它的主要目的不是提升扩展性,而是交易的便捷性,但是隔离见证也确确实实提升了扩展性。隔离见证通过将发送者和接收者信息移到交易当中不需要验证的一个隔离域(见证)而对交易数据进行了重构(可以访问这里查看更加详细的解释),也对区块大小的计算进行了修改:隔离见证域的数据不计入区块大小当中。于是,这个变相地对交易进行了减负,现在一个区块可以存放更多的交易记录了。

这样的副作用是,所有通过隔离见证地址发出去的交易需要更小的交易费用,因为交易费用的大小和交易大小相关

不管是隔离见证还是更大的区块容量,都需要对区块链进行修改,可以称之为“on-chain”。与其相反的方法,不需要对区块链进行修改,可以称为“off-chain”。需要创建一个依附于区块链并提高其性能而不对它进行修改的系统。本文的主要话题,闪电网络(Lightning Network),就是一个off-chain比特币扩容解决方案。

闪电网络如何工作 How does Lightning Network work?

闪电网络(LN)的目的是在不修改区块链且不进行分叉的前提下提高比特币网络的吞吐量。主要思路是创建一个“second layer”进行交易的转移。关键在于在second layer上面进行的交易不需要支付交易费用,并且不需要等到新的区块被挖到以后才能够进行记录。在闪电网络上面可以:

  • 建立与其它个人、公司或者服务机构的支付通道
  • 通过这些支付通道免费且及时完成交易,这是彻底解决扩展性的关键

下面让我们详细看看这些点。

作为一个软件,闪电网络是一个节点,就像普通的比特币节点一样。为了运行闪电网络,需要一个完全同步的比特币节点,因为闪电网络需要依附于比特币网络和区块链。支付通道的建立整合到了比特币网络当中:当一个通道建立时,一个特殊类型的交易将会创建并且被发送到比特币网络当中。这个交易将会锁定打开该通道的一方特定数量的比特币, 然后关键的事情来了: 当你打开一个通道, 你需要锁定你可能要花费的比特币的最大值. 你不必将这些比特币都花掉, 但是最好提前预估你需要花费的比特币, 因为开通建立通道并不是免费的. 在通道中锁定一定的资金可以确保消费者立马就有资金可以消费.

正如名字所展示的, 闪电网络是一个网络: 所有的节点可以互相连接形成一个网络. 与其它节点相连意味着打开了一个新的通道.

当一个通道打开建立的时候, 意味着已经没有必要再通过比特币网络进行交易的发送和处理, 因为现在可以通过second layer, 即闪电网络进行交易的发送和处理. 通过闪电网络发送和处理交易是免费且即时的, 如果不考虑通道本身开通的费用的话.

当你有对其它节点打开的通道, 你可以通过以下两种方式发送BTC:

  • 直接向特定节点发送
  • 间接向与特定节点连接的其它节点先发送

第二种场景可能更为普通和基础. 想象一下, 一个支付中心: 一个与大量其它服务和产品提供商有通道连接的节点. 你不必与每一个服务和产品提供商建立通道连接, 你只要与那个中心点建立连接然后进行间接支付就可以了.

这种使用方式也是最容易引起争议的: 当有这样的节点存在的时候也就意味着网络出现了中心化; 大量的用户节点将依存于少量提供支付服务的中心节点. 从这个角度看, 这是闪电网络遭受批评的所在.

下面让我们来试一下闪电网络.

运行闪电网络节点 Running Lightning Network node

2018年2月份, 闪电网络在比特币测试网络成功部署和测试. 闪电网络也一并在主网完成了部署, 但是严重不推荐现在在主网使用闪电网络, 因为它依然不够稳定. 丢失比特币的风险非常高。由于我们不希望遇到那样的情况,我们仅在测试网络上面进行使用。

  • 首先,我们需要一个与比特币测试网连接并全量同步的节点,我们使用比特币核心节点,可以从https://bitcoin.org/en/wallets/desktop/windows/bitcoincore/下载
  • 然后,在未进行人工干预的情况下,比特币核心节点会连接到主网并进行同步,然后这并不是我们想要的
  • 不要傻傻等待同步完成,直接打开Settings,然后点击Open Configuration File 按钮
  • 一个有着比特币默认配置的文本编辑器会被打开。然后用以下文本进行更新:
1
2
3
4
5
6
7
testnet=1
server=1
rpcuser=foo
rpcpassword=bar
txindex=1
zmqpubrawblock=tcp://127.0.0.1:29000
zmqpubrawtx=tcp://127.0.0.1:29000
  • 这些设置会将比特币核心节点切换到测试网并对一些基本所需的设置进行配置。保存配置文件并重启节点。在重启以后,比特币核心节点的窗口会包含[testnet],这意味着此时它已经连接到测试网。这个时候就可以等待数据同步完成。
  • 同时,到https://github.com/ACINQ/eclair/releases下载Eclair,一个由ACINQ开发的闪电网络客户端,在我们后面的实验当中会有用到。如果你想现在就使用Eclair,它会无法工作,因为比特币节点没有完全同步。因此,在同步完成以后再继续阅读。

在同步进行过程当中,你可以访问https://explorer.acinq.co/,一个闪电网络拓扑关系可视化服务。它也会在世界地图当中展示节点位置,看起来非常有趣。

  • 在节点同步完成以后,运行Eclair。它看起来是这样的(但是在你那里可能打开的通道可能还没有)

  • 左下角是你的节点标示(也一并注意右下角:TEST,意味着闪电网络的节点是附在比特币测试网络)。表格(所有的节点、通道)应该会有计数。如果没有出现计数,等几分钟直到当前节点获得节点和通道信息

  • 然后这就是了,现在可以有一个与比特币测试网络相连接且全量同步的准备就绪的比特币闪电网络节点

存入一些比特币 Depositing some BTC

为了要转移一些比特币,显然,我们首先需要一些比特币,但是通过挖矿获得太不高效了。为了解决这个问题,有一个叫做faucet的服务,可以让你获得一些免费的币(这样的服务也在一些其它的区块链当中存在,不单单是比特币)。为了获得一些比特币,访问https://testnet.coinfaucet.eu/en/然后输入你从比特币核心节点获得的地址。比特币会在下一个被挖到的区块当中进行发放,是的,在测试网当中也会有挖矿的存在,你可以通过区块链浏览器进行查看。

现在我们准备使用闪电网络。

打开闪电网络通道 Opening LN channel

让我们从打开一个单一的闪电网络通道开始。

  • 访问我之前提到过的闪电网络浏览器。在搜索栏里面输入endurance找到我们要去连接的节点。在节点信息窗,找到Copy URI链接然后点击,我们可以用这个URI连接到这个节点。
  • 回到Eclair,点击Channels菜单,然后选择Open通道。粘贴节点URI到目标节点URI。在Capacity域里面,输入你想要在通道当中锁定的的币值数量(比如,你计划花费的币值的最大金额)。对我们的目的来说,100 millinBTC足够了。单击Connect来打开通道。
  • 在本地的通道列表当中,会出现一个新的通道:

  • 新通道的状态会很快改为WAIT_FOR_FUNDING_CONFIRMED,这意味着一个通过通道的交易已经创建且正在向比特币网络进行发送。现在你需要等待两个新的区块:一个包含当前交易然后另外一个对这笔交易进行确认。你也可以在之前提到的区块链浏览器对新区块进行跟踪。
  • 一旦交易被挖到且确认,通道的状态会变更为NORMAL,这意味着通道已经创建完毕准备好接收闪电网络交易。

为比特币购买咖啡 Buying coffee for Bitcoin

创建Eclair的公司,也创建了一个可以使用比特币的在线咖啡商店:https://starblocks.acinq.co/,然后我们会从这家商店通过闪电网络支付比特币购买咖啡。

闪电网络不允许在未取得地址所有者允许的情况下对任何地址进行随机的发送,这一点和比特币主网有所不同。愿意接收支付的一方需要创建一个收款需求,类似于发票的东西。然后接收方方将收款需求通过二维码、链接或者原始的方式传送给支付方,然后支付方通过一个能够读取需求的应用对需求进行读取和支付。

因此,为了购买一杯咖啡,我们需要:

  • 访问在线商城示例:https://starblocks.acinq.co/
  • 在购物车当中添加任何的咖啡然后进行结账。然后页面会展示一个二维码让你进行扫描,但是我们使用的是桌面版的闪电网络客户端,我们无法使用二维码。因此,我们需要原始的收款需求——在同一个页面以lnt开头的字符串——拷贝到缓冲区。大概看起来是这样的:

  • 然后切换到Eclair,回到Channel菜单,选择Send Payment,然后将收款需求粘贴进去。Eclair会对需求进行解析然后抽取出一些有用信息(比如节点ID、支付hash、产品的名字以及价格等)。
  • 不要急着点击Send!让我们先确认一些东西。在Eclair当中,找到我们所连接节点的ID,然后将它与你即将进行支付的节点ID进行比对。你会发现他们并不匹配!这是因为我们还未与要进行支付的节点之间建立起支付通道。
  • 点击Send。。。然后支付成功。在通道中锁定的金额会减去咖啡的价格,然后在线商店的demo会显示一条支付成功的消息。在你和在线商城之间的通道还未建立起来的时候,这是怎么做到的呢?这就借助了一些中间节点,你连接了中间节点并与中间节点有通道,然后中间节点与商店之间也有通道打开。
  • 然后回到闪电网络浏览器找到两个节点。感谢通道可视化,现在你可以看到两个节点之间目前已经有通道相连。

今天的内容就到这里!希望你们能够继续对其它的一些闪电网络客户端和其它的案例进行探索,反正在测试网当中,是无痛,你也不会损失任何东西。

那么主网的情况呢?What about the mainnet

2018年2月份,对于实际的支付闪电网络并没有准备好。确实,它在主网上面进行了部署,在主网上面也确实有闪电网络节点。但是很多东西还在开发当中,如果在真实的支付场景当中使用闪电网络还是有非常高的风险。

但是,你依然可以对它保持关注,感谢这个服务:https://lnmainnet.gaben.win/

链接和资源 Links and resources