⚡️闪电网络简明教程
November 14th, 2021

闪电网络是什么

闪电网络是目前比特币的一个发展趋势,它解决了比特币的小额高频转账的问题。

比特币实现了区块链账本,通过算力竞争的方式实现账本的一致性,这种方式注定了账本的使用成本高、速度慢、容量小。目前比特币主网的处理速度上限大概是7TPS,也就是一秒钟只能处理7次转账。比特币的出块速度是每10分钟出一次块,为了保证安全一般把转账确认设置为6个区块,也就是说一次转账至少需要60分钟才能被彻底确认。比特币作为区块链账本毫无问题,但是要用作小额高频支付工具力不从心。

为了解决这些问题,产生了许多技术方向,例如ETH目前要上线的PoS、EOS独创的DPoS、IOTA的tangle等,另外就是今天要说的闪电网络Lightning Network。(说句题外话,扩容区块只是一个临时缓解的办法,并没有解决根本问题。就算区块大小扩容十倍,7TPS也顶多到70TPS而已,依然非常低)

闪电网络依赖隔离见证(SegWit),隔离见证在2017年8月被主网确认正式生效。隔离见证有两个用处,一是变相扩容了区块(几乎等效于区块大小从1M扩容到2M)、二是为闪电网络提供底层支持。有了隔离见证,闪电网络就具备可行性了。

2017年12月6日,闪电网络协议规范RC1版本发布,同时ACINQ,、Lightning Labs、Blockstream三个团队正在着手进行软件开发。

截止到2018年7月,这三个团队都分别发布了闪电网络节点软件,还上线了第一款钱包eclair发布在Google Play。

目前闪电网络主网上运行的节点数量有2837个,处于Active状态的Channel有10042个,闪电网络总共托管了94.40BTC。这个数字每天都在增长,你可以在1ML看到具体数字。

知名网站CoinGate已经支持闪电网络支付,另外还有几家网站(Bitrefill、Blockstream、HodlMonkey、TorGuard)也支持了闪电网络。闪电网络目前的状态是几乎已经正式上线,虽然开发者警告不要放太多钱进去以防丢失。我们可以认为闪电网络已经不会再有大改动。

闪电网络的原理

闪电网络通过引入智能合约的思想来完成交易。通过事先约定的智能合约,将大量的交易放在链下进行,不受区块链速度的限制,只将最终的确认环节放在链上。这样大大提升了交易速度。

闪电网络的基础是隔离见证(SegWit),隔离见证在2017年8月被主网确认正式生效。隔离见证有两个用处,一是变相扩容了区块(几乎等效于区块大小从1M扩容到2M)、二是为闪电网络提供底层支持。有了隔离见证,闪电网络就具备可行性了。

闪电网络通过的核心概念可以分为两大块,其一是RSMC(Recoverable Sequence Maturity Contract),用来完成两个节点之间的交易确认,其二是HTLC(Hashed Timelock Contract),用来将多个节点连接成一个网络,实现跨节点支付。

RSMC:实现两个节点之间的交易确认

首先假定交易双方之间存在一个“微支付通道”(资金池)。交易双方先预存一部分资金到“微支付通道”里,初始情况下双方的分配方案等于预存的金额。每次发生交易,需要对交易后产生资金分配结果共同进行确认,同时签字把旧版本的分配方案作废掉。任何一方需要提现时,可以将他手里双方签署过的交易结果写到区块链网络中,从而被确认。从这个过程中可以可以看到,只有在提现时候才需要通过区块链。

任何一个版本的方案都需要经过双方的签名认证才合法。任何一方在任何时候都可以提出提现,提现时需要提供一个双方都签名过的资金分配方案(意味着肯定是某次交易后的结果,被双方确认过,但未必是最新的结果)。在一定时间内,如果另外一方拿出证明表明这个方案其实之前被作废了(非最新的交易结果),则资金罚没给质疑方;否则按照提出方的结果进行分配。罚没机制可以确保了没人会故意拿一个旧的交易结果来提现。

