3.2 从源码编译比特币核心
Bitcoin Core的源代码可以下载ZIP格式,也可以从GitHub克隆官方的源代码库。 在GitHub比特币页面GitHub bitcoin page上,选择“下载ZIP”。 或者,使用git命令行在系统上创建源代码的本地副本。
提示 在本章的许多例子中,我们将使用操作系统的命令行界面(也称为“shell”),通过“terminal”应用程序访问。 shell将显示一个提示符,需要输入命令,并且shell会响应一些文本和一个新的提示符。 提示符可能在不同系统上看起来不同,但在以下示例中,都用符号$表示。在后面的示例中,看到$符号紧跟着有文本时,不要键入$符号,而是直接输入后面的命令,然后按ENTER键执行该命令。在示例中,每个命令下面的行是操作系统对该命令的响应。当你看到下一个$符号作为前缀时,应该继续输入之后的命令,一直重复这个过程。
在本例中,我们使用git命令来创建源代码的本地副本(“clone”):
$ git clone https://github.com/bitcoin/bitcoin.git
Cloning into 'bitcoin'...
remote: Counting objects: 66193, done.
remote: Total 66193 (delta 0), reused 0 (delta 0), pack-reused 66193
Receiving objects: 100% (66193/66193), 63.39 MiB | 574.00 KiB/s, done.
Resolving deltas: 100% (48395/48395), done.
Checking connectivity... done.
$
提示 Git是最广泛使用的分布式版本控制系统,是软件开发人员最重要的工具之一。 如果操作系统还未安装,需要先安装git命令行或git的图形界面。
当git克隆操作完成后,当前目录(如果是bitcoin)就有源代码存储库的完整本地副本。 在提示符下键入“cd bitcoin”,进入此目录:
$ cd bitcoin
3.2.1 选择Bitcoin Core版本
默认情况下,本地副本将与最新的代码同步,但是最新版本可能是不稳定的或者是Beta版。 所以在编译代码前,先查看发布标签tag,选择一个特定的版本。 这将使本地副本与关键字标签所标识的代码库的特定快照同步。 开发人员使用标签tag来标记特定版本号的代码。 首先,要找到可用的标签,我们使用git tag命令:
$ git tag
v0.1.5
v0.1.6test1
v0.10.0
...
v0.11.2
v0.11.2rc1
v0.12.0rc1
v0.12.0rc2
...
tag列表显示所有发布的比特币版本。 根据惯例,用于测试的发布候选版本具有后缀“rc”。 可以在生产系统上运行的稳定版本没有后缀。 从上面的列表中,选择最高版本的版本,在编写时是v0.11.2。 要使本地代码与此版本同步,请使用git checkout命令:
$ git checkout v0.11.2
HEAD is now at 7e27892... Merge pull request #6975
输入命令git status来确认检查到了选定的版本:
$ git status
HEAD detached at v0.11.2
nothing to commit, working directory clean
3.2.2 配置构建Bitcoin Core
源代码中包括帮助文档,可以在许多文件中找到。在提示符下输入“more README.md”,可以查看bitcoin目录中最主要的文档README.md的内容,使用空格键可翻页。在本章中,我们将在Linux上部署命令行比特币客户端,也称为比特币(bitcoind)。在系统中查看编译bitcoind命令行客户端的说明,方法是输入“more doc / build-unix.md” 。doc目录中还有macOS和Windows的文档,分别为build-osx.md或build-windows.md。
仔细查看文档第一部分提到的依赖库,在开始构建比特币客户端之前这些库必须存在。如果缺少这些库,构建过程会提示出错,并失败。如果构建失败提示是缺少这些依赖库,那么就必须再安装它,然后从刚才提示出错的地方重新开始构建。这些依赖库都安装之后,可以使用autogen.sh脚本生成一组脚本来启动构建过程。
注意 Bitcoin Core 构建过程已经从0.9开始更改为使用autogen / configure / make系统。 0.9之前的旧版本使用简单的Makefile,与以下示例的方法略有不同。 建议按照版本的说明进行操作。 在0.9中引入的autogen / configure / make用于之后的版本构建过程,下面演示的示例就是这个过程。
$ ./autogen.sh
...
glibtoolize: copying file 'build-aux/m4/libtool.m4'
glibtoolize: copying file 'build-aux/m4/ltoptions.m4'
glibtoolize: copying file 'build-aux/m4/ltsugar.m4'
glibtoolize: copying file 'build-aux/m4/ltversion.m4'
...
configure.ac:10: installing 'build-aux/compile'
configure.ac:5: installing 'build-aux/config.guess'
configure.ac:5: installing 'build-aux/config.sub'
configure.ac:9: installing 'build-aux/install-sh'
configure.ac:9: installing 'build-aux/missing'
Makefile.am: installing 'build-aux/depcomp'
...
autogen.sh脚本创建一组自动配置脚本,它会询问系统以发现正确的设置,并确保依赖库已经完整。 其中最重要的是配置脚本,它提供了许多自定义构建过程的可选选项。输入“./configure —help”查看各种选项:
$ ./configure --help
`configure' configures Bitcoin Core 0.11.2 to adapt to many kinds of systems.
Usage: ./configure [OPTION]... [VAR=VALUE]...
...
Optional Features:
--disable-option-checking ignore unrecognized --enable/--with options
--disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no)
--enable-FEATURE[=ARG] include FEATURE [ARG=yes]
--enable-wallet enable wallet (default is yes)
--with-gui[=no|qt4|qt5|auto]
...
帮助文档中可以看到,配置脚本允许使用—enable-FEATURE和—disable-FEATURE标志来启用或禁用bitcoind的某些功能,使用该命令是把FEATURE替换为功能名称。 在本章中,我们将构建所有默认功能的bitcoind客户端。 我们不会使用配置标志调整功能,但是需要了解客户端是能够实现可选功能的。如果您处于学术环境中,计算机实验室的限制可能需要把应用程序安装在当前账户的主目录中(例如,使用—prefix = $ HOME)。
以下这些选项,可以覆盖configure脚本的默认行为:
—prefix=$HOME
这将覆盖生成的可执行文件的默认安装位置(默认是/ usr / local /)。 使用$HOME将所有内容放在主目录,也可以放在其他路径。
—disable-wallet
这用于禁用钱包功能。
—with-incompatible-bdb
如果您正在构建钱包,允许使用不兼容的Berkeley DB库版本。
—with-gui=no
不构建图形用户界面,图形界面是需要Qt库的。 这只生成服务器和命令行客户端。
接下来,运行configure脚本来自动发现所有必需的库,并创建一个自定义的构建脚本:
$ ./configure
checking build system type... x86_64-unknown-linux-gnu
checking host system type... x86_64-unknown-linux-gnu
checking for a BSD-compatible install... /usr/bin/install -c
checking whether build environment is sane... yes
checking for a thread-safe mkdir -p... /bin/mkdir -p
checking for gawk... gawk
checking whether make sets $(MAKE)... yes
...
[many pages of configuration tests follow]
...
$
如果一切顺利,configure命令运行完成后,会自动一个创建可定制的构建脚本。可以使用构建脚本编译bitcoind。如果有缺失的库或是错误,configure命令将会提示出错。出现错误,一般都是缺少库或是有不兼容的库。这需要重新查看文档,确认是否安装所有依赖库。然后再次运行configure,看看错误是否消失。
3.2.3 构建Bitcoin Core可执行文件
下一步,开始编译源代码,这个过程根据CPU处理能力和内存大小,但一般可能需要1个小时完成。编译的过程中,应该过几秒或是几分钟看一下输出结果。如果出现了问题,就会看到错误。如果中断了,编译的过程可以在任何时候恢复。输入make命令就可以开始编译了:
$ make
Making all in src
CXX crypto/libbitcoinconsensus_la-hmac_sha512.lo
CXX crypto/libbitcoinconsensus_la-ripemd160.lo
CXX crypto/libbitcoinconsensus_la-sha1.lo
CXX crypto/libbitcoinconsensus_la-sha256.lo
CXX crypto/libbitcoinconsensus_la-sha512.lo
CXX libbitcoinconsensus_la-hash.lo
CXX primitives/libbitcoinconsensus_la-transaction.lo
CXX libbitcoinconsensus_la-pubkey.lo
CXX script/libbitcoinconsensus_la-bitcoinconsensus.lo
CXX script/libbitcoinconsensus_la-interpreter.lo
[... many more compilation messages follow ...]
$
如果CPU是多核,那么需要设置并行编译作业需要的核数,比如输入make -j 2会使用两个核。如果一切顺利,bitcoind就编译完成了。可以使用make check命令运行单元测试包,检查链接的库没有发生中断。最后一步就是sudo make install 命令,安装 bitcoind 可执行文件,可能会提示您输入用户密码,因为这一步需要管理员权限:
$ make check && sudo make install
Password:
Making install in src
../build-aux/install-sh -c -d '/usr/local/lib'
libtool: install: /usr/bin/install -c bitcoind /usr/local/bin/bitcoind
libtool: install: /usr/bin/install -c bitcoin-cli /usr/local/bin/bitcoin-cli
libtool: install: /usr/bin/install -c bitcoin-tx /usr/local/bin/bitcoin-tx
...
$
bitcoind 默认的安装位置是/usr/local/bin。查询下面这两个可执行文件的路径,可以确认bitcoin是否安装成功。
$ which bitcoind
/usr/local/bin/bitcoind
$ which bitcoin-cli
/usr/local/bin/bitcoin-cli