{"content":{"body":"## 闪电网络是什么\n\n闪电网络是目前比特币的一个发展趋势,它解决了比特币的小额高频转账的问题。\n\n比特币实现了区块链账本,通过算力竞争的方式实现账本的一致性,这种方式注定了账本的使用成本高、速度慢、容量小。目前比特币主网的处理速度上限大概是7TPS,也就是一秒钟只能处理7次转账。比特币的出块速度是每10分钟出一次块,为了保证安全一般把转账确认设置为6个区块,也就是说一次转账至少需要60分钟才能被彻底确认。比特币作为区块链账本毫无问题,但是要用作小额高频支付工具力不从心。\n\n为了解决这些问题,产生了许多技术方向,例如ETH目前要上线的PoS、EOS独创的DPoS、IOTA的tangle等,另外就是今天要说的闪电网络Lightning Network。(说句题外话,扩容区块只是一个临时缓解的办法,并没有解决根本问题。就算区块大小扩容十倍,7TPS也顶多到70TPS而已,依然非常低)\n\n闪电网络依赖隔离见证(SegWit),隔离见证在2017年8月被主网确认正式生效。隔离见证有两个用处,一是变相扩容了区块(几乎等效于区块大小从1M扩容到2M)、二是为闪电网络提供底层支持。有了隔离见证,闪电网络就具备可行性了。\n\n2017年12月6日,闪电网络协议规范RC1版本发布,同时ACINQ,、Lightning Labs、Blockstream三个团队正在着手进行软件开发。\n\n截止到2018年7月,这三个团队都分别发布了闪电网络节点软件,还上线了第一款钱包eclair发布在Google Play。\n\n目前闪电网络主网上运行的节点数量有2837个,处于Active状态的Channel有10042个,闪电网络总共托管了94.40BTC。这个数字每天都在增长,你可以在[1ML](https://1ml.com/)看到具体数字。\n\n知名网站CoinGate已经支持闪电网络支付,另外还有几家网站(Bitrefill、Blockstream、HodlMonkey、TorGuard)也支持了闪电网络。闪电网络目前的状态是**几乎**已经正式上线,虽然开发者警告不要放太多钱进去以防丢失。我们可以认为闪电网络已经不会再有大改动。\n\n## 闪电网络的原理\n\n闪电网络通过引入智能合约的思想来完成交易。通过事先约定的智能合约,将大量的交易放在链下进行,不受区块链速度的限制,只将最终的确认环节放在链上。这样大大提升了交易速度。\n\n闪电网络的基础是隔离见证(SegWit),隔离见证在2017年8月被主网确认正式生效。隔离见证有两个用处,一是变相扩容了区块(几乎等效于区块大小从1M扩容到2M)、二是为闪电网络提供底层支持。有了隔离见证,闪电网络就具备可行性了。\n\n闪电网络通过的核心概念可以分为两大块,其一是RSMC(Recoverable Sequence Maturity Contract),用来完成两个节点之间的交易确认,其二是HTLC(Hashed Timelock Contract),用来将多个节点连接成一个网络,实现跨节点支付。\n\n### RSMC:实现两个节点之间的交易确认\n\n> 首先假定交易双方之间存在一个“微支付通道”(资金池)。交易双方先预存一部分资金到“微支付通道”里,初始情况下双方的分配方案等于预存的金额。每次发生交易,需要对交易后产生资金分配结果共同进行确认,同时签字把旧版本的分配方案作废掉。任何一方需要提现时,可以将他手里双方签署过的交易结果写到区块链网络中,从而被确认。从这个过程中可以可以看到,只有在提现时候才需要通过区块链。\n>\n> 任何一个版本的方案都需要经过双方的签名认证才合法。任何一方在任何时候都可以提出提现,提现时需要提供一个双方都签名过的资金分配方案(意味着肯定是某次交易后的结果,被双方确认过,但未必是最新的结果)。在一定时间内,如果另外一方拿出证明表明这个方案其实之前被作废了(非最新的交易结果),则资金罚没给质疑方;否则按照提出方的结果进行分配。罚没机制可以确保了没人会故意拿一个旧的交易结果来提现。\n>\n> 引用自:https://yeasy.gitbooks.io/blockchain_guide/content/bitcoin/lightning_network.html\n\n简单来说,通过RSMC实现了两个节点之间的交易确认:\n\n1. A创建和B的支付通道Channel\n2. A投入准备金100元\n3. A给B转账实际上是在扣除准备金,A可以多次给B转账(发生在链下,不用区块确认)\n4. A或者B关闭闪电网络通道,进行提现,闪电网络将A、B的最终余额写入链上\n\n可以看到转账都发生在链下,只有关闭通道才会产生一次链上交易\n\n### HTLC:将多个节点连接成一个网络,实现跨节点支付\n\n可以看到,RSMC实现了两个节点之间的交易,但在现实场景中这显然不够。举个例子:\n\n消费者A要在B、C、D网站上买东西,A要分别开通到B、C、D的交易通道,每个通道都要存入一定的准备金。如果A只和B交易一次就关闭通道,那实际上闪电网络并没有降低交易成本。\n\n这个时候HTLC就应运而生了,HTLC实现了将闪电网络上的节点连接成一个网络,一笔交易可以路由经多个节点最终到达目的。\n\n> 微支付通道是通过 Hashed Timelock Contract 来实现的,中文意思是“哈希的带时钟的合约”。这个其实就是限时转账。理解起来也很简单,通过智能合约,双方约定转账方先冻结一笔钱,并提供一个哈希值,如果在一定时间内有人能提出一个字符串,使得它哈希后的值跟已知值匹配(实际上意味着转账方授权了接收方来提现),则这笔钱转给接收方。\n>\n> 不太恰当的例子,约定一定时间内,有人知道了某个暗语(可以生成匹配的哈希值),就可以拿到这个指定的资金。\n>\n> 推广一步,甲想转账给丙,丙先发给甲一个哈希值。甲可以先跟乙签订一个合同,如果你在一定时间内能告诉我一个暗语,我就给你多少钱。乙于是跑去跟丙签订一个合同,如果你告诉我那个暗语,我就给你多少钱。丙于是告诉乙暗语,拿到乙的钱,乙又从甲拿到钱。最终达到结果是甲转账给丙。这样甲和丙之间似乎构成了一条完整的虚拟的“支付通道”。\n>\n> 引用自:https://yeasy.gitbooks.io/blockchain_guide/content/bitcoin/lightning_network.html\n\n简单来说:\n\n1. A需要转账50给C\n2. A和B有交易通道(余额大于50),B和C有交易通道(余额大于50)\n3. A -> B -> C,交易完成\n\n换成刚才那个例子:\n\n消费者A要在B、C、D网站上买东西。消费者A和一个比较大的节点Z开通通道,网站B、C、D也和这个大节点Z开通通道。交易得以完成。消费者A只需要和Z打通,不需要关心网站BCD,网站BCD也只需要和Z打通不需要关心消费者A。\n\nHTLC机制可以扩展到许多节点的场景,这里的节点Z并不一定就是同一个节点,只要闪电网络最终能找到一条可用的通道就能完成支付。可以是A->Z1->Z2->Zn….->B。\n\n你可以在这里看到目前闪电网络的节点连接情况:\n\n#### HTLC的路由和手续费机制\n\n开通通道需要存入准备金,一个足够大的节点需要大量的准备金来维持交易。目前最大的节点LN.SHITCOIN.COM已经存入了43.79478257BTC,大概是30万美元。节点不可能无偿提供服务,闪电网络设计了一套手续费体系来维持闪电网络的运行。\n\n闪电网络上的每一个节点,都可以设置自己的手续费(fee)大小。\n\n如果节点Z1设置了手续费1元,Z2设置了手续费2元,A->Z1->Z2->B这条支付路径里,A就需要额外付给Z1 1元,Z2 2元。\n\n闪电网络的交易通常不只有一条通路,可能有很多条。客户端在发起支付之前可以通过getroute方法来确定每条通路的手续费情况,可以选择一条最便宜的通路来完成交易。\n\n闪电网络的节点充满竞争,手续费太高可能造成你的节点无人使用,闪电网络节点理论上都会维持在一个相对低廉的手续费水平。\n\n笔者通过闪电网络支付了一个[在线轮盘赌网站](https://www.lightningspin.com/),共花费手续费0.0000000204BTC,大概等于0.001元人民币。挑选一个手续费低的节点还能做到更低。就目前来看闪电网络的转账手续费几乎可以忽略不计。\n\n## 体验闪电网络:eclair\n\n闪电网络拥有一套完整的协议规范,在2017年12月发布了RC1版本。现在常见的闪电网络节点软件都是按照协议规范书写的,运行在同一个闪电网络上,可以互相兼容。\n\neclair是ACINQ团队创造的闪电网络程序,涵盖了Windows、Linux、macOS、Android平台。\n\n桌面平台:https://github.com/ACINQ/eclair\n\n安卓平台:https://github.com/ACINQ/eclair-wallet\n\n以安卓为例,下载安卓钱包客户端:https://github.com/ACINQ/eclair-wallet/releases\n\n朝eclair钱包充值一定数量的BTC(不要充值太多)\n\n![](https://images.mirror-media.xyz/publication-images/g-AlHJ9-qN4aHSJ0bpRub.png?height=1280&width=720)\n\n创建一个通道,这里可以选择ACINQ团队的官方通道,存入一定数量的BTC(不用担心,这里输入的金额只是通道保证金,随时可以取回)\n\n![](https://images.mirror-media.xyz/publication-images/Tglx1bJu2SSivViCjufBQ.png?height=1280&width=720)\n\n选择一个收款方测试支付是否成功(因为手续费极低,可以测试转账一毛两毛的)\n\n可以在这个网站搏一搏运气,最低支付一元钱:https://www.lightningspin.com/\n\n以上是闪电网络钱包的使用方法,非常简单方便。\n\n## 搭建一个自己的闪电网络节点\n\n如果你不满足只是使用闪电网络,你还可以自己搭建一个闪电网络节点,参与到闪电网络中来,并且收取转账手续费。\n\n### 一、购买云主机并安装Docker\n\n除了临时测试外,不推荐使用自己的PC来搭建节点,一是因为国内网络环境恶劣造成很大麻烦,二是因为闪电网络的机制要求节点随时在线,长时间不在线容易被攻击。\n\n运行比特币全节点需要磁盘空间在200G以上,并且这个大小还在持续增长。\n\n以Vultr为例,购买NJ节点5$方案+20$的200G磁盘,月付25$。Vultr常年有新用户注册优惠活动,通过邀请链接注册送20$,足够跑一个月: (注意需要双币信用卡)\n\n在Vultr购买主机可以选择预装Docker。需要自己安装Docker可以相应教程。\n\n### 二、运行比特币全节点\n\nclone项目到本地,编译bitcoind docker镜像\n\n```\ngit clone https://github.com/dougvk/lightning-node.git\ncd lightning-node\ndocker build . -t dougvk/bitcoind\n```\n\n运行bitcoind\n\n```\nmkdir -p /scratch/bitcoin/mainnet/bitcoind\ndocker run --name bitcoind_mainnet -d -v /scratch/bitcoin/mainnet/bitcoind:/data -p 8333:8333 -p 9735:9735 dougvk/bitcoind:latest\n```\n\n这样就启动了比特币全节点。比特币的数据文件存在了`/scratch`目录下。这个命令暴露了两个必要的对外端口8333和9735,不用担心,RPC端口并没有被暴露。\n\n节点启动之后就开始了同步过程,需要同步180G左右的数据,大约需要12h。\n\n通过这个命令可以查看同步进度:\n\n```\ndocker run --rm --network container:bitcoind_mainnet -v /scratch/bitcoin/mainnet/bitcoind:/data dougvk/bitcoind:latest bitcoin-cli getblockchaininfo\n{\n \"chain\": \"main\",\n \"blocks\": 532914,\n \"headers\": 532914,\n \"bestblockhash\": \"0000000000000000001f2deba673d0bb65ac20a3690240324b0bb6bfe9286e23\",\n \"difficulty\": 5178671069072.251,\n \"mediantime\": 1532152533,\n \"verificationprogress\": 0.9999936154754053,\n \"initialblockdownload\": false,\n \"chainwork\": \"0000000000000000000000000000000000000000026ea366193d216bb3d37ef4\",\n \"size_on_disk\": 200991969130,\n \"pruned\": false,\n \"softforks\": [\n {\n \"id\": \"bip34\",\n \"version\": 2,\n \"reject\": {\n \"status\": true\n }\n },\n {\n \"id\": \"bip66\",\n \"version\": 3,\n \"reject\": {\n \"status\": true\n }\n },\n {\n \"id\": \"bip65\",\n \"version\": 4,\n \"reject\": {\n \"status\": true\n }\n }\n ],\n \"bip9_softforks\": {\n \"csv\": {\n \"status\": \"active\",\n \"startTime\": 1462060800,\n \"timeout\": 1493596800,\n \"since\": 419328\n },\n \"segwit\": {\n \"status\": \"active\",\n \"startTime\": 1479168000,\n \"timeout\": 1510704000,\n \"since\": 481824\n }\n },\n \"warnings\": \"\"\n}\n```\n\n`blocks`和`headers`数量一致代表同步完成\n\n### 三、运行闪电网络节点\n\n这里选择了clightning这个节点程序,运行节点(命令里可以设置节点名和颜色):\n\n```\nmkdir -p /scratch/bitcoin/mainnet/clightning\ndocker 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\n```\n\n创建一个`lightning-cli`的命令,写入文件`/usr/local/bin/lightning-cli`\n\n```\n#!/usr/bin/env bash\ndocker run --rm -v /scratch/bitcoin/mainnet/clightning:/root/.lightning --entrypoint /usr/bin/lightning-cli cdecker/lightningd:master \"$@\"\n```\n\n添加执行权限\n\n```\nchmod +x /usr/local/bin/lightning-cli\n```\n\n通过`getinfo`可以看到闪电网络节点的运行状况\n\n```\nlightning-cli getinfo\n```\n\n到这里闪电网络节点已经启动成功\n\n### 四、给闪电网络钱包充值\n\n执行命令`lightning-cli newaddr`生成一个充值地址\n\n```\n{ \"address\" : \"1Cd6C8i6sc1ZReskWWGHJRXvSnvM3277qz\" }\n```\n\n朝这个地址转账适量的BTC,等待比特币网络的6次确认,设置适当的手续费一般在60分钟左右。等充值被确认了以后就可以开始创建通道了。\n\n### 五、创建闪电网络通道\n\n你可以通过这个网站来找到你想连接的节点:https://1ml.com/\n\n或者你也可以连接我创建的节点,执行命令进行连接:\n\n```\nlightning-cli connect 02ed9102fe81a117b19f0c1fe0586536a04c962838677dcdb762aeb9804d9f33c7@5.135.180.50:9735\n```\n\n查看你连接过的节点状态:\n\n```\nlightning-cli getpeers\n```\n\n设置一个合理的手续费(这个手续费用作闪电网络合约的创建):\n\n```\nbitcoin-cli settxfee 0.00005\n```\n\n你可以查看当前的手续费水平,选择一个合适的值。如果是5sat/B,这里应该设置为0.00005。\n\n手续费参考:\n\n设置完后续费之后就可以开启通道了,开启通道需要设置准备金的数量:\n\n```\nlightning-cli fundchannel 02ed9102fe81a117b19f0c1fe0586536a04c962838677dcdb762aeb9804d9f33c7 20000\n```\n\n会返回一个txid,通过txid可以查看通道开通的进度,经过6次确认之后通道就正式开通了。\n\n### 六、测试支付\n\n同样,你也可以找个网站支付几毛钱测试一下能否成功\n\n```\nlightning-cli pay xxxxxxxx\n```\n\n通过`lightning-cli getpeers`命令可以查看当前通道的情况和剩余的BTC\n\n### 七、查看并分享你的节点\n\n顺利的话你的闪电网络节点已经创建成功了。\n\n如果你和闪电网络任意一个节点创建过通道,你应该能在1ml.com上搜索到你的节点信息(可能需要过几个小时的同步时间)\n\n\n\n通过lightning-cli getinfo 能查看本机节点信息,拼成id@ip:port的形式分享给别人,别人就能通过connect命令连上你的节点,比如我的节点:\n\n```\n02ed9102fe81a117b19f0c1fe0586536a04c962838677dcdb762aeb9804d9f33c7@5.135.180.50:9735\n```\n\n别人的转账路由经过了你的节点,就会向你支付一定的手续费。当然你也可以随时调整这个手续费。","timestamp":1636875158,"title":"⚡️闪电网络简明教程"},"digest":"ecrU0PnfAXn2uCrNnFEE0PxunbMAkxACNZPXHbpawTc","authorship":{"contributor":"0x015fF08E0898733d50F12958f8208B8BB18f18F4","signingKey":"{\"crv\":\"P-256\",\"ext\":true,\"key_ops\":[\"verify\"],\"kty\":\"EC\",\"x\":\"rUVQXrPnWQSP_WCfF7xmHFeZ_3DrEzrKL0BkJ1eqPg0\",\"y\":\"I2XKwwXV5PHS4gwRG-so26yJqjD5d2TBD5Uh6mcwKUM\"}","signature":"tFHfEzGdpWZDDRtfCw23p6FGPrStfIf9huViktGSAd4qrDZaWsRpyvzWL1tZD8YLDjpcZJBRJ0fmZwpM0taL5Q","signingKeySignature":"0xc1616877b843c22c0b985b44d841e75b587a0c2e766a2a8c506555c047c4a8622b2748f2d15fcdac5632632082ddcb80574d5c2bab66bdb923ced0833357210e1c","signingKeyMessage":"I authorize publishing on mirror.xyz from this device using:\n{\"crv\":\"P-256\",\"ext\":true,\"key_ops\":[\"verify\"],\"kty\":\"EC\",\"x\":\"rUVQXrPnWQSP_WCfF7xmHFeZ_3DrEzrKL0BkJ1eqPg0\",\"y\":\"I2XKwwXV5PHS4gwRG-so26yJqjD5d2TBD5Uh6mcwKUM\"}","algorithm":{"name":"ECDSA","hash":"SHA-256"}},"nft":{},"version":"12-21-2020","originalDigest":"ecrU0PnfAXn2uCrNnFEE0PxunbMAkxACNZPXHbpawTc"}