文章标签 » Block Chain

⚡️闪电网络简明教程

闪电网络是什么

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

比特币实现了区块链账本,通过算力竞争的方式实现账本的一致性,这种方式注定了账本的使用成本高、速度慢、容量小。目前比特币主网的处理速度上限大概是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 "[email protected]"

添加执行权限

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 02e[email protected]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上搜索到你的节点信息(可能需要过几个小时的同步时间)

https://1ml.com/node/02ed9102fe81a117b19f0c1fe0586536a04c962838677dcdb762aeb9804d9f33c7

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

02e[email protected]5.135.180.50:9735

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