手把手教你在树莓派上部署比特币闪电节点+全节点
Beginer’s Handbook: How to Set up Your Bitcoin Full Node and Lightning
Node on Raspberry Pi
QuantumCat邪恶猫
1.
引言
本文假定读者是零基础的,只会使用windows系统,要在自家搭建一个基于树莓派、成本低廉、功耗极小、24小时运行的比特币全节点+闪电节点。因此本文会尽可能详细地将细节给出,如果有什么地方写不对或者不清晰烦请指出,也烦请各路高手和前辈指出不足和改进的地方。
本文力求让零基础的读者都能读懂,能够根据笔者的介绍step-by-step搭建节点,并且借此普及尽可能多的基础技能(比如bitcoin和lnd命令行钱包的基本操作,Linux系统的基本操作方法),同时希望将自由意志主义者的价值追求融于文中,向读者展示比特币这一密码朋克运动孜孜以求的自由价值。
当今整个加密货币社区因为利益问题产生了一些无聊的争执,甚至有些比特币改革方案的宣传文案完全背离了peer-to-peer系统的根本特征:足够多的人在尽可能坏的情况下独立运行一个点对点的网络。本文的目的就是尽可能让更多的人理解密码朋克追求自由的价值取向,独立运行比特币全节点和闪电节点。
树莓派到底是什么呢?树莓派就是一台信用卡大小的完整的电脑,上面有cpu、gpu、网卡、蓝牙、usb接口等等很多电脑必备要素,同时还有很强的扩展性,可以自己搭各种硬件设备在其上,比如风靡一时的谷歌语音助手(Google
voice kit),或者自己买各种传感器模块来搭建自己设计的设备(这些模块一般都很便宜,几块钱人民币而已)。当然,树莓派受制于其硬件规格,性能是不能跟日常生活中的电脑相媲美的。
笔者衷心希望阅读本文的读者愿意搭建一个全节点+闪电节点,捍卫我们的网络。本文的所述的方案成本低廉,而且24小时运行耗电极小,大约相当于电视机关闭而没有拔掉电源的耗电量,少之又少,适合家庭部署。如果运行全节点是没有回报的,那么很难激励人们部署全节点,而闪电网络给了我们无限想象的可能,他让节点运营者可能收取少量通道手续费,同时,给了geek们可能的开发回报,比如https://satoshis.space
让劳动(开发)获得回报。资本具有边际产出,但是从来都没“历史选择了谁谁谁”这种一劳永逸的东西,劳动永远是价值产生的源泉。我相信,愿意动手搭建一组节点的crypto
enthusiasts 一定能够理解,资金盘下炒币致富的幻想是一种根本而纯粹的泡沫,真正崇尚自由的年轻人一定深谙go
to find a job的道理和必要性。
闪电网络、Rsk、Mast、Schnorr等等一系列第二层网络的搭建,让比特币保持主链的简单(因此维护成本极低)的前提下,让各种各样的功能和扩展性在第二层网络百花齐放,并且进一步在第二层网络上实现了开发的去(/弱)中心化。正如各种竞争币一样充满了潜在问题,第二层网络也一样,闪电网络目前还有很多不足,因此也有很多改进方案,但是分层扩容发展势必是比特币不破坏p2p特性的选择。
第二层网络的安全性仍然依赖第一层主网,因此怎样保持主网的足够去中心化,并且不被各种政治经济强权把持,势必也是未来的一大问题。我们是否需要更加鲁棒的主链?笔者认为是需要的,但这不能牺牲整个p2p网络的鲁棒性。前路漫漫,笔者对此并不乐观,但这是密码朋克几十年来一直面临的问题,而比特币给我们带来了可能。
本文参考了https://github.com/Stadicus/guides/blob/master/raspibolt/README.md
,https://medium.com/@ismailakkila/bitcoin-setup-your-own-lightning-node-on-mainnet-94337bda09fa
,http://bedtillnoon.blogspot.com/2017/12/building-bitcoin-lightning-testnet-node.html
以及@P2PBUCKS
第一时间关于搭建闪电网络的帖子,以及LND的教程文档https://dev.lightning.community/
。特别是第一篇参考文献(作者@stadicus
)中的.conf和.service等配置文件编写方式和部分步骤,笔者几乎直接复制过来。
本文第2节将介绍准备工作,第3节介绍比特币全节点的校验、同步,第4节介绍怎样安装配置树莓派,并通过SSH进行访问、设置,第5节介绍将外置硬盘安装在树莓派上的方法,第6节介绍在树莓派上安装并配置好供给闪电网络使用的全节点钱包的方法,第7节介绍闪电网络程序(LND)的配置方法,第8节介绍闪电钱包的操作方法,第9章介绍迁移到主网的方法。
本文欢迎任何形式的转发,无须告知笔者,当然笔者也希望能附上笔者的昵称和签名,以及笔者的打赏地址:
比特币:36QRac7QyyzF4JdeNN7WKvTQyShn7tnQS3
以太坊:0x8F2085Db36f5306D7A29199661be121F733b9727
本文前3段的内容签名:
https://press.one/file/v?s=d9a3db37717decd2a1229cba5a35f5db49668fa0a517dcdc9e5b015a5d1ec79eff5ff9fa6537f3d696d8139530f851968d111ebea110c35e79fac49a4bc740d70&h=a219b3e2d96461e55e1366086a26cca15a140a147edb816eb03c16f48b24d0a1&a=1bbc0729ad7339ca45eaf171e2bf50929aad94c5&f=P1&v=2
2.
准备工作
假定读者家里都有一个路由器,毕竟现在Wi-Fi是非常普及的。
1、 购买一个树莓派Raspberry
Pi 3 model b或更好的版本,带电源;
2、 获得一块至少500MB的硬盘,最好能达到2TB,可以从旧电脑上拆下来,或者去淘宝上购买二手货,甚至去电脑城里收电子垃圾;
3、 购买一个外置硬盘盒,带电源的(5
V/1.2 A以上),树莓派USB接口的电压输出不足以带动整个硬盘转,因此需要一个外置电源;
4、 购买一张SD卡,以及SD卡读卡器。如果有老的安卓手机/数码相机上有不要的SD卡,最好不过。8G就够了,16G或者32G也可以,初学者不要买64G以上的,因为格式化为FAT32文件系统会出问题(当然也有别的解决方案,本文不加赘述);
5、 树莓派保护壳,笔者认为是重要的;
6、 在手机上下载CoinClip并同步,这是一款LND开发的闪电网络测试网钱包,已上线ios和安卓。本文第八节将会详细介绍将配置好的闪电节点网络从测试网转移到主网的方法,但在此之前希望读者先通过测试网熟悉操作。
以上最贵的应该就是树莓派主板,200-300元人民币。
注意,本文会要求读者创建多个密码,请准备好纸和笔记录,并妥善保管。
3.
同步比特币全节点
3.1 下载比特币全节点钱包
比特币全节点的总区块目前超过190GB,因此需要提前同步好。
前往https://bitcoin.org/zh_CN/download
下载比特币全节点钱包,根据自己的电脑配置选择,比如大部分人使用windows-64位系统,就下载对应版本,保存在D:\Bitcoin
目录下。
3.2 校验钱包文件SHA256哈希
点击“验证发布的签名”,下载了一个文件叫SHA256SUMS.asc,也保存在D:\Bitcoin
目录下。
接下来我们要做一件看似多余的工作,但是真正的自由意志主义者会认为这是非常必要的工作:验证你下载的bitcoin钱包是未经他人篡改过的。
在windows运行界面搜索Windows
PowerShell, 并运行。
(Tips:
一般的Linux系统里是内置了一个命令行终端,而实际上windows系统里内置了两个命令行终端,一个是人们非常熟悉的cmd,另一个就是PowerShell.
使用windows的人一般常常使用cmd,这应该是传统使然。但是笔者更建议使用PowerShell,因为这个脚本系统更接近于Linux,而且功能更加强大,长得也比较好看,微软公司现在也更提倡,此外,有不少命令行程序其实家庭版系统的cmd里并没有预装。)
运行PowerShell,
将目录切换到D:\Bitcoin
下,并输入”ls”命令查看我们的文件是否已经保存在这里了。
>
D:
>
cd Bitcoin
>
ls
“>”前的路径表示当前所在路径。
任何一个文件都有一个哈希值,相当于这个文件的指纹,只要稍微修改哪怕一个字符,文件的哈希值都会面目全非。因此,只要比对文件的SHA256哈希值,就能知道文件是否被篡改过。我们查看比特币安装包文件的哈希值:
>
Get-FileHash .\bitcoin-0.16.1-win64-setup.exe
(Tips:
输入文件名时,输入“bi”再按Tab键,系统会自动补全全称)
然后将SHA256SUMS.asc文件里记录的文件hash用”cat”命令打印到屏幕上
>
cat SHA256SUMS.asc
只要我们得到的哈希结果匹配,就说明我们下载的钱包安装文件是没有问题的。既然没有问题,那么就可以双击安装文件,安装bitcoin全节点钱包了。
检验校验和,正是密码朋克的根本哲学:Don’t
trust, verify!
3.3 同步区块
首次打开bitcoin-qt.exe钱包程序的时候,会要求你选择一个路径保存区块文件。我们将区块文件保存在D:\Bitcoin\block
中。
不过,在开始同步区块之前,我们要在钱包的 设置
> 选项 中打开配置文件(或者直接打开D:\Bitcoin\block\bitcoin.conf),在这个空白记事本中加上一行:
txindex=1
然后保存关闭。
这是什么意思呢?一般而言,比特币钱包默认参数txindex=0,
但是我们要配置闪电节点,因此需要令txindex=1,
这样我们的闪电节点才能直接对交易进行搜索,这也是所有开发者都必须打开的功能。相信玩过山寨币特别是主节点币的朋友对这个配置文件非常熟悉了。
接下来就等待漫长的节点同步。可以先做别的事情了。
4.
树莓派的Linux操作系统安装和网络配置
4.1 烧录树莓派系统
树莓派就一张信用卡大小,而且很多人使用树莓派就图个低廉,是不会买键盘/屏幕/鼠标的,因此我们只能安装纯命令行的linux系统。
前往树莓派操作系统官方网站:https://www.raspberrypi.org/downloads/raspbian/
我们下载Raspbian
stretch lite, 并用前述方法比对文件的SHA256哈希值。
将压缩包解压,得到一个操作系统镜像文件2017-11-29-raspbian-stretch-lite.img
。接下来,我们要把这个操作系统烧录到我们的SD卡上,这张SD卡今后将永远插在树莓派上充当“系统盘”。
首先我们需要去https://www.sdcard.org/downloads/formatter_4/eula_windows/index.html 下载SD卡格式化工具,安装程序之后,将SD卡插入,运行程序,将SD卡格式化。
格式化之后,我们就可以将系统烧入进SD卡了。使用Win32
Disk Imager(下载地址: https://sourceforge.net/projects/win32diskimager/)或者到https://etcher.io/ 下载Etcher烧录程序,选择待烧入的2017-11-29-raspbian-stretch-lite.img
文件和待烧入的SD卡,一键操作,非常简单。事实上如果有自己捣鼓系统的经验,用任何一种烧录程序都可以。烧入完之后,在SD卡的根目录里创建一个空文件“ssh”,不需要加任何扩展名。
这样,把SD卡插入树莓派的SD卡卡槽,接通电源,我们的树莓派就完成了。在触碰树莓派之前,请将你的手在附近的接地/大容量金属设备(桌子啦,门啦)多触摸几次,排除静电,避免树莓派主板被静电击穿的风险(笔者甚至击穿过自己的笔记本电脑主板)。
不过,为了尽可能减少成本,这个树莓派没有输入输出设备(键盘、鼠标、显示屏),因此我们需要通过自己的电脑与之相沟通。
4.2 为树莓派配置网络连接和基本设置
此时此刻,我们首先需要给树莓派分配一个固定ip地址,并且通过ip地址让我们的笔记本电脑找到这台树莓派。
将我们的笔记本电脑通过WiFi连接,在浏览器输入192.168.1.1
访问自家的路由器(有的路由地址是192.168.0.1,可以在powershell命令行中输入ipconfig查看Gateway一项)。此时会要求输入路由器的管理员用户名密码。一般默认用户名和密码都是admin
(如果你没有修改过密码,强烈建议修改!)。如果不是的话,上网查一下你购买的路由器厂商的默认密码。
查看接入路由器的设备列表。浏览器会列出该设备的名字、ip地址、mac地址。
用一条网线,将树莓派跟家里的路由器的以太网(Ethernet)口相连,一般这些接口有标注数字。此时路由器会给树莓派自动分配ip地址。在上述路由器列表中刷新一次,也会发现一个新的设备:
从图中可以看出,笔者的树莓派设备名为 RASPBERRYPI, ip地址是192.168.1.11 (这是一个局域网地址,因人而异)。有了这个ip地址,我们就可以通过我们的笔记本电脑访问树莓派了。
此时,树莓派相当于局域网内的一台主机,我们需要有一个Security
Shell(SSH)软件来访问这台linux系统的主机。主流的方式是推荐PUTTY,但是笔者认为PUTTY很难用,因此推荐XShell,这款软件虽说是收费,但是对个人用户/教育用户是免费的,可以通过这个链接下载、获取license: https://www.netsarang.com/download/free_license.html
(不要下载最新版的XShell
6,只有30天试用期,XShell
5就可以免费长期使用)。
安装完了以后,启动XShell,点击创建新会话(New
Session),协议选择SSH,
主机(Host)处填写树莓派的IP地址,端口选择22端口。22号端口是ssh协议的默认端口。
成功连接之后,树莓派的默认用户名为pi,默认密码raspberry,
输入之后成功远程登陆树莓派。
进入树莓派之后,首先我们要修改用户pi的密码(“$” 前是当前路径名,不需要输入):
$
sudo passwd pi
此时输入密码并确认,屏幕不会有任何显示。(tips:本文会要求读者设置多个密码,请拿一张纸把自己设置的密码记录下来)
提示:Linux系统中,复制一般是Ctrl+Insert,粘贴是Shift+Insert,而Ctrl+C一般是用来强制中断运行一半的程序。
有使用过Ubuntu系统的朋友知道,当前用户可以通过“sudo”命令调用管理员权限(root权限),但是ubuntu电脑的个人账户是无法直接使用root权限的,但是树莓派系统是可以修改root权限密码的,因此我们采用下述命令设置root用户的密码,请采用一个与pi用户不一样的密码:
$
sudo passwd root
接下来,就可以用”su”
命令切换账户:
$ su
pi
$ su
root
接下来,我们需要给树莓派分配一个固定pi,这样我们才能每次都轻松随便访问:
$ sudo nano /etc/dhcpcd.conf
Sudo就是调用root权限,nano则是linux系统下的记事本,经常使用linux的同学会觉得nano很难用,对有经验的用户也可以改成gedit甚至vim。/etc目录储存有大量系统配置文件。打开dhcpcd.conf文件之后,输入下面四行内容:
interface wlan0
static ip_address=192.168.1.11/24
static routers=192.168.1.1
static domain_name_servers=192.168.1.1 10.18.0.1
然后按Ctrl+X保存退出。文件dhcpcd.conf就是对树莓派进行网络配置的文件,第一行wlan0表示无线网络连接,也就是wifi;第二行就是设置静止ip,/24表示子网掩码255.255.255.0;第三行就是设置路由器ip;第四行则是默认的DNS域名解析服务。DNS就是把我们输入的网址转化为xxx.xxx.xx.xx的ip地址的列表,墙外的朋友可以采用谷歌的DNS
(将10.18.0.1改为8.8.8.8),或者搜索任何一个你觉得ok的DNS域名解析,比如114.114.114.114。
如果你的路由段是192.168.0.x则ip和路由也要做相应修改
注意:网上有很多关于设置树莓派静态ip的方法是错的,树莓派的操作系统跟ubuntu还是有细微差别,不能全部通用,笔者特别查证了此处修改interface的方法才是最简单正确的。
检查一下网络连接:
$ ping c -4 baidu.com
Ping命令是用来发送数据包检查网络质量的,后面跟的网址主要的应用价值也是如此。如果正常返回四个数据包,则你的连接是正常的,可以继续下一步操作。
接下来我们要进行一个Linux系统的日常操作,保持系统更新,按顺序输入:
$ sudo apt-get update
$ sudo apt-get upgrade
经常使用Linux一定非常熟悉这两个命令,它使得我们的linux系统保持更新,这也是linux这个开源社区的伟大之处。使用linux系统要安装新程序时不要忘记进行一次更新操作。
有线连接总归是不方便的,因此我们要给树莓派设置WiFi连接方式。打开文件:
$ sudo nano /etc/wpa_supplicant/wpa_supplicant.conf
在文档最后输入:
network={
ssid="你家wifi名"
psk="你家wifi密码"
}
保存文件,然后把有线网断了就能连上WiFi了。注意,校园网用户可能需要编辑hidden
network,修改方式有所不同。
注意,树莓派是linux系统,随意断电关机有可能造成数据损坏。每次关机都应该键入下列命令:
$
sudo shutdown -h now #关机
$
sudo shutdown -r now #重启
4.3 端口权限设置
P2P网络使用的端口往往比较特殊,比特币使用8333端口,比特币测试网使用18333端口,闪电网络使用9735端口,因此我们需要在路由器上为树莓派开放端口。
输入192.168.1.1进入路由管理界面,找到端口管理(Port
forwarding / port triggering)为树莓派的ip地址配置允许上述三个端口的TCP/UDP协议出入访问。
4.4 安全设置
网络安全很重要,因此我们需要给树莓派加个防火墙。Linux系统下的应用规则比较统一,因此防火墙就是管理端口(其实windows也是),我们使用UFW程序。关于UFW详细配置可以查看https://www.digitalocean.com/community/tutorials/ufw-essentials-common-firewall-rules-and-commands
,这里笔者列出我们需要的操作:
$
sudo apt-get install ufw
$ sudo
ufw default deny incoming
$ sudo
ufw default allow outgoing
$ sudo
ufw allow from 192.168.1.0/24 to any port 22 comment 'allow SSH from local LAN'
$ sudo
ufw allow from 192.168.1.0/24 to any port 50002 comment 'allow Electrum from
local LAN'
$ sudo
ufw allow 9735 comment 'allow Lightning'
$ sudo
ufw allow 8333 comment 'allow Bitcoin mainnet'
$ sudo
ufw allow 18333 comment 'allow Bitcoin testnet'
$ sudo
ufw enable
$ sudo
systemctl enable ufw
$ sudo
ufw status
上述第4、5行允许了局域网内的用户通过SSH(端口22)和Electrum(端口50002)访问树莓派,如果你的路由段是192.168.0.0记得做出相应修改。第6-8行是允许树莓派的9735、8333、18333三个端口进出。最后一行是查看目前的防火墙状态,输入最后一行后,应该能看到:
然后安装fail2ban程序,该程序使得登陆树莓派输入密码5次失败就被禁止登陆10分钟,可以防止暴力破解密码进入我们的树莓派
$
sudo apt-get install fail2ban
如果这个节点储存了较多的比特币,最好设置必须通过SSH
key的方式访问树莓派,如果还要作为satoshis.place之类的服务端,还应该设置防DDoS攻击的方案。这些操作比较进阶,本文就略过,相信有这类需求的朋友很容易查到怎么进行这类操作。
此外,从服务器管理者的角度讲,当前用户pi以及管理员账户root的权限都太高,我们希望之后在做维护的时候,采用权限不高的账户,这个账户可以修改bitcoin和闪电网络的相关配置,但不能修改系统基本配置。为此我们创建一个账户,取名bitcoin,并且记下密码:
$
sudo adduser bitcoin
以后也可以用这个账户密码登陆树莓派。
至此,我们的树莓派基本配置结束了。
5.
将外置硬盘安装在树莓派上
首先,我们将外置硬盘接上电源,并通过USB接口接在树莓派上。
硬盘有不同的文件系统,是系统对硬盘进行操作的规则。一般来说,Windows系统的硬盘采用NTFS或者FAT32文件系统,而Linux的标准文件系统则是Ext4。因此,我们要把这块硬盘格式化为Ext4文件系统,而第一步就是获取硬盘的基本信息:
$
lsblk -o UUID,NAME,FSTYPE,SIZE,LABEL,MODEL
可见,笔者这块1TB大小的硬盘名字叫sda,接着就能进行格式化操作(该操作也可以在Windows系统下,用DiskGenius软件进行,不过笔者建议直接命令行解决):
$
sudo mkfs.ext4 /dev/sda
此处需要将“sda”改成你的硬盘名。运行完这行脚本,系统会返回硬盘的基本信息,其中有一个UUID
可见,笔者硬盘的UUID是f6e448d8-ae50-4245-ac5d-aeb20cb1c512。将UUID复制下来,之后还要用到。
编辑fstab文件:
$ sudo
nano /etc/fstab
在文档最后加上(记得将UUID改成你的):
UUID=
f6e448d8-ae50-4245-ac5d-aeb20cb1c512 /mnt/hdd ext4 noexec,defaults 0 0
创建用于mount硬盘的文件目录:
$
sudo mkdir /mnt/hdd
并将硬盘mount在我们的系统上
$
sudo mount -a
使用df命令查看硬盘是否成功接上:
$ df
/mnt/hdd
我们将得到:
这表示我们的硬盘成功接在树莓派上了。
前面说到安全设置的时候提到了我们专门创建了一个名为bitcoin的用户来操作比特币和闪电网络,那么,我们要给该用户操作硬盘的权限:
$
sudo chown -R bitcoin:bitcoin /mnt/hdd/
参数-R表示允许处理该目录下的一切操作。我们切换用户到bitcoin上:
$
sudo su bitcoin
然后进入硬盘(也就是/mnt/hdd目录,linux下没有分区的概念,万物皆文件),并创建一个名为bitcoin的文件夹,然后退出bitcoin用户:
$ cd
/mnt/hdd
$
mkdir bitcoin
$ ls
-la
$
exit
注意绿色字体@前的用户名从pi改成了bitcoin:
使用windows系统时一般我们会在硬盘上创建一个虚拟内存,以防内存不够。同样的,linux系统里也有类似的设定,叫做交换空间(swap)。一般服务器系统没有swap系统,需要手工添加。而我们的SD卡太小了,swap放在SD卡上会使性能下降,因此将swap放置在硬盘上:
打开swap配置文件:
$
sudo nano /etc/dphys-swapfile
将文件中的内容改为(如不存在就在末尾创建新的,#开头的行表示注释):
CONF_SWAPFILE=/mnt/hdd/swapfile
CONF_SWAPSIZE=1000
然后删除旧的swap
:
$
sudo dphys-swapfile swapoff
$
sudo rm /var/swap
(如果提示dphys-swapfile命令无效,就用sudo
apt-get install dphys-swapfile安装一个)
然后启动硬盘上的swap:
$
sudo dphys-swapfile setup
$
sudo dphys-swapfile swapon
严格上来说,我们的所有准备工作就此结束。
6.
配置比特币全节点
现在已经有多款安卓闪电网络钱包发布了,然而,这些钱包主要用于建立支付通道,不是完整的闪电节点。闪电节点需要与比特币全节点配合存在。因此,闪电网络的存在增加了全节点数量,使得整个p2p系统的鲁棒性大大增强。
6.1 下载、校验并安装钱包文件
现在我们进入用户文件夹,并进入download目录(如不存在,用mkdir命令创建一个)
$ cd
$ cd
download
下载最新版钱包和校验和文件(版本号随读者阅读时决定)
$
wget
https://bitcoin.org/bin/bitcoin-core-0.16.1/bitcoin-0.16.1-arm-linux-gnueabihf.tar.gz
$
wget https://bitcoin.org/bin/bitcoin-core-0.16.1/SHA256SUMS.asc
$
wget https://bitcoin.org/laanwj-releases.asc
校验下载的文件hash(注意,这里和前面powershell的命令不太一样):
$ sha256sum
bitcoin-0.16.1-arm-linux-gnueabihf.tar.gz
$
cat SHA256SUMS.asc
然后导入Wladimir
van der Laan的公钥文件,并验证上述校验和文件确实出于Lann之手:
$ gpg
laanwj-releases.asc
$
gpg --import ./laanwj-releases.asc
$
gpg --verify SHA256SUMS.asc
关于公钥私钥校验的知识,可以搜索“非对称加密”学习。Gpg是linux系统内置的非对称加密程序。上述过程看起来繁琐,逐个字符校对校验码确实很烦,但是这正是密码学的魅力,也是比特币这一密码朋克的结晶所以存在的坚实基础。
确认下载的钱包安全后,就可以解压安装钱包了:
$
tar -xvf bitcoin-0.16.1-arm-linux-gnueabihf.tar.gz #tar是解压缩命令
$
sudo install -m 0755 -o root -g root -t /usr/local/bin bitcoin-0.16.1/bin/*
这样,比特币钱包程序就安装在/usr/local/bin
目录里。
6.2 设置钱包配置
此时不要运行bitcoind程序,因为区块文件默认安装在SD卡上,我们需要将区块目录改在硬盘上。先将用户切换为bitcoin,
然后用ln命令将默认目录改到硬盘上:
$ ln
-s /mnt/hdd/bitcoin /home/bitcoin/.bitcoin
然后修改配置文件bitcoin.conf
$ nano
/home/bitcoin/.bitcoin/bitcoin.conf
输入下述内容(#为注释行,可以不输入,但要清楚具体的意义。在完成配置之前,我们先使用比特币测试网)
# RaspiBolt LND Mainnet: bitcoind configuration
# /home/bitcoin/.bitcoin/bitcoin.conf
# remove the following line to enable Bitcoin mainnet
testnet=1
# Bitcoind options
server=1
daemon=1
txindex=1
disablewallet=1
# Connection settings
rpcuser=创建一个你的比特币服务端名
rpcpassword=创建一个你的比特币服务密码
zmqpubrawblock=tcp://127.0.0.1:29000
zmqpubrawtx=tcp://127.0.0.1:29000
# Raspberry Pi optimizations
dbcache=100
maxorphantx=10
maxmempool=50
maxconnections=40
maxuploadtarget=5000
这是比特币的配置文件,可以参考https://en.bitcoin.it/wiki/Running_Bitcoin#Command-line_arguments
了解每一个参数的含义。保存后,退出bitcoin账户,回到pi用户。
$
exit
6.3 设置后台进程运行
我们需要让比特币钱包在没有用户登陆的情况下能在后台运行,编辑文件
$
sudo nano /etc/systemd/system/bitcoind.service
Systemd
是Linux系统下的进程守护管理程序,我们需要对其进行相关配置。关于systemd的使用和配置可以参考http://www.ruanyifeng.com/blog/2016/03/systemd-tutorial-commands.html
。
输入下述内容:
# RaspiBolt LND Mainnet: systemd unit for bitcoind
# /etc/systemd/system/bitcoind.service
[Unit]
Description=Bitcoin daemon
Wants=getpublicip.service
After=getpublicip.service
# for use with sendmail alert (coming soon)
#OnFailure=systemd-sendmail@%n
[Service]
User=bitcoin
Group=bitcoin
Type=forking
PIDFile=/home/bitcoin/.bitcoin/bitcoind.pid
ExecStart=/usr/local/bin/bitcoind -daemon -conf=/home/bitcoin/.bitcoin/bitcoin.conf -pid=/home/bitcoin/.bitcoin/bitcoind.pid
KillMode=process
Restart=always
TimeoutSec=120
RestartSec=30
[Install]
WantedBy=multi-user.target
上述文件中的getpublicip.service文件我们将在下一节配置,这是关于获取我们的公网ip地址的方式。
保存后,启动配置文件
$ sudo
systemctl enable bitcoind.service
然后在pi用户文件夹里创建.bitcoin目录,并将bitcoin.conf文件拷贝过来(~表示当前用户的用户目录):
$ mkdir
~/.bitcoin
$ sudo
cp /home/bitcoin/.bitcoin/bitcoin.conf ~/.bitcoin/
然后重启树莓派,并重新连接
$
sudo shutdown -r now
重启之后,bitcoind将会自动运行,可以输入
$ ps
-A |grep bitcoin
查看进程,grep
命令相当于在ps
-A的结果中搜索关键词bitcoin。
过一会儿后,用bitcoin-cli脚本命令查看区块状态
$
bitcoin-cli getblockchaininfo
现在我们完成了比特币全节点(测试网络)的配置,只需在最后完成时删除testnet选项即可。
7.
安装配置闪电节点LND (Lightning Network Daemon)
闪电节点的开发者有好几个团队,效率并不高,但是在艰难地维持开发去中心化。最轻量的c-lightning可能会更适合树莓派,但是c-lightning的开发者曾经坦言c语言可能不是写闪电网络的好语言,因此这里我们使用LND。 LND的官网是https://lightning.engineering/
该网站内还有很多闪电网络开发相关教程,有志于此的朋友可以看看,本文用到的配置文件指南也大多来自这里。
7.1 获取外网IP地址
前面我们的ip地址其实是家庭局域网里的地址,为了将我们的闪电节点发布出去,需要寻找我们在公共网络的ip地址。
创建文件(.sh文件相当于windows下的.bat 文件):
$
sudo nano /usr/local/bin/getpublicip.sh
在文件中输入:
#!/bin/bash
# RaspiBolt LND Mainnet: script to get public ip address
# /usr/local/bin/getpublicip.sh
echo 'getpublicip.sh started, writing public IP address every 10 minutes into /run/publicip'
while [ 0 ];
do
printf "PUBLICIP=$(curl -vv ipinfo.io/ip 2> /run/publicip.log)\n" > /run/publicip;
sleep 600
done;
保存后,将文件添加可执行属性(即参数+x):
$ sudo
chmod +x /usr/local/bin/getpublicip.sh
并创建对应的systemd单元
sudo
nano /etc/systemd/system/getpublicip.service
在文件中输入
# RaspiBolt LND Mainnet: systemd unit for getpublicip.sh script
# /etc/systemd/system/getpublicip.service
[Unit]
Description=getpublicip.sh: get public ip address from ipinfo.io
After=network.target
[Service]
User=root
Group=root
Type=simple
ExecStart=/usr/local/bin/getpublicip.sh
ExecStartPost=/bin/sleep 5
Restart=always
RestartSec=600
TimeoutSec=10
[Install]
WantedBy=multi-user.target
执行上述getpublicip.sh,并通过systemd启动getpublicip.sh后台进程:
$
sudo getpublicip.sh
$
sudo systemctl enable getpublicip
$
sudo systemctl start getpublicip
$
sudo systemctl status getpublicip
最后一行命令范围结果后,按Ctrl+C退出。
过一会儿检查一下外网公共ip:
$ cat
/run/publicip
这条输出命令的返回值就是我们的外网ip,如果没有返回值就过一会儿再尝试。
7.2 下载、安装并校验LND
具体步骤和下载、安装并校验比特币钱包一样,唯下载地址不同。这里直接给出脚本操作,不加赘述。
$ cd
~/download
$
wget
https://github.com/lightningnetwork/lnd/releases/download/v0.4.2-beta/lnd-linux-arm-v0.4.2-beta.tar.gz
$
wget
https://github.com/lightningnetwork/lnd/releases/download/v0.4.2-beta/manifest-v0.4.2-beta.txt
$
wget
https://github.com/lightningnetwork/lnd/releases/download/v0.4.2-beta/manifest-v0.4.2-beta.txt.sig
$
wget https://keybase.io/roasbeef/pgp_keys.asc
$
sha256sum lnd-linux-arm-v0.4.2-beta.tar.gz
$
cat manifest-v0.4.2-beta.txt |grep lnd-linux-arm-v0.4.2-beta.tar.gz
$
gpg pgp_keys.asc
$
gpg --import pgp_keys.asc
$
gpg --verify manifest-v0.4.2-beta.txt.sig
$
tar -xzf lnd-linux-arm-v0.4.2-beta.tar.gz
$ ls
-la
$
sudo install -m 0755 -o root -g root -t /usr/local/bin
lnd-linux-arm-v0.4.2-beta/*
$
lnd --version
7.3 配置LND
切换到bitcoin用户
$sudo
su bitcoin
和比特币钱包一样,将配置目录放到硬盘上
$
mkdir /mnt/hdd/lnd
$ ln
-s /mnt/hdd/lnd /home/bitcoin/.lnd
$ cd
$ ls
-la
然后创建LND配置文件
$
nano /home/bitcoin/.lnd/lnd.conf
输入
# RaspiBolt LND Mainnet: lnd configuration
# /home/bitcoin/.lnd/lnd.conf
[Application Options]
debuglevel=info
debughtlc=true
maxpendingchannels=5
alias=你的闪电节点名字
color=#68F442
[Bitcoin]
bitcoin.active=1
# enable either testnet or mainnet
bitcoin.testnet=1
#bitcoin.mainnet=1
bitcoin.node=bitcoind
[autopilot]
autopilot.active=1
autopilot.maxchannels=5
autopilot.allocation=0.6
读者应该对配置bitcoin.conf比较熟悉,不过lind.conf就不一定了,LND开发团队有一个帮助文档可供查阅:https://github.com/lightningnetwork/lnd/blob/master/sample-lnd.conf
退出bitcoin账户,并创建LND
systemd后台进程单元,
$
exit
$ sudo
nano /etc/systemd/system/lnd.service
输入
# RaspiBolt LND Mainnet: systemd unit for lnd
# /etc/systemd/system/lnd.service
[Unit]
Description=LND Lightning Daemon
Wants=bitcoind.service
After=bitcoind.service
# for use with sendmail alert
#OnFailure=systemd-sendmail@%n
[Service]
# get var PUBIP from file
EnvironmentFile=/run/publicip
ExecStart=/usr/local/bin/lnd --externalip=${PUBLICIP}
PIDFile=/home/bitcoin/.lnd/lnd.pid
User=bitcoin
Group=bitcoin
LimitNOFILE=128000
Type=simple
KillMode=process
TimeoutSec=180
Restart=always
RestartSec=60
[Install]
WantedBy=multi-user.target
注意配置文件中,我们调用了bitcoind的后台进程单元bitcoind.service
接下来我们通过systemd启动lnd的后台进程:
$
sudo systemctl enable lnd
$
sudo systemctl start lnd
$
systemctl status lnd
切换到bitcoin用户,并创建LND钱包,之后退出bitcoin用户
$
sudo su bitcoin
$
lncli create
$
exit
根据提示操作,输入钱包解锁密码,密钥生成种子,系统会返回24个单词的密钥。相信任何一个比特币玩家都知道应该做什么了。这24个单词和你输入的生成种子是恢复钱包的唯一手段。
接下来执行和比特币钱包一样的操作,赋予pi用户以权限:
$
sudo cp /home/bitcoin/.lnd/tls.cert ~/.lnd
$
sudo cp /home/bitcoin/.lnd/admin.macaroon ~/.lnd
$
sudo chown -R pi:pi ~/.lnd/
输入钱包解锁密码解锁钱包:
$
lncli unlock
监控闪电钱包同步情况,等待几个小时同步完成:
$
bitcoin-cli getblockchaininfo
$ sudo tail -f
/home/bitcoin/.bitcoin/testnet3/debug.log
$ sudo journalctl -f -u lnd
$ ps -A
按Ctrl+C退出监控, 看到区块高度和header一致,并且lnd区块一致、开始处理最近的会话,说明同步完成。
8. 在测试网中操作闪电节点
Bitcoin-cli和lncli这两个程序都是对比特币钱包/闪电钱包操作的脚本命令台。可以通过--help参数或者-h参数查看钱包脚本命令:
$ bitcoin-cli --help
$ lncli --help
也可以直接访问https://bitcoincore.org/en/doc/ 和https://api.lightning.community/ 分别查看bitcoin-cli和lncli的使用方法。
确保lnd在unlock的情况下,生成一个比特币测试地址
$
lncli newaddress np2wkh #测试网的比特币地址2开头,主网比特币地址3开头
然后去https://testnet.manu.backend.hamburg/faucet 领一点免费的测试币(用完了还回去是个好习惯)。建议到此步骤先暂停一小时休息一下。
下面罗列一些lncli常用脚本命令:
$ lncli walletbalance
#查看钱包余额
$
lncli channelbalance #查看通道里的余额
$
lncli getinfo #查看我们的节点信息
$ lncli listpeers #查看连接的节点
$ lncli listchannels #查看我们建立的通道
$
lncli pendingchannels #查看等待建立的通道
$ lncli closeallchannels #关闭所有通道
$ lncli sendcoins
2N8hwP1WmJrFF5QWABn38y63uYLhnJYJYTF #返还测试币
在我们休息的时候,系统自动为我们随机建立了通道,这是因为我们的配置文件lnd.conf中设置参数autopilot.active=1,这表示一旦有金额进入钱包,就会尝试建立通道。我们也可以让该参数为0,手动去建立通道。
可以去https://explorer.acinq.co/ 查看目前测试网上的活跃节点(该站点更新较慢)。
我们来尝试建立一条闪电通道。https://yalls.org/ 是一个闪电网络上的付费阅读平台,同时支持测试网和主网。现在,我们尝试付费其中一篇文章。随机点开一篇文章:
绿色框是yalls.org
的公钥,蓝色框内是节点的URI, 红色则是这篇文章的付费发票。
我们进行如下操作:
# lncli connect [节点URI] 是跟节点连接的命令
节点URI = 公钥@域名,对于个人用户来说,就是公钥@公网IP:9735
# lncli openchannel [节点公钥] [金额(satoshi)]
是跟节点建立通道、并放置一定金额上去的命令
等通道建立确认过后,就可以付款了
# lncli decodepayreq 是确认付款信息,特别是金额
# lncli payinvoice 付款
此外,我们还有这些常规操作:
$ lncli addinvoice 15 # 生成一个付款金额为15
聪的发票
要关闭通道时,先listchannels,找到所需的channel,然后channel_point参数给出了FUNDING_TXID
: OUPUT_INDEX
$ lncli closechannel [FUNDING_TXID]
[OUTPUT_INDEX] #关闭通道
关闭通道后,等待144块主链确认,金额将返回我们的钱包。
当需要让他人连接我们时,可以把我们的公钥(getinfo中获得)和ip地址给对方,如果要开发服务,则注册一个域名进行域名解析。不妨用手机上的钱包试一试。
9. 上线主网
免责声明:比特币具有试验性质,闪电网络尚未接受大规模使用的检验。本文尽可能做到详细谨慎,但可能还存在某些错误,请读者自行甄别。
主网上线的第一步就是把主网区块文件拷贝到树莓派硬盘对应的目录下。
如果你使用Linux系统或MacOS系统,直接在终端上使用命令
$ scp -rp 本地目录 用户名@树莓派内网IP:树莓派目标目录
即可,对于windows系统的用户,需要借助WinSCP软件。WinSCP是一款开源软件,用于在windows端和linux服务器端传输文件,可在https://winscp.net/eng/index.php 下载。
在bitcoin用户名下打开WinSCP,我们需要做的就是把D:\Bitcoin\block目录下blocks和chainstate两个文件夹的信息复制到树莓派端的/mnt/hdd/bitcoin/ 目录。
复制过程会持续好几小时,务必关闭计算机的休眠功能。
最后的步骤,我们需要修改.conf文件,使之转移到主网上。
首先关闭bitcoind和lnd进程
$ sudo systemctl stop lnd
$ sudo systemctl stop bitcoind
然后编辑bitcoin.conf文件,删除测试网参数(testnet=1),并复制到pi用户的目录内
$ sudo nano
/home/bitcoin/.bitcoin/bitcoin.conf
$ sudo cp
/home/bitcoin/.bitcoin/bitcoin.conf /home/pi/.bitcoin/
接着把lnd.conf文件中的bitcoin.testnet=1改成bitcoin.mainnet=1:
$ sudo nano
/home/bitcoin/.lnd/lnd.conf
然后重启树莓派
$ sudo shutdown -r now
这样比特币和闪电网络就会开始运行,使用我们在第7章结尾处所述的方法监控程序:
$ lncli unlock
$ bitcoin-cli getblockchaininfo
$ sudo tail -f
/home/bitcoin/.bitcoin/testnet3/debug.log
$ sudo journalctl -f -u lnd
$ lncli getinfo
$ ps -A
生成主网闪电钱包
$ lncli create
将配置文件拷贝到pi用户目录下
$ sudo cp
/home/bitcoin/.lnd/tls.cert /home/pi/.lnd
$ sudo cp
/home/bitcoin/.lnd/admin.macaroon /home/pi/.lnd
重启并解锁闪电钱包
$ sudo systemctl restart lnd
$ lncli unlock
再次监控比特币和闪电网络
$ ps -A
$ bitcoin-cli getblockchaininfo
$ sudo tail -f
/home/bitcoin/.bitcoin/testnet3/debug.log
$ sudo journalctl -f -u lnd
$ lncli getinfo
一切正常后,就可以按第8章的步骤开始与主网的闪电节点互联互通了!
可以去网址https://lnmainnet.gaben.win/ 和https://1ml.com/ 查看主网节点,或直接在钱包内查看。目前主网上已经上线了很多应用,比如前文说的付费阅读网站https://yalls.org/与画布https://satoshis.place ,很多节点名字就是他们的html5应用的网址,不妨看看。当然笔者认为真正的需求前景还尚待开发。