作者:Anony

2024 年 10 月 29 日重大更新:重新梳理了表述;将过往的历史增补信息汇入文章主体;增补了一个章节,并增加了附录。

本文是这份在树莓派上安装比特币节点的教程的续篇,旨在帮助读者安装 Electrum 个人服务器(Electrum Personal Server,EPS)并使用 Electrum 钱包(Electrum Wallet)。

本指南的操作目标是将 EPS 与比特币节点安装在同一设备(比如树莓派或专门的节点设备)上,而将 Electrum 钱包安装在另一台设备(假设是 Windows 系统的个人电脑)上。第五章专门解释了如何用 “SSH 隧道” 在两台设备间通信。

一. 为什么要使用 Electrum 钱包和 EPS?

总的来说,我们使用 Electrum 钱包是为了它的功能性,以及它的用户体验

  • 相比于其它钱包,Electrum 钱包的功能性非常出色。Electrum 钱包支持:
    • 多签名功能
    • 硬件钱包
    • 基于 microSD 卡的 Air-gapped 体验
      • 在线的 Electrum 钱包只负责构造交易,因此无需保存私钥;而运行在离线设备上的 Electrum 钱包软件负责签名;microSD 卡或 U 盘负责则两台设备间传输数据。
    • 独立的闪电钱包实现
    • 但是,到目前为止(2024 年 9 月),Electrum 钱包还不支持 Taproot 地址
  • 而相比于 Bitcoin Core 自带的钱包模块,Electrum 钱包的用户体验更加友好。
    • Electrum 钱包支持助记词标准,可以用有序词组的形式来保存主私钥。而 Bitcoin Core 钱包模块不支持。
      • 但请注意,Electrum 钱包的助记词标准是独立的,不同于 BIP39 助记词标准。

此外,Electrum 钱包也是完全开源的。

最重要的是,Electrum 允许用户指定服务端(后端)(为钱包提供必要的信息并完成网络通信动作)。你既可以使用 Electrum 钱包团队的节点作为服务端,也可以使用自己的节点作为服务端,还可以使用别人的节点。这在最大程度上减少了单点故障,并给了用户对自己的信息的更强控制权

不过,既然我们要当一个硬核的比特币爱好者,那当然要使用自己的节点。因为使用自己的节点可以更好地保证隐私性,你可以直接把交易发送到网络中,不需要假手他人;当你在区块链上扫描地址,也不会因为借用了别人的节点而被发现你可能在使用哪些地址。

也正因此,我们要学习安装 EPS。因为 Electrum 钱包无法直接跟 Bitcoin Core 通信,它需要借助 EPS。也就是说,实际上,Electrum 钱包是跟 EPS 通信,而 EPS 跟 Bitcoin Core 通信,实现完整的功能

运行 EPS 也有额外的一些好处:它不仅可以作为 Electrum 钱包的后端,也可以作为 Blue Wallet 手机钱包Sparrow 桌面钱包Trezor 硬件钱包套件 Trezor Suite 的后端,它也是最流行的个人钱包服务后端。

不过,到目前为止,EPS 还不支持扫描 Taproot 地址,也不支持用描述符来扫描地址。

二. 参考文档

跟上一篇教程一样,我们会先列出最有帮助的文档,并在具体章节中写明它们的参考价值。这些文档有:

三. 安装 Electrum 钱包

这一部分操作分为三步:下载并安装 Electrum 钱包;初始化设置;生成私钥并获得公钥。

下载并安装 Electrum 钱包

先从 Electrum 钱包下载页下载安装文件,请根据你希望安装 Electrum 钱包的设备的系统选择安装文件。本教程假设读者会在 Windows 系统中安装,但 Electrum 钱包也提供 Linux 版本。(如果你使用 Linux 版本,那么你可以将 Bitcoin Core、EPS 和 Electrum 钱包都安装在同一台设备上。)

为确保软件的安全性,请使用 gpg 验证签名。验证签名的一般化教程可见上一篇教程的附录Bitcoin Wiki 的 Electrum 页面也提供了验证签名的教程。

使用 gpg 验证签名时,请确保签名文件的前缀和被签名的文件的文件名一致,如果被签名文件的名字是 electrum.exe ,则签名文件的名字应该是 electrum.exe.asc 。从下载页中得到的签名文件的前缀与安装文件的名字不一致,会导致无法校验。

