白话区块链 之 13 - ​动手编译比特币源码

【编者Peter Ye按】

可以打开如下链接,详细阅读本系列的前几篇:

白话区块链 之1: 为什么账本要这么记?

白话区块链 之2: 区块链技术理念

白话区块链 之3: 区块链技术栈

白话区块链 之4: 区块链分类与架构

白话区块链 之5 - 创世元灵:一切源自比特币

白话区块链 之6 - 比特币核心程序

白话区块链 之7 - Bitcoin Core之客户端逻辑结构

白话区块链 之8 - 比特币的发行:挖矿

白话区块链 之9 - 比特币下载区块数据时,如何校验是否有问题呢?

白话区块链 之 10 - 什么是比特币钱包、钱包地址?什么是私钥、公钥?

白话区块链 之 11 - 区块链的链 是什么?

白话区块链 之 12 - 未花费事务输出 (UTXO) 是什么?

下面的段落对应书籍《白话区块链》的第1章的1.4.8节,原文标题为《动手编译比特币源码》

如果有人一直在跟你说有个煎饼多好吃,芝麻有多香,鸡蛋有多金黄,你肯定希望去看一看;如果有人一直在跟你说有首歌曲多动人,旋律有多美,歌词有多感人,你肯定希望去听一听;如果......是的,咱们说了那么多的概念,技术名词,界面也瞧过了,可是这么一个软件到底是怎么编译出来的呢?无论您是不是程序员,都可以感受一下这个过程,看看这个设计巧妙的软件是怎么个通过源代码生成可执行程序的。

比特币的源码是公开的,并且维护在GitHub网站上,GitHub是一个源码托管平台,因为是以git作为版本库格式进行托管的,所以名为GitHub。比特币的源码就托管在https://github.com/bitcoin/bitcoin这个地址下,目前这个源码由比特币基金会进行维护。版权类型是MIT,这是一个很松散的版权协议,也因此每一个对比特币源码感兴趣的人都可以自由的去复制、修改,以进行学习研究。打开网页后,可以看到有详细的程序源码以及附带的文档说明,我们就从这里下载源码进行编译。在说明编译步骤之前,先介绍些概要前提吧,烹调大餐前得先看个菜单不是。首先,比特币的源码是使用C++语言开发的,因此想要深入研究源码的朋友们,最好要有不错的C++基础;其次,源码中使用了很多其他的开源库,比如libssl-devlibevent-devlibboost-all-dev等,因此编译的时候也需要先安装这些第三方的依赖;另外,比特币源码在Linux系统上进行编译最方便,很多依赖库都是先天开发在Linux平台的,当然其他系统上也可以进行编译。

好了,接下来,我们就开始这道大餐吧

1. 准备操作系统环境

这里我们使用Ubuntu16.04LTS桌面版,关于Ubuntu的安装就不在这里赘述啦,物理安装或者用虚拟机加载安装都可以,装好系统后,首先更新一下系统的软件源。

sudo apt-get update

2.获得源码

先来看下获得源码的命令:

sudo apt-get install git 

mkdir~/bitcoinsource 

git clone https://github.com/bitcoin/bitcoin.git "~/bitcoinsource"

1)第1条命令是安装git命令工具,这个git工具是用来从github上下载源码的,事实上,使用git工具不但可以下载源码,也可以在本机创建自己的版本库;

2)第2条命令是在当前用户的目录下创建一个文件夹,用以保存即将下载的比特币源码,读者朋友具体操作时,可以自行决定路径和文件夹名称;

3)第3条命令就是从GitHub上下载比特币的源码到创建的bitcoinsource目录中。这里有个问题需要注意,如果在git clone过程中终止了,当再次进行clone时会出错,一般会有这样的提示:

git clone:GnuTLS recv error(-9):A TLS packet with unexpected lengthwas received

这个错的原因是因为git clone并不支持断续下载,删除目录后重新创建一个新目录再clone就可以了。

除了上述的git clone命令方法外,实际上,我们可以在GitHub上直接下载源码压缩包,下载下来的文件名一般为bitcoin-master.zip,然后解压缩即可:

unzip bitcoin-master.zip