引用自:https://yeasy.gitbooks.io/blockchain_guide/content/bitcoin/lightning_network.html

简单来说,通过RSMC实现了两个节点之间的交易确认:

  1. A创建和B的支付通道Channel
  2. A投入准备金100元
  3. A给B转账实际上是在扣除准备金,A可以多次给B转账(发生在链下,不用区块确认)
  4. A或者B关闭闪电网络通道,进行提现,闪电网络将A、B的最终余额写入链上

可以看到转账都发生在链下,只有关闭通道才会产生一次链上交易

HTLC:将多个节点连接成一个网络,实现跨节点支付

可以看到,RSMC实现了两个节点之间的交易,但在现实场景中这显然不够。举个例子:

消费者A要在B、C、D网站上买东西,A要分别开通到B、C、D的交易通道,每个通道都要存入一定的准备金。如果A只和B交易一次就关闭通道,那实际上闪电网络并没有降低交易成本。

这个时候HTLC就应运而生了,HTLC实现了将闪电网络上的节点连接成一个网络,一笔交易可以路由经多个节点最终到达目的。

微支付通道是通过 Hashed Timelock Contract 来实现的,中文意思是“哈希的带时钟的合约”。这个其实就是限时转账。理解起来也很简单,通过智能合约,双方约定转账方先冻结一笔钱,并提供一个哈希值,如果在一定时间内有人能提出一个字符串,使得它哈希后的值跟已知值匹配(实际上意味着转账方授权了接收方来提现),则这笔钱转给接收方。

不太恰当的例子,约定一定时间内,有人知道了某个暗语(可以生成匹配的哈希值),就可以拿到这个指定的资金。

推广一步,甲想转账给丙,丙先发给甲一个哈希值。甲可以先跟乙签订一个合同,如果你在一定时间内能告诉我一个暗语,我就给你多少钱。乙于是跑去跟丙签订一个合同,如果你告诉我那个暗语,我就给你多少钱。丙于是告诉乙暗语,拿到乙的钱,乙又从甲拿到钱。最终达到结果是甲转账给丙。这样甲和丙之间似乎构成了一条完整的虚拟的“支付通道”。

引用自:https://yeasy.gitbooks.io/blockchain_guide/content/bitcoin/lightning_network.html

简单来说:

  1. A需要转账50给C
  2. A和B有交易通道(余额大于50),B和C有交易通道(余额大于50)
  3. A -> B -> C,交易完成

换成刚才那个例子:

消费者A要在B、C、D网站上买东西。消费者A和一个比较大的节点Z开通通道,网站B、C、D也和这个大节点Z开通通道。交易得以完成。消费者A只需要和Z打通,不需要关心网站BCD,网站BCD也只需要和Z打通不需要关心消费者A。

HTLC机制可以扩展到许多节点的场景,这里的节点Z并不一定就是同一个节点,只要闪电网络最终能找到一条可用的通道就能完成支付。可以是A->Z1->Z2->Zn….->B。

你可以在这里看到目前闪电网络的节点连接情况:https://lnmainnet.gaben.win/

HTLC的路由和手续费机制

开通通道需要存入准备金,一个足够大的节点需要大量的准备金来维持交易。目前最大的节点LN.SHITCOIN.COM已经存入了43.79478257BTC,大概是30万美元。节点不可能无偿提供服务,闪电网络设计了一套手续费体系来维持闪电网络的运行。

闪电网络上的每一个节点,都可以设置自己的手续费(fee)大小。

如果节点Z1设置了手续费1元,Z2设置了手续费2元,A->Z1->Z2->B这条支付路径里,A就需要额外付给Z1 1元,Z2 2元。

闪电网络的交易通常不只有一条通路,可能有很多条。客户端在发起支付之前可以通过getroute方法来确定每条通路的手续费情况,可以选择一条最便宜的通路来完成交易。

闪电网络的节点充满竞争,手续费太高可能造成你的节点无人使用,闪电网络节点理论上都会维持在一个相对低廉的手续费水平。

