介绍
本教程适用于在 Ubuntu 18.04
上运行 LND 0.5.2-beta
和Bitcoin Core 0.17.1
,不同版本差距不会太大。目前闪电网络主要有三种实现,Blockstream
用C
语言实现的 Lightning
,Lightning Labs
个用 Golang
实现的 Lightning Network Daemon (LND)
,ACINQ
用 Scala
实现的 Eclair
, 这里我们选择 LND
来搭建我们自己的节点。
截止目前(数据来源:1ML):
- 节点数: 6838
- 通道数: 30823
- 网络容量: 732.44 BTC
Linxu
服务器配置:
- AWS Ubuntu 18.04
- 400G SSD
硬盘建议400G以上,因为目前比特币主网数据已经200G+了,并且区块数据还在不断增加。
安装 Bitcoind
-
bitcoind
安装安装包下载地址
进入下载目录
cd /work/bitcoin/
下载安装包
wget https://bitcoincore.org/bin/bitcoin-core-0.17.1/bitcoin-0.17.1-x86_64-linux-gnu.tar.gz
解压安装包
tar zxf bitcoin-0.17.1-x86_64-linux-gnu.tar.gz
创建软连接
ln -fs /work/bitcoin/bitcoin-0.17.1/bin/bitcoind /usr/local/bin/bitcoind ln -fs /work/bitcoin/bitcoin-0.17.1/bin/bitcoin-cli /usr/local/bin/bitcoin-cli
-
创建配置
创建比特币的数据存储目录
mkdir /work/bitcoin/datadir
比特币配置存储目录默认就是 ~/.bitcoin 这里我们手动创建
mkdir ~/.bitcoin
创建比特币的配置文件
vi ~/.bitcoin/bitcoin.conf # ~/.bitcoin/bitcoin.conf # 配置我们刚刚创建的数据存储目录 datadir=/work/bitcoin/datadir # 设置数据库缓存大小 dbcache=10240 # 交易索引 txindex=1就代表全节点 txindex=1 # rpc访问的user rpcuser=user # rpc访问的password rpcpassword=password # 后台启动 daemon=1 server=1 rest=1 # 闪电网络需要下面两行配置的支持 # 允许在本机端口28332上广播原始区块信息 zmqpubrawblock=tcp://127.0.0.1:28332 # 允许在本机端口28333上广播原始交易信息 zmqpubrawtx=tcp://127.0.0.1:28333
创建
service
文件sudo touch /etc/systemd/system/bitcoind.service sudo chmod 664 /etc/systemd/system/bitcoind.service sudo vi /etc/systemd/system/bitcoind.service
文件中添加如下内容
[Unit] Description=Bitcoin deamon service After=network.target [Service] User=root Group=root Type=forking PIDFile=/root/.bitcoin/bitcoind.pid ExecStart=/disk2/bitcoin/bitcoin-0.17.1/bin/bitcoind -daemon -conf=/root/.bitcoin/bitcoin.conf -pid=/root/.bitcoin/bitcoind.pid Restart=on-failure KillMode=process Restart=always TimeoutSec=120 RestartSec=30 [Install] WantedBy=multi-user.target
保存后退出
-
运行
启动配置文件
sudo systemctl enable bitcoind.service sudo service bitcoind start
查看
bitcoind
是否启动成功systemctl status bitcoind.service
显示结果如下代表
bitcoind
启动成功(Ctrl-C
退出)● bitcoind.service - Bitcoin deamon service Loaded: loaded (/etc/systemd/system/bitcoind.service; enabled; vendor preset: enabled) Active: active (running) since Thu 2019-02-21 11:05:01 UTC; 3 weeks 3 days ago Main PID: 2542 (bitcoind)
这时可以使用下面的命令查看
bitcoin
节点的监控日志(Ctrl-C
退出)tail -f /work/bitcoin/datadir/debug.log -n 200
如果一切顺利这个时候就可以使用比特币的
CLI
命令了bitcoin-cli getblockchaininfo { "chain": "main", "blocks": 567623, "headers": 567623, "bestblockhash": "000000000000000000235ebe51a7ac77ccac3edacc69ec6f9a6358ddd169d3af", "difficulty": 6068891541676.553, "mediantime": 1552901770, "verificationprogress": 0.9999975005433924, "initialblockdownload": false, "chainwork": "000000000000000000000000000000000000000005794deb1981367c12085090", "size_on_disk": 237720626781, "pruned": false ... }
至此比特币节点部分搭建完毕,剩下的就是漫长的等待节点数据同步了,我的大概同步了一天。
注意:
- 需要停止
bitcoind
程序的时候一定要正确停止,千万不能直接杀进程,不然下次启动的时候有可能需要很长时间来扫描数据库,可以使用下面的命令来停止bitcoind
服务sudo service bitcoind stop
-
bitcoind
才启动的时候可能会提示verifying blocks
, 这个是正常的,等一会就好。
- 需要停止
搭建 LND
-
LND
配置二进制文件下载地址
Github LND
进入用来存放闪电网络的数据
lnd
目录cd /work/lnd
下载
lnd
编译好的程序wget https://github.com/lightningnetwork/lnd/releases/download/v0.5.2-beta/lnd-linux-amd64-v0.5.2-beta.tar.gz
解压下载的文件
tar -xvf lnd-linux-amd64-v0.5.2-beta.tar.gz
解压文件结构很简单,里面只有两个可运行的程序
lnd
、lncli
-
lnd
: 闪电网络后台进程的守护程序,和比特币的bitcoind
类似 -
lncli
:闪电网络的CLI
程序,用来通过命令行操作闪电网络,和比特币的bitcoin-cli
类似
这里我们创建一个软连接方便以后使用
lncli
命令ln -fs /work/lnd/lnd-linux-amd64-v0.5.2-beta/lncli /usr/local/bin/lncli
接下来我们创建闪电网络的配置文件,默认的目录在
/root/.lnd
,我们创建lnd.conf
文件并填入下面的配置内容# LND Mainnet: lnd configuration # /root/.lnd/lnd.conf [Application Options] # 闪电网络的数据存储目录 如果不指定这个的话 默认在 /root/.lnd 路径下 datadir=/work/lnd/datadir/data # 日志输出目录 logdir=/work/lnd/datadir/logs adminmacaroonpath=/work/lnd/datadir/data/chain/bitcoin/mainnet/admin.macaroon debuglevel=info debughtlc=false maxpendingchannels=20 # 别名 自己节点对外展示的名字 展示在1ml上 alias=xxx's LND color=#68F442 # rpc监听的地址和端口 默认10009 rpclisten=localhost:10009 # 对外暴露的本机的外网ip 其他人可以通过这个ip地址连接我们的节点 externalip=xx.xx.xx.xx # 这两个用于其它地方服务器通过rpc访问节点 方便远程调试 #tlsextraip=xx.xx.xx.xx #tlsextradomain=xxx.com [Bitcoin] bitcoin.active=1 # enable either testnet or mainnet #bitcoin.testnet=1 # 指定bitcoin主网运行 bitcoin.mainnet=1 bitcoin.node=bitcoind #自动驾驶模式 开启之后可以自动帮我们连接节点 打开channel [autopilot] autopilot.active=1 autopilot.maxchannels=5 autopilot.allocation=0.1
更多的配置可以在这里 查看
-
接下来我们创建闪电网络的service
sudo touch /etc/systemd/system/lnd.service
sudo chmod 664 /etc/systemd/system/lnd.service
sudo vi /etc/systemd/system/lnd.service
配置如下
[Unit]
Description=LND Lightning Daemon
After=network.target
[Service]
User=root
Group=root
Type=simple
PIDFile=/root/.lnd/lnd.pid
ExecStart=/work/lnd/lnd-linux-amd64-v0.5.2-beta/lnd --configfile=~/.lnd/lnd.conf
restart=on-failure
KillMode=process
TimeoutSec=180
RestartSec=60
[Install]
WantedBy=multi-user.target
-
启动
LND
配置完成后就可以通过下面的命令来启动
lnd
sudo systemctl enable lnd.service sudo service lnd start
之后可以通过这个命令来查看
lnd
程序有没有启动成功ps -ef | grep lnd
能看到我们刚才的配置的话,
lnd
就算启动成功了。 -
创建闪电网络比特币钱包
这里我们可以等我们的比特币区块数据同步完成之后进行,因为后面的操作部分涉及上链。
我们先测试一下 CLI
是否已经完全配置好了, 正常的返回应该像下面这样
root@test:~# lncli getinfo
{
"identity_pubkey": "0274a542b693385f9e38d7acf4017ed31748d00693ff219c54e1b337495xxxxxx",
"alias": "xxx's LND,
"num_pending_channels": 0,
"num_active_channels": 21,
"num_peers": 29,
"block_height": 568269,
"block_hash": "0000000000000000001082cd0456f576eb99ae71e289501274d139a0334ec413",
"synced_to_chain": true,
"testnet": false,
"chains": [
"bitcoin"
],
...
"best_header_timestamp": "1553248518",
"version": "0.5.2-beta commit=v0.5.2-beta",
"num_inactive_channels": 6
}
接下来就可以创建一个钱包了啦
root@test:~# lncli create
Input wallet password:
Confirm wallet password:
Do you have an existing cipher seed mnemonic you want to use? (Enter y/n): n
Your cipher seed can optionally be encrypted.
Input your passphrase you wish to encrypt it (or press enter to proceed without a cipher seed passphrase):
Generating fresh cipher seed...
!!!YOU MUST WRITE DOWN THIS SEED TO BE ABLE TO RESTORE THE WALLET!!!
---------------BEGIN LND CIPHER SEED---------------
1 xxxx
...
24 xxxx
---------------END LND CIPHER SEED-----------------
!!!YOU MUST WRITE DOWN THIS SEED TO BE ABLE TO RESTORE THE WALLET!!!
lnd successfully initialized!
基本流程就是输入需要设置的钱包密码,确认钱包密码,输入n选择创建一个新的钱包,提示是否需要对 seed
加密,我选择直接回车跳过,最后就是最重要的24个助记词了,自行想办法保存好,毕竟恢复钱包就靠它了。
钱包好了之后就该生成一个比特币地址了,命令如下
root@test:~# lncli newaddress np2wkh
{
"address": "bitcoin address"
}
然后就是找个有 btc
的钱包往这个地址转点币就好了(不要转太少,100w Sats以上吧),剩下的就是等待区块确认之后到账, 可以使用下面的命令查看钱包余额是否到账
root@test:~# lncli walletbalance
{
"total_balance": "2463978",
"confirmed_balance": "2463978",
"unconfirmed_balance": "0"
}
在确认钱包到账之后就可以连接其它的节点了。
-
连接节点
我们去 1ML 上面找一个大一点的节点连它,我发现 LightningPowerUsers 这个节点连接的
Channel
最多,我们就连它了root@test:~# lncli connect 0331f80652fb840239df8dc99205792bba2e559a05469915804c08420230e23c7c@74.108.13.152:9735 { }
-
打开
channel
连上之后我们需要和这个节点建立一个
channel
root@test:~# lncli openchannel 0331f80652fb840239df8dc99205792bba2e559a05469915804c08420230e23c7c 397741 { "funding_txid": "4c02e76b315008db58686a433f20b264850cef36e33f18ea51f9afb946a21802" }
这里我们打开了一个容量为
397741 sats
的channel
, 返回一个funding_txid
就代表成功了,剩下的就是等链上确认了,我们可以查看这个状态root@test:~# lncli pendingchannels { "total_limbo_balance": "0", "pending_open_channels": [ { "channel": { "remote_node_pub": "0331f80652fb840239df8dc99205792bba2e559a05469915804c08420230e23c7c", "channel_point": "4c02e76b315008db58686a433f20b264850cef36e33f18ea51f9afb946a21802:0", "capacity": "397741", "local_balance": "393282", "remote_balance": "0" }, "confirmation_height": 0, "commit_fee": "4459", "commit_weight": "600", "fee_per_kw": "6159" } ], "pending_closing_channels": [ ], "pending_force_closing_channels": [ ], "waiting_close_channels": [ ] }
-
收款
接下来我们可以发送和接收
sats
了,我们先接收一笔sats
生成一张 15
sats
的invoice
root@test:~# lncli addinvoice --amt 15 { "r_hash": "b94768e4e2e89a78ea9fcfdba9c7429236cc4ad3f97fb9fd617b4ecb6876c129", "pay_req": "lnbc150n1pwff3wcpp5h9rk3e8zazd8365leld6n36zjgmvcjknl9lmnltp0d8vk6rkcy5sdqqcqzys7mga69gjmqqumssmzw649868udsvt8l5q6y069fwkqp55z89hpj4cucrrge9yxmak6kw09j837nc7q3p98gjajvsld3zh2svyufu2qcpldu7fa", "add_index": 549 }
pay_req
就是我们生成的invoice
了,我们可以使用其它的闪电网络钱包向这个invoice
付款啦,可以通过下面的命令查看付款状态root@test:~# lncli listinvoices { "invoices": [ { "memo": "xxxx", ... "value": "15", "settled": true, "creation_date": "1553259149", "settle_date": "0", "payment_request": "lnbc150n1pwff3wcpp5h9rk3e8zazd8365leld6n36zjgmvcjknl9lmnltp0d8vk6rkcy5sdqqcqzys7mga69gjmqqumssmzw649868udsvt8l5q6y069fwkqp55z89hpj4cucrrge9yxmak6kw09j837nc7q3p98gjajvsld3zh2svyufu2qcpldu7fa", "description_hash": null, "expiry": "3600", ... "amt_paid_sat": "0", "amt_paid_msat": "0" } ] }
settled = true
标志着这笔交易已经付款成功,invoice
才生成的时候默认的状态是settled = false
。 -
付款
我们去 Yalls 找了一篇文章生成一张金额为
150 sats
收款的invoice
, 生成的invoice
如下lnbc1500n1pwfmv52pp57whmew9gear9faxtwcq9k8kmp0kl82l96kck5l29vfpmlsts450qdp62fjkzep6ypxhjgrhd9nx2grhv9h8gueqvysyx6rfde3ks6tvd3sjut3wp5cqzysxqr23syfc86vht588l6s0g3y7xgd9wcf6jfc7eghcyxsrzy49pvsw3e73rfsgjctc4cd2vevef6eutlv67dyzjc70n4xkjm5zykvrld5chktspelxt0c
我们可以通过命令解析这张
invoice
root@test:~# lncli decodepayreq lnbc1500n1pwfmv52pp57whmew9gear9faxtwcq9k8kmp0kl82l96kck5l29vfpmlsts450qdp62fjkzep6ypxhjgrhd9nx2grhv9h8gueqvysyx6rfde3ks6tvd3sjut3wp5cqzysxqr23syfc86vht588l6s0g3y7xgd9wcf6jfc7eghcyxsrzy49pvsw3e73rfsgjctc4cd2vevef6eutlv67dyzjc70n4xkjm5zykvrld5chktspelxt0c { "destination": "03d06758583bb5154774a6eb221b1276c9e82d65bbaceca806d90e20c108f4b1c7", "payment_hash": "f3afbcb8a8cf4654f4cb76005b1edb0bedf3abe5d5b16a7d456243bfc170ad1e", "num_satoshis": "150", "timestamp": "1553838730", "expiry": "10800", "description": "Read: My wife wants a Chinchilla...\r", "description_hash": "", "fallback_addr": "", "cltv_expiry": "144", "route_hints": [ ] }
确认金额是
150 sats
后就可以付款了root@test:~# lncli payinvoice lnbc1500n1pwfmv52pp57whmew9gear9faxtwcq9k8kmp0kl82l96kck5l29vfpmlsts450qdp62fjkzep6ypxhjgrhd9nx2grhv9h8gueqvysyx6rfde3ks6tvd3sjut3wp5cqzysxqr23syfc86vht588l6s0g3y7xgd9wcf6jfc7eghcyxsrzy49pvsw3e73rfsgjctc4cd2vevef6eutlv67dyzjc70n4xkjm5zykvrld5chktspelxt0c Description: Read: My wife wants a Chinchilla... Amount (in satoshis): 150 Destination: 03d06758583bb5154774a6eb221b1276c9e82d65bbaceca806d90e20c108f4b1c7 Confirm payment (yes/no): yes { "payment_error": "", "payment_preimage": "6bafcc544e72a63073da0fb7026e8d9962b1f85b2b357c8ccdbf720cba201dfa", "payment_route": { "total_time_lock": 569861, "total_amt": 150, "hops": [ { "chan_id": 620276290726395904, "chan_capacity": 150000, "amt_to_forward": 150, "expiry": 569717, "amt_to_forward_msat": 150001, "pub_key": "0395033b252c6f40e3756984162d68174e2bd8060a129c0d3462a9370471c6d28f" }, { "chan_id": 622138863466053632, "chan_capacity": 40000, "amt_to_forward": 150, "expiry": 569573, "amt_to_forward_msat": 150001, "pub_key": "037eb17d0fee2d20bacea3d78940b40f4ac61a5a7040a23b6e8280c80d7ebfb420" }, { "chan_id": 611030497408253952, "chan_capacity": 1000000, "amt_to_forward": 150, "expiry": 569429, "amt_to_forward_msat": 150000, "fee_msat": 1, "pub_key": "02e2670a2c2661a9eea13b7cfdcdd7f552f591b9ee60e5678b7abe77b7f9516f96" }, { "chan_id": 613156952970100736, "chan_capacity": 1000000, "amt_to_forward": 150, "expiry": 569419, "amt_to_forward_msat": 150000, "pub_key": "020e56a13babec99abdc2c4afbe34e1e44230d79b234c059fd4ff1e367765fdb1b" }, { "chan_id": 624006933702770688, "chan_capacity": 5000000, "amt_to_forward": 150, "expiry": 569419, "amt_to_forward_msat": 150000, "pub_key": "03d06758583bb5154774a6eb221b1276c9e82d65bbaceca806d90e20c108f4b1c7" } ], "total_fees_msat": 1, "total_amt_msat": 150001 } }
付款成功
-
其它命令
可以通过
lncli -h
查看更多命令 -
参考文章以及资源网站
比特币BTC全节点搭建
the installation instructions
Bitcoin Lightning Network #1: Can I compile and run a node?
手把手教你在树莓派上部署比特币闪电节点+全节点
LIGHTNING NETWORK RESOURCES