解压缩后,将当前工作目录cdbitcoin-master中,至此就可以开始着手编译了。

3. 安装依赖库

工欲善其事必先利其器,比特币源码中使用了很多第三方的功能库,这些都是必须的依赖,正所谓一个好汉三个帮,一个篱笆三个桩,没有这些可以自由方便使用的库,使用C++开发比特币软件就要复杂不少。

比如,以下3行命令主要安装C++编译器和make工具:

sudo apt-get install make 

sudo apt-get install gcc 

sudo apt-get install g++

比如,以下命令主要是安装依赖库:

sudo apt-get install build-essential 

sudo apt-get install libtool 

sudo apt-get install autotools-dev 

sudo apt-get install autoconf 

sudo apt-get install pkg-config 

sudo apt-get install libssl-dev 

sudo apt-get install libevent-dev 

sudo apt-get install libboost-all-dev 

sudo apt-get install libminiupnpc-dev 

sudo apt-get install libqt4-dev 

sudo apt-get install libprotobuf-de 

sudo apt-get install protobuf-compiler 

sudo apt-get install libqrencode-dev

libevent-dev是一个网络库,实现网络通信功能的;libssl-dev是一个密码算法库,提供了随机数生成,椭圆曲线密码算法等功能;libboost-all-dev是一个C++工具库,提供各种C++调用的基础功能库如多线程调用以及一些有用的数据结构等;libqt4-dev是一个跨平台的C++库,用于实现跨平台运行的软件界面;以及其他等等,都是比特币源码中需要用到的功能依赖库。值得一提的是,这些依赖库也都是开源的,也就是说,比特币源码不但本身是自由开源的,使用的其他的依赖库也是自由开源的,这样就方便了那些希望对比特币源码进行深入研究的朋友,可以对每一个实现细节细嚼慢咽的,尽情的去学习研究。

这两行命令主要安装比特币需要用到的数据存储驱动,其使用的类型是Berkeley DB,是一种开源的文件数据库,到这里为止,就万事俱备只欠东风啦,该准备的材料都准备好了。

sudo apt-get install libdb-dev

sudo apt-get install libdb++-dev

4.编译准备

这两个步骤是使用make工具进行编译的准备工作。

./autogen.sh 

./configure

需要注意的是,在执行./configure的时候,有可能会看到这样的提示,如下:

configure: error: Found Berkeley DB otherthan 4.8, required for portable wallets (--with-incompatible-bdb to ignore or--disable-wallet to disable wallet functionality)

看提示是configure命令执行时出的问题,大概的意思就是发现Berkeldy DB的版本高于了4.8,我们在安装BerkeleyDB的时候,命令下载安装的是最新版本,这个其实就是个警告而已,没什么影响,提示中也给出了解决方法,在configure的命令后面加上一个参数--with-incompatible-bdb就可以了。

./configure —with-incompatible-bdb

执行完毕就可以了,接下来的工作就简单啦,直接make编译安装即可。

5.编译安装

make 

sudo make install

执行完毕后,就大功告成啦,接下来我们就可以运行比特币客户端程序啦,我们可以运行带界面的程序试试,经过这个步骤,在源码目录src/qt/下生成了可执行程序,同时安装到了/usr/local/bin目录下。

6.运行测试

输入以下命令:

bitcoin-qt

激动人心的时刻就来临啦!我们可以看到比特币的界面显示出来了,当然了,也可以去尝试运行bitcoind程序。至此,在Ubuntu操作系统上编译比特币源码就结束了。限于篇幅,在其他操作系统比如MacWindows上的编译过程就不再赘述了,读者朋友如果感兴趣,也可以参考比特币源码中,doc文件夹下面的build-osx.mdbuild-windows.md的文件说明,分别是尝试在WindwsMacOS系统上的编译。

7.使用IDE管理源码

按理说到这里也没什么可说的了,编译完成了,运行也可以了,不过有木有觉得哪里不太爽呢?对了,缺少一个IDEIntegratedDevelopment Environment,集成开发管理)啊,这么多的文件,用文本编辑器一个个看,要看花眼了。好,接下来我们就安装一个IDE工具来管理这些源码,比特币系统是使用C++开发的,图形界面部分使用的又是qt组件,那就选择QtCreator吧,本身也开源,而且跨平台,对C++的编译支持也非常好。由于上述的源码编译是在Ubuntu下进行的,因此,我们仍然在Ubuntu下进行安装设置,咱们还是按照步骤来一步步说明吧。