笔者通过闪电网络支付了一个在线轮盘赌网站,共花费手续费0.0000000204BTC,大概等于0.001元人民币。挑选一个手续费低的节点还能做到更低。就目前来看闪电网络的转账手续费几乎可以忽略不计。

体验闪电网络:eclair

闪电网络拥有一套完整的协议规范,在2017年12月发布了RC1版本。现在常见的闪电网络节点软件都是按照协议规范书写的,运行在同一个闪电网络上,可以互相兼容。

eclair是ACINQ团队创造的闪电网络程序,涵盖了Windows、Linux、macOS、Android平台。

桌面平台:https://github.com/ACINQ/eclair

安卓平台:https://github.com/ACINQ/eclair-wallet

以安卓为例,下载安卓钱包客户端:https://github.com/ACINQ/eclair-wallet/releases

朝eclair钱包充值一定数量的BTC(不要充值太多)

创建一个通道,这里可以选择ACINQ团队的官方通道,存入一定数量的BTC(不用担心,这里输入的金额只是通道保证金,随时可以取回)

选择一个收款方测试支付是否成功(因为手续费极低,可以测试转账一毛两毛的)

可以在这个网站搏一搏运气,最低支付一元钱:https://www.lightningspin.com/

以上是闪电网络钱包的使用方法,非常简单方便。

搭建一个自己的闪电网络节点

如果你不满足只是使用闪电网络,你还可以自己搭建一个闪电网络节点,参与到闪电网络中来,并且收取转账手续费。

一、购买云主机并安装Docker

除了临时测试外,不推荐使用自己的PC来搭建节点,一是因为国内网络环境恶劣造成很大麻烦,二是因为闪电网络的机制要求节点随时在线,长时间不在线容易被攻击。

运行比特币全节点需要磁盘空间在200G以上,并且这个大小还在持续增长。

以Vultr为例,购买NJ节点5$方案+20$的200G磁盘,月付25$。Vultr常年有新用户注册优惠活动,通过邀请链接注册送20$,足够跑一个月:https://www.vultr.com/?ref=6897056 (注意需要双币信用卡)

在Vultr购买主机可以选择预装Docker。需要自己安装Docker可以相应教程。

二、运行比特币全节点

clone项目到本地,编译bitcoind docker镜像

git clone https://github.com/dougvk/lightning-node.git
cd lightning-node
docker build . -t dougvk/bitcoind

运行bitcoind

mkdir -p /scratch/bitcoin/mainnet/bitcoind
docker run --name bitcoind_mainnet -d -v /scratch/bitcoin/mainnet/bitcoind:/data -p 8333:8333 -p 9735:9735 dougvk/bitcoind:latest

这样就启动了比特币全节点。比特币的数据文件存在了/scratch目录下。这个命令暴露了两个必要的对外端口8333和9735,不用担心,RPC端口并没有被暴露。

节点启动之后就开始了同步过程,需要同步180G左右的数据,大约需要12h。

通过这个命令可以查看同步进度:

docker run --rm --network container:bitcoind_mainnet -v /scratch/bitcoin/mainnet/bitcoind:/data dougvk/bitcoind:latest bitcoin-cli getblockchaininfo
{
  "chain": "main",
  "blocks": 532914,
  "headers": 532914,
  "bestblockhash": "0000000000000000001f2deba673d0bb65ac20a3690240324b0bb6bfe9286e23",
  "difficulty": 5178671069072.251,
  "mediantime": 1532152533,
  "verificationprogress": 0.9999936154754053,
  "initialblockdownload": false,
  "chainwork": "0000000000000000000000000000000000000000026ea366193d216bb3d37ef4",
  "size_on_disk": 200991969130,
  "pruned": false,
  "softforks": [
    {
      "id": "bip34",
      "version": 2,
      "reject": {
        "status": true
      }
    },
    {
      "id": "bip66",
      "version": 3,
      "reject": {
        "status": true
      }
    },
    {
      "id": "bip65",
      "version": 4,
      "reject": {
        "status": true
      }
    }
  ],
  "bip9_softforks": {
    "csv": {
      "status": "active",
      "startTime": 1462060800,
      "timeout": 1493596800,
      "since": 419328
    },
    "segwit": {
      "status": "active",
      "startTime": 1479168000,
      "timeout": 1510704000,
      "since": 481824
    }
  },
  "warnings": ""
}

