BTC-编译0.94版本

时间:2022-07-22
本文章向大家介绍BTC-编译0.94版本,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

参考:

http://blog.csdn.net/zhangbohh8662/article/details/71439765

0.94的代码位于

https://github.com/bitcoin/bitcoin/releases/tag/v0.9.4

bootstrap.cmd

引导区块链同步

通常,比特币客户端将通过与其他客户端同步来下载网络交易和网络信息,称为区块链。

随着[比特币区块链](https://blockchain.info/charts/blocks-size)增长到超过15千兆字节,并且每个月增长几乎一千兆字节,这可能需要多天。

幸运的是,有一个安全而快速的方法来加速这个过程。 我们将向您展示如何引导您的区块链,通过几个简单的步骤让您的客户端加快速度。

要求

全新安装的比特币客户端软件。

通过Bittorrent下载区块链

比特币核心开发者Jeff Garzik提供了一个[torrent文件](https://bitcointalk.org/index.php?topic=145386.0)用于引导目的,并且经常更新。

Bittorrent是一种通过使用网络中的其他客户端加速下载大文件的协议。

免费和安全的开源客户端的例子是[Deluge](http://deluge-torrent.org/)或[QBittorent](http://www.qbittorrent.org/)。

有关安装和配置Torrent客户端的指南可以在这里找到(http://dev.deluge-torrent.org/wiki/UserGuide)。 

有关Bittorent的更深入的教程可以在这里找到(http://www.howtogeek.com/howto/31846/bittorrent-for-beginners-how-get-started-downloading-torrents/)。

安装客户端后,我们将继续下载blockchain torrent文件。 使用以下磁铁链接:

magnet:?xt=urn:btih:2d4e6c1f96c5d5fb260dff92aea4e600227f1aea&dn=bootstrap.dat&tr=udp://tracker.openbittorrent.com:80&tr=udp://tracker.publicbt.com:80&tr=udp://tracker.ccc.de:80&tr=udp://tracker.istole.it:80

或者访问[Jeff Garzik的主题](https://bitcointalk.org/index.php?topic=145386.0)获取已签名的磁力链接。

或者,您可以使用Sourceforge上的[.torrent文件](http://sourceforge.net/projects/bitcoin/files/Bitcoin/blockchain/bootstrap.dat.torrent/download)。

下载页面应该是这样的,下载倒计时。 如果不起作用,请点击直接下载链接。

安装的torrent客户端会识别下载的torrent文件。 将bootstrap.dat文件保存到您用于下载的文件夹中。 下图显示了QBittorent中的torrent下载,当前速度和ETA突出显示。

直接从官方存储库下载块链

BitTorent版本,如上所述,块链下载的刷新次数比可用的直接下载次数更多。 如果Bittorent在您的网络上被阻止,那么您可以使用直接下载方法。 确保只使用官方存储库作为下面显示的链接。 此下载只会将客户更新至2013年3月。

点击[这里](http://sourceforge.net/projects/bitcoin/files/Bitcoin/blockchain/bitcoin_blockchain_170000.zip/download)下载或复制并粘贴下面的链接。

http://sourceforge.net/projects/bitcoin/files/Bitcoin/blockchain/bitcoin_blockchain_170000.zip/download

下载页面应该是这样的,下载倒计时。 如果不能直接点击下载。 将文件保存到您用于下载的文件夹。

导入区块链

如果您正在运行比特币客户端软件,请退出。 请务必不要使用积极使用的钱包。 

我们将把区块链的下载文件复制到比特币客户端数据目录中。 您应该至少运行一次客户端软件,以便它可以生成数据目录。 将下载的bootstrap.dat文件复制到Bitcoin数据文件夹中。

对于windows使用者:

打开资源管理器,然后在地址栏中输入:

%APPDATA%Bitcoin

这将打开数据文件夹。 它应该看起来像下面的图片。 将bootstrap.dat从您的下载文件夹复制到此目录。

导入区块链

现在启动比特币客户端软件。 它应该显示“从磁盘导入块”,如下图所示。

等到导入完成。 客户将下载未被导入覆盖的最后日子。 恭喜你已成功导入区块链!

这安全吗?

是的,上述方法是安全的。 下载仅包含原始块链数据,客户端在导入时验证此数据。 不要从非官方来源下载区块链,特别是如果它们提供`* .rev`和`* .sst`文件。 这些文件未经过验证,可能包含恶意编辑。

MINGW编译

参看build.msw.md

http://blog.sina.com.cn/s/blog_5922b3960101s5j9.html

开发环境

1.安装mingw

http://sourceforge.net/projects/mingw/files/Installer/mingw-get-setup.exe/download

我是直接安装在D盘了,因为C盘空间实在不够!

From MinGW installation manager->All packages->MSYS

选中以下安装包

msys-base-bin
msys-autoconf-bin
msys-automake-bin
msys-libtool-bin

点 apply changes开始安装,确保不要安装msys-gcc和msys-w32api

2.安装MinGW-builds

http://sourceforge.net/projects/mingw-w64/files/Toolchains targetting Win32/Personal Builds/mingw-builds/4.8.2/threads-posix/dwarf/i686-4.8.2-release-posix-dwarf-rt_v3-rev3.7z/download

下载并解压缩 i686-4.8.2-release-posix-dwarf-rt_v3-rev3.7z 到D盘根目录

设置PATH环境变量,将D:mingw32bin;添加到第一个,在命令行模式下输入 gcc -v 会得到以下内容:

Microsoft Windows [版本 10.0.16299.431]
(c) 2017 Microsoft Corporation。保留所有权利。

C:UsersAdministrator>gcc -v
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=D:/mingw32/bin/../libexec/gcc/i686-w64-mingw32/4.8.2/lto-wrapper.exe
Target: i686-w64-mingw32
Configured with: ../../../src/gcc-4.8.2/configure --host=i686-w64-mingw32 --build=i686-w64-mingw32 --target=i686-w64-mingw32 --prefix=/mingw32 --with-sysroot=/c/mingw482/i686-482-posix-dwarf-rt_v3-rev3/mingw32 --with-gxx-include-dir=/mingw32/i686-w64-mingw32/include/c++ --enable-shared --enable-static --disable-multilib --enable-languages=ada,c,c++,fortran,objc,obj-c++,lto --enable-libstdcxx-time=yes --enable-threads=posix --enable-libgomp --enable-libatomic --enable-lto --enable-graphite --enable-checking=release --enable-fully-dynamic-string --enable-version-specific-runtime-libs --disable-sjlj-exceptions --with-dwarf2 --disable-isl-version-check --disable-cloog-version-check --disable-libstdcxx-pch --disable-libstdcxx-debug --enable-bootstrap --disable-rpath --disable-win32-registry --disable-nls --disable-werror --disable-symvers --with-gnu-as --with-gnu-ld --with-arch=i686 --with-tune=generic --with-libiconv --with-system-zlib --with-gmp=/c/mingw482/prerequisites/i686-w64-mingw32-static --with-mpfr=/c/mingw482/prerequisites/i686-w64-mingw32-static --with-mpc=/c/mingw482/prerequisites/i686-w64-mingw32-static --with-isl=/c/mingw482/prerequisites/i686-w64-mingw32-static --with-cloog=/c/mingw482/prerequisites/i686-w64-mingw32-static --enable-cloog-backend=isl --with-pkgversion='i686-posix-dwarf-rev3, Built by MinGW-W64 project' --with-bugurl=http://sourceforge.net/projects/mingw-w64 CFLAGS='-O2 -pipe -I/c/mingw482/i686-482-posix-dwarf-rt_v3-rev3/mingw32/opt/include -I/c/mingw482/prerequisites/i686-zlib-static/include -I/c/mingw482/prerequisites/i686-w64-mingw32-static/include' CXXFLAGS='-O2 -pipe -I/c/mingw482/i686-482-posix-dwarf-rt_v3-rev3/mingw32/opt/include -I/c/mingw482/prerequisites/i686-zlib-static/include -I/c/mingw482/prerequisites/i686-w64-mingw32-static/include' CPPFLAGS= LDFLAGS='-pipe -L/c/mingw482/i686-482-posix-dwarf-rt_v3-rev3/mingw32/opt/lib -L/c/mingw482/prerequisites/i686-zlib-static/lib -L/c/mingw482/prerequisites/i686-w64-mingw32-static/lib -Wl,--large-address-aware'
Thread model: posix
gcc version 4.8.2 (i686-posix-dwarf-rev3, Built by MinGW-W64 project)

到此,搭好开发环境

依赖库编译

运行D:MinGWmsys1.0msys.bat,如果闪退,就重启一下电脑

我都放在D:MinGWdeps下,为什么,因为空间不够了,又不想太多文件夹了

1.OpenSSL: http://www.openssl.org/source/openssl-1.0.1c.tar.gz

一条条运行以下命令:

cd /d/MinGW/deps/
tar xvfz openssl-1.0.1c.tar.gz
cd openssl-1.0.1c
./config
#Configure no-shared no-dso mingw
make

win10下编译报错

cryptlib.c:807:20: error: 'ERROR_INSUFFICIENT_BUFFER' undeclared (first use in this function)

这个定义在D:MinGWincludewinerror.h中

打开D:MinGWdepsopenssl-1.0.1ccryptocryptlib.c,在头增加一个#include <winerror.h>,继续make编译

bss_file.c:160:27: error: 'ERROR_NO_UNICODE_TRANSLATION' undeclared (first use in this function)

同样,打开D:MinGWdepsopenssl-1.0.1ccryptobiobss_file.c,在头增加一个#include <winerror.h>,继续make编译

最终生成D:MinGWdepsopenssl-1.0.1clibssl.a

2.Berkeley DB

http://download.oracle.com/berkeley-db/db-4.8.30.NC.tar.gz

一条条运行以下命令:

cd /d/MinGW/deps/
tar xvfz db-4.8.30.NC.tar.gz
cd db-4.8.30.NC/build_unix
sh ../dist/configure --enable-mingw --enable-cxx
make

最终生成D:MinGWdepsdb-4.8.30.NCbuild_unix

3.Boost

https://sourceforge.net/projects/boost/files/boost/1.50.0/boost_1_50_0.tar.gz/download

https://sourceforge.net/projects/boost/files/boost-jam/3.1.18/boost-jam-3.1.18-1-ntx86.zip/download(jam 解压到boost_150_0文件夹下,编译boost使用)

一条条运行以下命令:

vs2013编译

1.ActivePerl

https://www.activestate.com/activeperl/downloads

安装完成后,运行cmd,跳向eg文件夹,如下说明perl安装成功:

C:UsersAdministrator>cd C:Perl64eg

C:Perl64eg>perl example.pl
Hello from ActivePerl!

2.Boost

https://sourceforge.net/projects/boost/files/boost/1.50.0/boost_1_50_0.tar.gz/download

打开VS2013,工具-->Visual Studio 命令提示(C)

运行以下命令:

bootstrap
.b2

生成后如下:

The Boost C++ Libraries were successfully built!

The following directory should be added to compiler include paths:

    F:/OpenSource_Git/BTC/bitcoin094/boost_1_50_0

The following directory should be added to linker library paths:

    F:OpenSource_GitBTCbitcoin094boost_1_50_0stagelib

3.Berkeley DB

http://download.oracle.com/berkeley-db/db-4.8.30.NC.tar.gz

使用vs2013打开db-4.8.30.NCbuildwindows目录下的Berkeley DB.sln,生成解决方案

编译完成后,Berkeley DB头文件路径:db-4.8.30.NCbuild_windows,lib路径:db-4.8.30.NCbuild_windowsWin32Debug(Release),lib库是libdb48d.lib

4.QT

这是bitcoin-qt、bitcoin-qt-test 建立工程所需要的,不需要的可以跳过

下载地址:http://download.qt.io/archive/qt/5.3/5.3.2/

下载文件:qt-opensource-windows-x86-msvc2013-5.3.2.exe

安装在D盘了

插件:

http://download.qt.io/official_releases/vsaddin/qt-vs-addin-1.2.3-opensource.exe

下载后安装,在VS2013中菜单多了”Qt5“,在”Qt Options“中添加QT版本、路径(Qt库的安装路径D:QtQt5.3.25.3msvc2013)

5.OpenSSL

http://www.openssl.org/source/openssl-1.0.1c.tar.gz

打开VS2013的命令行窗口,进入到openssl-1.0.1c目录下,依次输入以下命令进行编译:

perl Configure VC-WIN32
msdo_ms
nmake -f msntdll.mak

编译完成后,在各个工程中添加OpenSSL的目录,头文件路径是:openssl-1.0.1cincludeopenssl,lib路径是:openssl-1.0.1gout32dll,lib库名称是:libeay32.lib、ssleay32.lib。

6.Protobuf

这也是bitcoin-qt、bitcoin-qt-test需要的

https://github.com/google/protobuf/releases/download/v2.6.1/protobuf-2.6.1.tar.gz

用vs2013打开 C:depsprotobuf-2.6.1vsprojects下的protobuf.sln,生成解决方案。

Protobuf库是用来把paymentrequest.proto文件生成对应的.h、.cc文件的。

编译完成后,在QT相关的bitcoin-qt、bitcoin-qt-test工程中添加Protobuf的相关目录,头文件路径是:protobuf-2.6.1src,lib路径是:protobuf-2.6.1vsprojectsDebug(Release),lib库是libprotobuf.lib、libprotoc.lib。

7.创建VS工程

分析比特币的源码,总结成3个程序、2个测试程序,3个程序对应着BTC钱包中的3个程序。分别是:

bitcoin-cli

Bitcoind

bitcoin-qt(Qt钱包)

bitcoin-qt-test(Qt钱包测试程序)

bitcoin-cli、bitcoind、test_bitcoin是console类型。

bitcoin-qt是QT的Application类型,依赖QT的QtCore、QtGui、QtNetwork、QtWidgets、QtOpenGL。

bitcoin-qt-test是QT console application类型,依赖QT的QtCore、QtGui、QtNetwork、QtWidgets、QtOpenGL、QtTest

在VC中的工程结构如图:

添加代码文件

先在bitcoin-cli工程新建文件夹(在资源管理器中新建筛选器),添加各个工程公用的文件夹(Common),再复制到其他工程中。工程结构如下:

注意几点:

头文件、源文件只包含src目录下的代码文件,不包含子目录下的代码文件,且不包含bitcoind.cpp、bitcoin-cli.cpp以及资源文件。

Common中包含srcjson目录下的文件。

Common中包含srcleveldb下的目录、文件,不包含文件名为xxx_test格式的文件(否则编译代码时候会报错),不包含leveldbportportposix.cc文件。

在bitcoin-cli工程中添加bitcoin-cli.cpp以及资源文件bitcoin-cli-res.rc

在bitcoind工程中添加bitcoind.cpp以及资源文件bitcoind-res.rc

在test_bitcoin工程中添加srctest目录下的代码文件,data中包含了srctestdata目录下的文件。工程结构如下:

在bitcoin-qt中添加srcqt中的目录、文件。不包含test目录下的文件。

使用工具protobuf生成proto下的.h.cc文件:

在CMD中,运行protobuf-2.5.0vsprojectsRelease目录下的protoc.exe,生成paymentrequest.proto文件对应的头文件、源文件,命令格式:

F:OpenSource_GitBTCbitcoin094protobuf-2.6.1vsprojectsRelease>protoc --proto_path=F:OpenSource_GitBTCbitcoin094bitcoin-0.9.4srcqt --cpp_out=F:OpenSource_GitBTCbitcoin094bitcoin-0.9.4srcqt F:OpenSource_GitBTCbitcoin094bitcoin-0.9.4srcqtpaymentrequest.proto

把生成的paymentrequest.pb.h、paymentrequest.cc文件添加到bitcoin-qt、bitcoin-qt-test工程的proto文件夹中

在bitcoin-qt-test工程中添加srcqttest目录下的文件。添加bitcoin-qt的代码文件。工程结构如下:

设置工程属性

通用配置

1.使用多字节字符集

2.设置leveldb相关的头文件路径,包含3个,分别是:

    ......srcleveldb
    ......srcleveldbinclude
    ......srcleveldbhelpersmemenv

3.设置OpenSSL、Berkeley DB、Boost包含文件、库文件路径;

........3rdPartyopenssl-1.0.1cinclude
........3rdPartyboost_1_50_0include
........3rdPartydb-4.8.30.NCinclude

4.设置附加库目录:

........3rdPartyopenssl-1.0.1clib
........3rdPartydb-4.8.30.NClib
........3rdPartyboost_1_50_0lib

5.debug输入库文件:

libdb48d.lib shlwapi.lib libeay32.lib  ssleay32.lib

 release输入库文件:

libdb48.lib shlwapi.lib libeay32.lib ssleay32.lib

6.增加预处理器定义:

_WIN32_WINDOWS
HAVE_WORKING_BOOST_SLEEP
LEVELDB_PLATFORM_WINDOWS
OS_WIN
ENABLE_WALLET
_CRT_SECURE_NO_WARNINGS
_SCL_SECURE_NO_WARNINGS
_WINSOCK_DEPRECATED_NO_WARNINGS

_WIN32_WINDOWS:

        代码中需要定义_WIN32_WINNT或者_WIN32_WINDOWS,我定义了_WIN32_WINDOWS。

HAVE_WORKING_BOOST_SLEEP:

        在src目录下的util.h文件的MilliSleep函数中根据宏定义调用不同的BOOST的函数,我不知道该调用BOOST的哪个函数,就随意选择了HAVE_WORKING_BOOST_SLEEP,这个定义决定了调用boost::this_thread::sleep函数。

LEVELDB_PLATFORM_WINDOWS:

        leveldb编译支持windows平台。

OS_WIN:

        leveldb需要,包含windows相关的头文件。

ENABLE_WALLET:

        表示是否启用钱包,因为代码不完善,禁用钱包不要取消ENABLE_WALLET的定义,添加参数”-disablewallet”来完成。如果取消ENABLE_WALLET的定义,编译失败。

_CRT_SECURE_NO_WARNINGS:

        大家都懂了,去掉警告而已,可以不加的。

_SCL_SECURE_NO_WARNINGS:

        发现还要加上这个。

Bitcoin-qt、bitcoin-qt-test工程多加定义:WIN32_LEAN_AND_MEAN,不加时编译报很多winsock的错误。

所有工程添加链接lib库:Shlwapi.lib。

源码修改

工程bitcoin-cli、bitcoind

1.c.cc注释掉#include<unistd.h>

2.将__func__替换成__FUNCTION__

3.文件addrman.h中的类CAddrMan中的IMPLEMENT_SERIALIZE因为括号不对,编译报错,不用IMPLEMENT_SERIALIZE宏,把宏IMPLEMENT_SERIALIZE定义的3个函数函数GetSerializeSize、Serialize、Unserialize中的‘{statements} ’替换为IMPLEMENT_SERIALIZE中的参数。就是说把serialize.h中的IMPLEMENT_SERIALIZE对应的函数代码替换到addrman.h中CAddrMan的IMPLEMENT_SERIALIZE出现的地方。

4.core.h执行同样的替换

5.把文件serialize.h中ReadCompactSize函数中的0x100000000LLu改为(unsigned __int64)0×100000000。VC不支持LLu类型的数据

6.文件serialize.h中,类CDataStream的构造函数中: CDataStream(const std::vector& vchIn, int nTypeIn, int nVersionIn) : vch((char*)&vchIn.begin()[0], (char*)&vchIn.end()[0]),运行时报错,注释掉"[0]"。

7.文件script.h中类CScript中:

//#ifndef _MSC_VER
CScript(const unsigned char* pbegin, const unsigned char* pend) : std::vector<unsigned char>(pbegin, pend) { }
//#endif

注释掉_MSC_VER的宏定义

8.在文件netbase.cpp中添加语句:"typedef signed int ssize_t;"

9.将文件leveldbdbc.cc中的#include <unistd.h>替换为:

#ifndef _UNISTD_H
#define _UNISTD_H
#include <io.h>
#include <process.h>
#endif

10.把文件leveldbdbdb_bench.cc和leveldbdbleveldb_main.cc中的main函数注释掉

11.把文件leveldbdbdb_iter.cc增加typedef signed int ssize_t;

12.BTC源码中有2个bloom文件,分别是bloom.cpp、leveldbutilbloom.cc,编译时生成的bloom.obj冲突,把其中1个文件改名即可,把bloom.cc改名为bloomdb.cc

BTC源码中有2个hash文件,分别是hash.cpp、leveldbutilhash.cc,编译时生成的hash.obj冲突,把其中1个文件改名即可,把hash.cc改名为hashdb.cc

13.文件main.cpp编译release版时,报错”Bitcoin cannot be compiled without assertions.”。把这句代码注释掉,增加#include <assert.h>,把assert宏定义为空语句

bitcoin-qt

14.额外增加预处理器定义:WIN32_LEAN_AND_MEAN

15.额外增加附加库目录:

........3rdPartyprotobuf-2.6.1lib
$(QTDIR)lib
$(QTDIR)pluginsplatforms

16.额外增加附加库:

debug:

libprotobufd.lib
libprotocd.lib
qtmaind.lib
Qt5Cored.lib
Qt5Guid.lib
Qt5Networkd.lib
Qt5Widgetsd.lib
Qt5OpenGLd.lib
Qt5PlatformSupportd.lib

Release:

libprotobuf.lib
libprotoc.lib
qtmain.lib
Qt5Core.lib
Qt5Gui.lib
Qt5Network.lib
Qt5Widgets.lib
Qt5OpenGL.lib
Qt5PlatformSupport.lib

17.额外增加头文件目录:

.GeneratedFiles
.GeneratedFiles$(ConfigurationName)
........3rdPartyprotobuf-2.6.1include
$(QTDIR)include
$(QTDIR)includeQtCore
$(QTDIR)includeQtGui
$(QTDIR)includeQtNetwork
$(QTDIR)includeQtWidgets
$(QTDIR)includeQtOpenGL

18.额外增加宏定义:

_X86_

19.增加一个.user文件,用来增加QTDir定义:

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
    <LocalDebuggerEnvironment>PATH=$(QTDIR)bin%3b"$(QTDIR)bin%3b$(PATH)</LocalDebuggerEnvironment>
    <QTDIR>D:QtQt5.3.25.3msvc2013</QTDIR>
    <DebuggerFlavor>WindowsLocalDebugger</DebuggerFlavor>
  </PropertyGroup>
  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
    <LocalDebuggerEnvironment>PATH=$(QTDIR)bin%3b"$(QTDIR)bin%3b$(PATH)</LocalDebuggerEnvironment>
    <QTDIR>D:QtQt5.3.25.3msvc2013</QTDIR>
  </PropertyGroup>
</Project>

20.运行时报错:This application failed to start because it could not find or load the QT plugin "window"

解决方式:把plugins下的platforms文件夹整个拷过来,同时把libEGL.dll和libGLESv2.dll也拷过来,即可运行了

21.文件init.cpp中的AppInit2函数中的Setvbuf的最后一个参数0改为INT_MAX,VC不允许最后一个参数为0

22.修改QT中的代码qdatetime.h 122行为:

static inline qint64 nullJd() { return (std::numeric_limits<qint64>::min)(); }