
闪电网络于2015年2月在论文《The Bitcoin Lightning Network: Scalable Off-Chain Instant Payments》中被提出来。简单的理解,闪电网络是比特币实现小额快速交易的一个通道。阅读本篇文章需要会搭建比特币私链的基础,如果不熟悉可以参考前面的文章"玩转比特币私链"。
到目前为止,网上闪电网络有各种语言的实现,但是还没有release版本,都还是beta版本,以golang实现的lnd被关注度最高,实现的功能较为完整,也还没完全实现。另外C语言版本的lightning项目实现的比较稳定,功能上比lnd目前还稍有差距。
闪电网络是比特币的一个通道,对比特币节点具有依赖性,因此搭建一个闪电网络本地测试环境,主要需要编译两套项目,一套是比特币项目,一套是闪电网络项目。两套项目有不同社区,不同语言的实现。不同的比特币节点和不同的闪电网络节点建立连接实现有所不同,但是原理大同小异。这儿比特币项目选择bitcoin项目,闪电网络项目选择lnd,捎带讲点C语言的lightning项目。
1、搭建环境准备
编译bitcoin项目,获取bitcoind和bitcoin-cli两个执行文件。
编译lnd项目,获取lnd和lncli两个执行文件。
注意:编译bitcoin项目前需要安装libzmq3-dev包,否则编译出来的bitcoind文件的执行命令不会包含ZeroMQ notification options命令选项,如下图所示:

lnd节点和bitcoind节点走的是ZMQ协议,如果选用lnd作为闪电网络节点,需要指定ZeroMQ的一些选项;如果是lightning项目作为闪电网络节点,可以不需要,他们走的是其他通道。
2、建立闪电网络
启动比特币节点
执行如下指令,启动bitcoind:
./bitcoind -datadir=data -bind=0.0.0.0:18333 -rpcallowip=0.0.0.0/0 -rpcbind=0.0.0.0:18443 -rpcpassword=<比特币节点访问密码>-rpcuser=<比特币节点访问账号> -txindex -server -printtoconsole -zmqpubrawblock=tcp://0.0.0.0:28332 -zmqpubrawtx=tcp://0.0.0.0:28333
启动闪电网络节点
执行如下指令,启动lnd:
./lnd --lnddir=lnddata --bitcoin.active --bitcoin.node=bitcoind --bitcoin.regtest --debuglevel=debug --bitcoind.rpchost=127.0.0.1:18443 --bitcoind.rpcuser=<比特币节点访问账号> --bitcoind.rpcpass=<比特币节点访问密码> --bitcoind.zmqpubrawblock=tcp://127.0.0.1:28332 --bitcoind.zmqpubrawtx=tcp://127.0.0.1:28333 --rpclisten=localhost:10000 --restlisten=0.0.0.0:8081 --listen=0.0.0.0:9736
如果lnd节点执行后没啥问题,闪电基本已经建立起来。可以通过bitcoin-cli生成区块,查看节点显示信息的变化。
3、测试闪电网络
为了测试闪电网络,需要找一个闪电网络节点或者重新启动一个新的闪电网络节点。新节点可以和前面lnd在同一台电脑上启动,可以连接同一个比特币节点,只需修改闪电网络节点的监听端口即可。
假设前面的闪电网络节点取名为节点A,现在新的节点叫节点B,然后开始闪电网络测试。
创建钱包
./lncli --lnddir=lnddata -rpcserver=localhost:10000 -network=regtest create
分别用节点A和节点B对应的客户端lncli创建各自的钱包。密码需要大于8个字符,可以设置前3个字符大写。
解锁钱包
./lncli --lnddir=lnddata --network=regtest -rpcserver=localhost:10000 unlock
闪电网络做各种操作需要先解锁钱包。
获取闪电网络节点信息
./lncli --lnddir=lnddata --network=regtest -rpcserver=localhost:10000 getinfo
获取闪电网络节点信息可以获取到节点ID,其实节点的公钥(长度:33个字符),如下图所示:

链接节点
./lncli --lnddir=lnddata --network=regtest -rpcserver=localhost:10000 connect <public key>@ip:port
链接节点。可以在同一台设备上,只要端口不同即可。如果是节点A客户端执行上述命令,<public key>则为节点B的公钥。链接节点后可以通过命令查看节点列表。
创建通道
./lncli --lnddir=lnddata --network=regtest -rpcserver=localhost:10000 openchannel --node_key=<public key> --local_amt=20000
打开一个通道,这个通道的最低额度是20000聪,建立通道后要6个块后才能看到。这个<public key>和链接节点的<public key>一样,如果前面没有链接节点,这个命令也可以添加指定的链接节点参数进行链接后创建。
创建发票
./lncli --lnddir=lnddata --network=regtest -rpcserver=localhost:10000 addinvoice 10
由创建通道时链接的节点,节点B创建发票。
支付发票
./lncli --lnddir=lnddata --network=regtest -rpcserver=localhost:10000 sendpayment --pay_req=<pay_req>
用创建通道的节点,节点A支付发票。<pay_req>有创建发票是生成。
关闭通道
./lncli --lnddir=lnddata --network=regtest -rpcserver=localhost:10000 closechannel d7405fc57afca536b48e0a4a532ff89869affe4ac62d12e2c10677ed22dd65fa
可以由通道创建人关闭通道,关闭通道后,通道里的资金会回到各种的钱包账户里头。后面的参数是资金交易ID,可以通过查看通道信息获取。
查看钱包余额
./lncli --lnddir=lnddata --network=regtest -rpcserver=localhost:10000 walletbalance
查看通道余额
./lncli --lnddir=lnddata --network=regtest -rpcserver=localhost:10000 channelbalance
通过上述操作,基本可以完成一笔闪电网络的具体交易,更多的命令、参数,可以通过help查看。随着各大社区的对闪电网络的支持,各种命令会出现或多或少的差异,需要根据不同项目,不同版本做具体的分析。如果要用闪电网络开展业务,还需要更深入,更全面的学习~