下载好安装文件后,打开以 .exe 为后缀的安装文件就可以正常安装 Electrum 钱包。安装好之后,可以在系统搜索框内输入 “Electrum” 从而打开软件;也可以在其安装位置查找 electrum-<版本号>.exe,用该文件打开软件。

初始化配置

为了避免 Electrum 钱包在启动时默认连入 Electrum 团队提供的节点,我们需要将 Electrum 设置成离线运行。

  • 如果你使用的是 Windows 系统或其它具有图形界面的系统,请正常打开软件。它会弹出如下界面来询问你是否让它自动选择服务器。请取消 “自动选择服务器” 的选项,并在 “服务器” 框内输入 127.0.0.1:50002 。在后续运行中,Electrum 钱包将向该地址发送数据请求,以获得必要的数据。推荐使用 50002,因为该端口也是 EPS 的默认监听端口:
    image-20220712101432449
  • 如果你要使用命令行来运行 Electrum 钱包,请为命令加上 --server localhost:50002:s 参数,最好再加上 --offline 参数(参考【1】)。或者你可以直接编写 Electrum 钱包的配置文件(参考【2】)
  • 最不济,你可以先把电脑的互联网连接完全断开,再运行 Electrum 钱包。

生成私钥并获得公钥

完成网络设置后,Electrum 会引导你生成一个新的钱包。因为 Electrum 钱包的功能非常全面,它支持你生成新的钱包、导入旧的钱包、生成多签名钱包、配合硬件钱包使用,等等。这里为了方便,我们直接生成一个新的钱包。请在遇到下面这个界面时选择 “创建一个新的密语种子”。它将为你生成一套 12 个词的助记词:

image-20220712103518790

再次强调钱包使用的基本原则:如果你没有备份一个钱包,就不要向它控制的地址转入资金!

生成好了以后,我们执行最后一步:获得该钱包的 “扩展公钥”,该 “扩展公钥” 用来让 EPS 扫描区块链和监听交易。在 Electrum 钱包的菜单中点击 “钱包”,选择 “信息”,它将告诉你钱包的类型,闪电网络节点 ID 等等,复制 “扩展公钥” 框中的内容并保存起来。扩展公钥是以 xpubypubzpub 开头的字符串。注意,不要向他人暴露你的扩展公钥,这会让别人可以知道你所有的地址以及这些地址上的交易!

四. 安装及配置 EPS

本节的目标是在 Linux 系统(假设是 Raspberry OS,树莓派操作系统)上安装及配置 EPS。

下文将涉及命令行操作。如果你还不熟悉,可以参阅上一份指南

Python 编程语言

首先,我们要确保系统已安装了合适版本的 Python 编程语言(EPS 就是用 Python 开发的)。

下文所推荐安装的 EPS 为 0.2.4 版本,已确认无法在 Python 3.12 版本下工作。在参照以下流程之前,请先检查 EPS 的版本,使用更新的版本。

如果没有新版本,则在命令行窗口运行以下命令,检查本地的 python 版本:

python --version

如果你在使用 Python 3.12 版本,请考虑使用 pyenv,该软件可以帮你在系统中安装多个 Python 版本。请在参照附录 1 安装好 pyenv 之后,再回到这里继续阅读指南。

下载 EPS

接下来,我们用命令行下载 EPS:

wget https://github.com/chris-belcher/electrum-personal-server/archive/refs/tags/eps-v0.2.4.tar.gz
tar -xvf eps-v0.2.4.tar.gz
cd /home/<你的用户名>/electrum-personal-server-eps-v0.2.4/

我们分步讲解这几条命令的作用:

  • 第一条命令 wget 是下载 EPS 的压缩包。
    • 这里使用的网址会下载 EPS 0.2.4 版本。如果你发现 EPS 有新版本,可以替换成新版本的下载地址,或手动下载到自己希望存放的位置。
  • 第二条命令 tar 则是使用 tar 软件来解开压缩包。
  • 第三条命令 cd 是进入到 EPS 的代码文件夹。注意,这条命令无法原样复制,你需要把 <你的用户名> 改成你树莓派的用户名。

自签名证书

由于 EPS 0.2.4 版本的 SSL 证书已在 2023 年 3 月过期,其它应用将无法与之建立正常的网络连接。因此,我们需要参考这份 Issue 来更新 SSL 证书。简述如下:

第一步:(假设我们已在 EPS 的代码文件夹内)移动到证书相关的目录,备份老的证书并在目标文件夹内删除老证书:

cd ./electrumpersonalserver/certs
cp -r ../certs ../certs_backup
rm cert.*

第二步:生成自签名的证书:

openssl genrsa -des3 -passout pass:<password> -out server.pass.key 2048
openssl rsa -passin pass:<password> -in server.pass.key -out cert.key
rm server.pass.key
openssl req -new -key cert.key -out cert.csr
openssl x509 -req -days 1825 -in cert.csr -signkey cert.key -out cert.crt
openssl x509 -enddate -in cert.crt

第一行指令是在生成私钥。注意,这里的口令(password)必须长于 4 位,短于 1300 位

第二行是生成公钥。后面是移除私钥、生成证书请求以及签名证书。注意,在生成证书请求时,它可能要求你填入地区、组织名、用户名一类的信息,并无特别大的意义,但似乎不应一个都不填。最后一行是为证书添加 5 年的使用时间。

运行完这些命令之后,自签名的证书就生成好了。

重要提醒:

如果你曾依据本指南的一个较老的版本成功运行过 EPS、并且使用 Electrum 钱包成功连接过,那么,在给 EPS 更新完证书之后,你的 Electrum 钱包可能会无法连接 EPS。

这是因为:如果你此前成功连接过,则 Electrum 钱包会根据 IP 地址记录 EPS 的证书。但如今 EPS 的证书已经改变,两者就无法匹配了。因此,我们需要手动删除 Electrum 钱包存储的旧证书。

如果你在使用 Windows 系统,证书的目录在:

C:\Users\<你的用户名>\AppData\Roaming\Electrum\certs

找出以你连接 EPS 时使用的 IP 地址为用户名的文件(在我们这里是 127.0.0.1),将它删除。

然后便可重试使用 Electrum 钱包连接 EPS。

安装并配置 EPS

接下来,我们要回到 EPS 代码文件夹(electrum-personal-server-eps-v0.2.4)中,运行以下命令:

pip3 install --user .
cp config.ini_sample config.ini
bitcoin-cli createwallet <任意名称> true
  • 第一行命令是安装 EPS 为一个可以在命令行中直接调用的软件。
  • 第二行命令将一个案例文件的内容存放到新建的文件 config.ini 中。
  • 第三行是在 Bitcoin Core 中新建一个空钱包,以供 EPS 调用 Bitcoin Core 内部的功能。

然后,我们要编辑 coinfig.ini 文件。可以直接在文档管理器中以图形界面打开。编辑的要点如下:

  • 文件里面包括注释的内容很多,看起来可能很烦人。但如果你不需要配置相应的参数,就保持原样不要动它。请不要删去方括号([])框起来的部分!
  • 我们需要配置的部分有: [master-public-keys][bitcoin-rpc][electrum-server]
  • [master-public-keys] 部分, #any_name_works 下面一行,输入你在 Electrum 钱包中得到的扩展公钥: <随便什么名字> = <你的扩展公钥>
    • 如果你有多个扩展公钥,可以分行输入,使用不同的名字就互不影响
  • [bitcoin-rpc] 部分,在 datadir = 前面加上 # ,将它注释掉,然后将 #rpc_user =#rpc_password = 前面的 # 删去,在后面填上你在 bitcoin.conf 配置文件中相应的值。
    • 这一大串文字是什么意思呢?它主要解决的是你的 EPS 如何跟 Bitcoin Core 程序通信的问题。要么使用 datadir 参数,填入 Bitcoin Core 的数据目录,EPS 会到该目录去寻找一个 .cookie 文件来获得 Bitcoin Core 的相关参数(这需要保持后文的 rpc 参数的注释符号);要么使用 rpc 方法,这就需要把 datadir 参数注释掉。
    • 但是,如上一篇教程所述,我们将 Bitcoin Core 的运行参数写成了一个配置文档,这使得其数据目录里面根本不会产生 .cookie 文件,EPS 也将无法运行。因此我们要注释掉 datadir 参数,使用 rpc 方法。RPC 方法的用户名和口令,请在自己的 Bitcoin Core 配置文件里面找,找到后复制过来即可。如果你阅读了上一篇教程,这应该不是什么难事。
    • 如果你没有为 Bitcoin Core 编写过配置文件,比如你用的是 bitcoin-qt 而不是 bitcoind ,那么,是可以通过在 datadir 参数中填入目录来让 EPS 工作的。
    • 请一定保持 rpc_userrpc_password 这两个参数的名称不变,不然会出错(中间的 _ 不能删去)。
  • [bitcoin-rpc] 部分, wallet_filename = 后填入你使用 bitcoin-cli createwallet 生成钱包时所用的名称。
    • 这个钱包实际上变成了 EPS 调用 Bitcoin Core 钱包组件的一个端口。请不要为这个钱包设置口令,不然你启动 EPS 时将需要把口令也附上;又因为它没有口令的保护,请不要真的使用这个钱包。我们使用 Electrum 钱包就好。
  • [bitcoin-rpc] 的其余部分是跟资源消耗量有关的参数,比如多久在网络中查询一次新交易之类的。如果你可以看懂配置文件中的注释,可以自己调一下,但不是非调不可。
  • [electrum-server] 部分中,将 broadcast_method 的值改为 own-node ,这将保证 EPS 只会通过你的比特币节点来跟比特币网络通信。
    • 这个参数也事关 EPS 使用 Internet 还是洋葱网络来跟外界通信。笔者没有专门了解过洋葱网络在当前网络环境下的可用性,也没有设置过 Bitcoin Core 使用洋葱网络。如果想要设置使用洋葱网络,读者还需自己做点功课。

