Linux上搭建比特币闪电网络节点

介绍

本教程适用于在 Ubuntu 18.04 上运行 LND 0.5.2-betaBitcoin Core 0.17.1,不同版本差距不会太大。目前闪电网络主要有三种实现,BlockstreamC语言实现的 LightningLightning Labs 个用 Golang 实现的 Lightning Network Daemon (LND)ACINQScala 实现的 Eclair, 这里我们选择 LND 来搭建我们自己的节点。

截止目前(数据来源:1ML):

  • 节点数: 6838
  • 通道数: 30823
  • 网络容量: 732.44 BTC

Linxu 服务器配置:

  • AWS Ubuntu 18.04
  • 400G SSD

硬盘建议400G以上,因为目前比特币主网数据已经200G+了,并且区块数据还在不断增加。

安装 Bitcoind

  1. 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
    
  2. 创建配置

    创建比特币的数据存储目录

    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
    

    保存后退出

  3. 运行

    启动配置文件

    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

  1. 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 
    

    解压文件结构很简单,里面只有两个可运行的程序 lndlncli

    • 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
  1. 启动 LND

    配置完成后就可以通过下面的命令来启动 lnd

    sudo systemctl enable lnd.service
    sudo service lnd start
    

    之后可以通过这个命令来查看 lnd 程序有没有启动成功

    ps -ef | grep lnd 
    

    能看到我们刚才的配置的话,lnd 就算启动成功了。

  2. 创建闪电网络比特币钱包

    这里我们可以等我们的比特币区块数据同步完成之后进行,因为后面的操作部分涉及上链。

我们先测试一下 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"
}

在确认钱包到账之后就可以连接其它的节点了。

  1. 连接节点

    我们去 1ML 上面找一个大一点的节点连它,我发现 LightningPowerUsers 这个节点连接的 Channel 最多,我们就连它了

    root@test:~# lncli connect 0331f80652fb840239df8dc99205792bba2e559a05469915804c08420230e23c7c@74.108.13.152:9735
    {
    
    }
    
  2. 打开 channel

    连上之后我们需要和这个节点建立一个 channel

    root@test:~# lncli openchannel 0331f80652fb840239df8dc99205792bba2e559a05469915804c08420230e23c7c 397741
    {
     "funding_txid": "4c02e76b315008db58686a433f20b264850cef36e33f18ea51f9afb946a21802"
    }
    

    这里我们打开了一个容量为 397741 satschannel , 返回一个 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": [
        ]
    }
    
  3. 收款

    接下来我们可以发送和接收 sats了,我们先接收一笔 sats

    生成一张 15 satsinvoice

    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

  4. 付款

    我们去 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
     }
    }
    

    付款成功

  5. 其它命令

    可以通过 lncli -h 查看更多命令

  6. 参考文章以及资源网站
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 160,706评论 4 366
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 68,002评论 1 301
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 110,462评论 0 250
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,375评论 0 216
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,763评论 3 294
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,849评论 1 224
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,033评论 2 317
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,768评论 0 204
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,490评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,734评论 2 253
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,204评论 1 264
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,566评论 3 260
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,227评论 3 241
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,137评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,934评论 0 201
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,926评论 2 283
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,774评论 2 274