blocksheaders数量一致代表同步完成

三、运行闪电网络节点

这里选择了clightning这个节点程序,运行节点(命令里可以设置节点名和颜色):

mkdir -p /scratch/bitcoin/mainnet/clightning
docker run --rm --name lightning --network container:bitcoind_mainnet -p9735:9735 -v /scratch/bitcoin/mainnet/bitcoind:/root/.bitcoin -v /scratch/bitcoin/mainnet/clightning:/root/.lightning --entrypoint /usr/bin/lightningd cdecker/lightningd:master --network=bitcoin --alias yournodename --rgb aa381e --announce-addr 本机ip --bind-addr 0.0.0.0 --log-level=debug

创建一个lightning-cli的命令,写入文件/usr/local/bin/lightning-cli

#!/usr/bin/env bash
docker run --rm -v /scratch/bitcoin/mainnet/clightning:/root/.lightning --entrypoint /usr/bin/lightning-cli cdecker/lightningd:master "$@"

添加执行权限

chmod +x /usr/local/bin/lightning-cli

通过getinfo可以看到闪电网络节点的运行状况

lightning-cli getinfo

到这里闪电网络节点已经启动成功

四、给闪电网络钱包充值

执行命令lightning-cli newaddr生成一个充值地址

{ "address" : "1Cd6C8i6sc1ZReskWWGHJRXvSnvM3277qz" }

朝这个地址转账适量的BTC,等待比特币网络的6次确认,设置适当的手续费一般在60分钟左右。等充值被确认了以后就可以开始创建通道了。

五、创建闪电网络通道

你可以通过这个网站来找到你想连接的节点:https://1ml.com/

或者你也可以连接我创建的节点,执行命令进行连接:

lightning-cli connect 02ed9102fe81a117b19f0c1fe0586536a04c962838677dcdb762aeb9804d9f33c7@5.135.180.50:9735

查看你连接过的节点状态:

lightning-cli getpeers

设置一个合理的手续费(这个手续费用作闪电网络合约的创建):

bitcoin-cli settxfee 0.00005

你可以查看当前的手续费水平,选择一个合适的值。如果是5sat/B,这里应该设置为0.00005。

手续费参考:https://p2sh.info/dashboard/db/fee-estimation

设置完后续费之后就可以开启通道了,开启通道需要设置准备金的数量:

lightning-cli fundchannel 02ed9102fe81a117b19f0c1fe0586536a04c962838677dcdb762aeb9804d9f33c7 20000

会返回一个txid,通过txid可以查看通道开通的进度,经过6次确认之后通道就正式开通了。

六、测试支付

同样,你也可以找个网站支付几毛钱测试一下能否成功

lightning-cli pay xxxxxxxx

通过lightning-cli getpeers命令可以查看当前通道的情况和剩余的BTC

七、查看并分享你的节点

顺利的话你的闪电网络节点已经创建成功了。

如果你和闪电网络任意一个节点创建过通道,你应该能在1ml.com上搜索到你的节点信息(可能需要过几个小时的同步时间)

通过lightning-cli getinfo 能查看本机节点信息,拼成id@ip:port的形式分享给别人,别人就能通过connect命令连上你的节点,比如我的节点:

02ed9102fe81a117b19f0c1fe0586536a04c962838677dcdb762aeb9804d9f33c7@5.135.180.50:9735

别人的转账路由经过了你的节点,就会向你支付一定的手续费。当然你也可以随时调整这个手续费。

Subscribe to puton.eth
Receive the latest updates directly to your inbox.
Verification
This entry has been permanently stored onchain and signed by its creator.
More from puton.eth

Skeleton

Skeleton

Skeleton