至此,EPS 的配置文件就编辑完成了。我们使用命令行来启动 EPS。

electrum-personal-server config.ini

如果你的命令行窗口在 EPS 目录内,你可以直接使用上面这条命令。否则你可能需要:

electrum-personal-server /home/<你的用户名>/electrum-personal-server-eps-v0.2.4/config.ini

理论上,EPS 现在能够正常启动了,你将能够在命令行窗口内看到 EPS 的启动信息和捐赠地址。

五. Electrum 钱包与 EPS 的通信

如第一章所述,在我们的三个软件中,EPS 负责与 Bitcoin Core 通信,以取得所需比特币地址的交易历史;而 Electrum 钱包与 EPS 通信,将这些历史展现给用户,并协助用户构造和签名交易。

在上一章中,我们解决了 EPS 与 Bitcoin Core 通信的问题。并且,由于两者位于同一台设备上,这相对比较容易理解。但是,位于两台不同的设备,Electrum 钱包与 EPS 如何通信呢?

这就需要用到一种叫做 “SSH 隧道” 的技术。

SSH” 是 “Secure Shell” 的缩写,其主要用途就是建立安全的网络通信。在实践中,SSH 常常用于设备的远程登录和控制。在上一篇指南中,我们也简单提到了使用 SSH 来控制同一内网中的树莓派电脑的方法。

SSH 隧道则更进一步,可以将对本设备某个网络端口的访问,传递到目标设备的某个网络端口。从而,目标设备上的服务,也可以为本地软件所使用。

简单来说,我们让 Electrum 钱包以本地的某个端口为服务端,但使用 SSH 隧道,将对该端口的数据请求都传递给运行 EPS 的设备(树莓派),然后,正常运行的 EPS 就可以收到数据请求并返回数据。

假定我们的桌面设备(运行 Electrum 钱包)和树莓派(运行 EPS)处在同一内网中(比如使用同一 WiFi,或连接到同一个路由器),则我们可以在桌面设备的 “命令提示符(CMD)” 或 “Powershell” 命令行界面内,使用如下命令,建立 SSH 隧道:

ssh <你的树莓派的用户名>@<你的树莓派的网络地址,如 192.168.1.105> -N -L 50002:localhost:50002

这里的 50002:localhost:50002,前一个 50002 表示本地要被转发的端口,而后一个 50002 表示目标设备接收请求的端口。实际上,前者是 Electrum 钱包要与之通信的本地端口;而后者是 EPS 要监听的端口;只不过两者的编号都恰好是 50002。也可以自定义别的端口,只是在软件中要有相应的配置。

该命令会要求你提供所用的树莓派用户的口令(password)。输入正确的口令并按下回车之后,隧道就将建立。正常的运行会留下一个闪烁的输入指针(|),不正常的运行就会出现报错信息。如果报错表示拒绝连接,请参考上一章、检查 EPS 的工作情形。

