# ⚡️闪电网络简明教程

By [puton.eth](https://paragraph.com/@puton) · 2021-11-14

---

闪电网络是什么
-------

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

比特币实现了区块链账本，通过算力竞争的方式实现账本的一致性，这种方式注定了账本的使用成本高、速度慢、容量小。目前比特币主网的处理速度上限大概是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](https://1ml.com/)看到具体数字。

知名网站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](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](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/](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方法来确定每条通路的手续费情况，可以选择一条最便宜的通路来完成交易。

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

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

体验闪电网络：eclair
-------------

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

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

桌面平台：[https://github.com/ACINQ/eclair](https://github.com/ACINQ/eclair)

安卓平台：[https://github.com/ACINQ/eclair-wallet](https://github.com/ACINQ/eclair-wallet)

以安卓为例，下载安卓钱包客户端：[https://github.com/ACINQ/eclair-wallet/releases](https://github.com/ACINQ/eclair-wallet/releases)

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

![](https://storage.googleapis.com/papyrus_images/d9e69d8872d63eba18924772f5490df084547b59ec4bfe44268ab88f7d7a1655.png)

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

![](https://storage.googleapis.com/papyrus_images/b22d125f1a7bf02e366c8f81a4f39be2a40abbc8090a8b4e58784de3986306b1.png)

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

可以在这个网站搏一搏运气，最低支付一元钱：[https://www.lightningspin.com/](https://www.lightningspin.com/)

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

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

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

### 一、购买云主机并安装Docker

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

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

以Vultr为例，购买NJ节点5$方案+20$的200G磁盘，月付25$。Vultr常年有新用户注册优惠活动，通过邀请链接注册送20$，足够跑一个月：[https://www.vultr.com/?ref=6897056](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": ""
    }
    

`blocks`和`headers`数量一致代表同步完成

### 三、运行闪电网络节点

这里选择了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/](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](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上搜索到你的节点信息（可能需要过几个小时的同步时间）

[https://1ml.com/node/02ed9102fe81a117b19f0c1fe0586536a04c962838677dcdb762aeb9804d9f33c7](https://1ml.com/node/02ed9102fe81a117b19f0c1fe0586536a04c962838677dcdb762aeb9804d9f33c7)

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

    02ed9102fe81a117b19f0c1fe0586536a04c962838677dcdb762aeb9804d9f33c7@5.135.180.50:9735
    

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

---

*Originally published on [puton.eth](https://paragraph.com/@puton/Cu6C7x3i34ZM1EHZ5bA4)*