1)准备QtCreator

可以直接到QtCreator官网下载,Qt分为商业版和开源版本,我们使用开源版本即可,下载后得到一个文件qt-opensource-linux-x64-5.6.2.run,读者朋友自己下载的时候,还可以选择在线安装版和离线安装版,这里下载的是离线安装版,进入到文件所在的目录,执行如下命令

chmod +x qt-opensource-linux-x64-5.6.2.run 

./qt-opensource-linux-x64-5.6.2.run

1行命令是给安装文件赋上一个执行权限。

2行命令是执行安装。

安装完毕后,可以打开QtCreator,见到如下界面

白话区块链 之 13 - ​动手编译比特币源码

2)导入源码项目

QtCreator的菜单栏,点击“文件”→“新建文件或项目”,会弹出一个向导窗体,选择其中的Import Project,并选中右侧的“导入现有项目”,如下图所示。

白话区块链 之 13 - ​动手编译比特币源码

接下来就是选择我们的比特币源码所在目录,也就是需要导入的项目。

白话区块链 之 13 - ​动手编译比特币源码

图中的“项目名称”可以任意起名,“位置”就是比特币源码所在的目录。选择完毕后继续。

白话区块链 之 13 - ​动手编译比特币源码

这个界面主要是用于选择一个源码版本控制系统,可以根据自己需要选用,这里只是演示,因此不作选择,直接就可以完成操作,源码导入完毕后,在QtCreator中的展现如下

白话区块链 之 13 - ​动手编译比特币源码

可以看到,在左侧已经列出了源码的文件列表,src目录下的就是所有的代码文件了,可以看到,根据不同的代码功能,划分了不同的目录,具体细节这里就不赘述了。到了这一步,可以运行一下试一试,点击运行按钮,哐当,咋回事,弹出个啥?

白话区块链 之 13 - ​动手编译比特币源码

这是要选择一个执行程序,比如bitcoin-qtbitcoind等,我们通过这个对话框选择bitcoin-qt,如下图所示

白话区块链 之 13 - ​动手编译比特币源码

注意,这里选择的执行程序是在src/qt/目录下,该目录下的执行程序是通过源码编译直接生成的。

选择后,点击运行,可以看到熟悉的界面又出来了,这样我们就使用QtCreator将比特币的源码管理起来了,通过IDE工具查看源码要方便许多,感兴趣的朋友也可以尝试着修改其中的界面文件或者源码文件,体会一把编译调试的乐趣。

小提示

我们在使用QtCreator引入的源码目录,是之前已经经过了一系列步骤编译过的,因此依赖库都已经具备了,执行程序也已经生成了,QtCreator就像一个外壳,只是做了一个导入集成。

比特币是一个一直在发展的开源项目,在参照以上步骤进行操作的时候,一定要注意选择的版本是否一致或者兼容,就本文中,选用的操作系统是Ubuntu16.04 LTS桌面版,下载的比特币源码版本是v0.14,使用的QtCreator4.0.3

扩展阅读:

文章前面给出的《白话区块链》之1 到 之12 系列文章的链接;

2019-10-28,《被误解的区块链(1)

2019-11-07,《被误解的区块链 (2) - 区块链一定要挖矿吗?

2019-12-02,《被误解的区块链 (3) - 关于去中心化的思考

2019-8-29,《当“算力地球”遇见区块链》

www.xinhuanet.com//globe/2019-08/29/c_138320671.htm

2019-6-27,《比特币涨价的5大原因

2018-11-16,《两败俱伤!两个子比特币算力大战引发的思考

2019-1-14,《你们都错了,比特币才是稳定币

2019-6-4,《新世界的崛起和意义——区块链定义的虚拟世界》

2019-6-20,蔡维德《Facebook发行的稳定币Libra是美元继续称霸的工具,瑞波和USDT的终结者

2019-6-20,孟岩、邵青 (数字资产研究院)《Facebook 数字货币:缘起、意义和后果