如果你无法成功建立隧道,请检查:

  • 你的树莓派是否开启了 SSH 功能
  • 你的桌面设备是否安装了 SSH 功能

实用及安全的建议

如果你觉得总是输入口令很麻烦、不安全,那么 SSH 支持 “无口令登录”。原理是让本地设备生成一对公私钥,并将公钥上传到目标设备,在发起 SSH 连接时指定该私钥。目标设备会通过公钥来检查签名、完成身份验证,从而省去口令验证。配置好公钥后可以禁用口令登录。

这一方式不仅更加方便,也更加安全。但超出了本文的范围,因此不细述。感兴趣的读者可以搜索 “SSH 技巧”。

SSH 并不仅仅支持内网内的远程控制。实际上,只要你能通过一个 IP 地址访问到目标设备,就可以发起远程登录和控制。

现在,我们启动 Electrum 钱包,在钱包的主界面,你可以看到右下角出现绿色小点,左下角显示你的余额:

image-20220712231135243

需要提醒的是,在 Electrum 钱包工作期间,需要保持 EPS 的命令行窗口,该命令行窗口关闭会使 EPS 停止运行。

结语

至此,我们已经配置好了 Electrum 个人服务器并使之搭配 Bitcoin Core 来运行。有了 EPS,我们可以将它作为我们的 Electrum 钱包的服务端,从而最大限度保证我们的隐私性。EPS 还可以服务其它钱包软件。Electrum 钱包内也可以生成多个钱包,为使它工作,只需将其扩展公钥填入 EPS 的配置文件即可。

附录 1. Pyenv 与多版本 Python

在树莓派上安装 Pyenv

在命令行窗口运行以下命令:

sudo apt update; sudo apt install build-essential libssl-dev zlib1g-dev \
libbz2-dev libreadline-dev libsqlite3-dev curl git \
libncursesw5-dev xz-utils tk-dev libxml2-dev libxmlsec1-dev libffi-dev liblzma-dev

这是为 Pyenv 软件安装依赖。然后,运行 Pyenv 自动安装器:

curl https://pyenv.run | bash

安装完成后,窗口会出现一段信息,包含以下字样:

export PYENV_ROOT="$HOME/.pyenv"
[[ -d $PYENV_ROOT/bin ]] && export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init -)"

复制上述信息,并输入以下命令:

sudo nano ~/.bashrc

该命令会打开 .bashrc 的编辑界面。在文件的底部,粘贴上述信息,保存后退出。这是为了将 Pyenv 添加到环境目录中。

重启环境:

source ~/.bashrc

然后运行:

pyenv versions

如果安装成功,程序会输出系统内已安装好的 Python 版本,例如:

* system (set by /home/pi/.pyenv/version)

安装 Python 3.11.10

运行命令:

pyenv install 3.11.10

运行完之后,使用命令 pyenv versions 检查效果。如果安全不成功,回到上一节,确保自己安装了所有依赖。

创建虚拟环境并运行

运行以下命令:

pyenv shell 3.11.10
mkdir py311
python -m venv ./py311
  • 第一行的作用是将当前执行环境的 Python 语言改为 3.11.10 版本。
  • 第二行的作用是创建一个名为 “py311” 的新文件夹。
  • 第三行的作用是在 “py311” 文件夹内创造一个属于 Python 3.11.10 的 “虚拟环境”。该环境将独立于系统,有自身的 Python 版本和软件库。

运行完成后,关闭当前的命令行窗口,开启一个新的命令行窗口,并运行如下命令:

cd ./py311
source ./bin/activate

第一行是为了移动到 “py311” 文件夹内,第二行是为了启动虚拟环境。启动之后,命令行前面会多一串字符:(py311)

请在该命令行窗口内,继续下载、安装和配置 EPS。这会将 EPS 变成依赖于该虚拟环境的软件,从而不受系统 Python 语言的影响。

注意:

  1. 在安装 EPS 时,安装命令 pip3 install --user . 需要改成 pip3 install .
  2. 此后,每当你尝试重新运行 EPS,都需要先激活虚拟环境 source ~/py311/bin/activate,然后再运行 EPS :electrum-personal-server config.ini

(完)