参考:
http://blog.csdn.net/zhangbohh8662/article/details/71439765
0.94的代码位于
https://github.com/bitcoin/bitcoin/releases/tag/v0.9.4
通常,比特币客户端将通过与其他客户端同步来下载网络交易和网络信息,称为区块链。
随着[比特币区块链](https://blockchain.info/charts/blocks-size)增长到超过15千兆字节,并且每个月增长几乎一千兆字节,这可能需要多天。
幸运的是,有一个安全而快速的方法来加速这个过程。 我们将向您展示如何引导您的区块链,通过几个简单的步骤让您的客户端加快速度。
全新安装的比特币客户端软件。
比特币核心开发者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)下载或复制并粘贴下面的链接。
下载页面应该是这样的,下载倒计时。 如果不能直接点击下载。 将文件保存到您用于下载的文件夹。
如果您正在运行比特币客户端软件,请退出。 请务必不要使用积极使用的钱包。
我们将把区块链的下载文件复制到比特币客户端数据目录中。 您应该至少运行一次客户端软件,以便它可以生成数据目录。 将下载的bootstrap.dat文件复制到Bitcoin数据文件夹中。
打开资源管理器,然后在地址栏中输入:
%APPDATA%\Bitcoin
这将打开数据文件夹。 它应该看起来像下面的图片。 将bootstrap.dat从您的下载文件夹复制到此目录。
现在启动比特币客户端软件。 它应该显示“从磁盘导入块”,如下图所示。
等到导入完成。 客户将下载未被导入覆盖的最后日子。 恭喜你已成功导入区块链!
是的,上述方法是安全的。 下载仅包含原始块链数据,客户端在导入时验证此数据。 不要从非官方来源下载区块链,特别是如果它们提供`* .rev`和`* .sst`文件。 这些文件未经过验证,可能包含恶意编辑。
参看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
下载并解压缩 i686-4.8.2-release-posix-dwarf-rt_v3-rev3.7z 到D盘根目录
设置PATH环境变量,将D:\mingw32\bin;添加到第一个,在命令行模式下输入 gcc -v 会得到以下内容:
Microsoft Windows [版本 10.0.16299.431]
(c) 2017 Microsoft Corporation。保留所有权利。
C:\Users\Administrator>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:\MinGW\msys\1.0\msys.bat,如果闪退,就重启一下电脑
我都放在D:\MinGW\deps下,为什么,因为空间不够了,又不想太多文件夹了
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:\MinGW\include\winerror.h中
打开D:\MinGW\deps\openssl-1.0.1c\crypto\cryptlib.c,在头增加一个#include <winerror.h>,继续make编译
bss_file.c:160:27: error: 'ERROR_NO_UNICODE_TRANSLATION' undeclared (first use in this function)
同样,打开D:\MinGW\deps\openssl-1.0.1c\crypto\bio\bss_file.c,在头增加一个#include <winerror.h>,继续make编译
最终生成D:\MinGW\deps\openssl-1.0.1c\libssl.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:\MinGW\deps\db-4.8.30.NC\build_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使用)
一条条运行以下命令:
1.ActivePerl
https://www.activestate.com/activeperl/downloads
安装完成后,运行cmd,跳向eg文件夹,如下说明perl安装成功:
C:\Users\Administrator>cd C:\Perl64\eg
C:\Perl64\eg>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_Git\BTC\bitcoin094\boost_1_50_0\stage\lib
3.Berkeley DB
http://download.oracle.com/berkeley-db/db-4.8.30.NC.tar.gz
使用vs2013打开db-4.8.30.NC\buildwindows目录下的Berkeley DB.sln,生成解决方案
编译完成后,Berkeley DB头文件路径:\db-4.8.30.NC\build_windows,lib路径:\db-4.8.30.NC\build_windows\Win32\Debug(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:\Qt\Qt5.3.2\5.3\msvc2013)
5.OpenSSL
http://www.openssl.org/source/openssl-1.0.1c.tar.gz
打开VS2013的命令行窗口,进入到openssl-1.0.1c目录下,依次输入以下命令进行编译:
perl Configure VC-WIN32
ms\do_ms
nmake -f ms\ntdll.mak
编译完成后,在各个工程中添加OpenSSL的目录,头文件路径是:\openssl-1.0.1c\include\openssl,lib路径是:\openssl-1.0.1g\out32dll,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:\deps\protobuf-2.6.1\vsprojects下的protobuf.sln,生成解决方案。
Protobuf库是用来把paymentrequest.proto文件生成对应的.h、.cc文件的。
编译完成后,在QT相关的bitcoin-qt、bitcoin-qt-test工程中添加Protobuf的相关目录,头文件路径是:\protobuf-2.6.1\src,lib路径是:\protobuf-2.6.1\vsprojects\Debug(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中包含src\json目录下的文件。
Common中包含src\leveldb下的目录、文件,不包含文件名为xxx_test格式的文件(否则编译代码时候会报错),不包含\leveldb\port\portposix.cc文件。
在bitcoin-cli工程中添加bitcoin-cli.cpp以及资源文件bitcoin-cli-res.rc
在bitcoind工程中添加bitcoind.cpp以及资源文件bitcoind-res.rc
在test_bitcoin工程中添加src\test目录下的代码文件,data中包含了src\test\data目录下的文件。工程结构如下:
在bitcoin-qt中添加src\qt中的目录、文件。不包含test目录下的文件。
使用工具protobuf生成proto下的.h.cc文件:
在CMD中,运行\protobuf-2.5.0\vsprojects\Release目录下的protoc.exe,生成paymentrequest.proto文件对应的头文件、源文件,命令格式:
F:\OpenSource_Git\BTC\bitcoin094\protobuf-2.6.1\vsprojects\Release>protoc --proto_path=F:\OpenSource_Git\BTC\bitcoin094\bitcoin-0.9.4\src\qt --cpp_out=F:\OpenSource_Git\BTC\bitcoin094\bitcoin-0.9.4\src\qt F:\OpenSource_Git\BTC\bitcoin094\bitcoin-0.9.4\src\qt\paymentrequest.proto
把生成的paymentrequest.pb.h、paymentrequest.cc文件添加到bitcoin-qt、bitcoin-qt-test工程的proto文件夹中
在bitcoin-qt-test工程中添加src\qt\test目录下的文件。添加bitcoin-qt的代码文件。工程结构如下:
设置工程属性
通用配置
1.使用多字节字符集
2.设置leveldb相关的头文件路径,包含3个,分别是:
..\..\..\src\leveldb
..\..\..\src\leveldb\include
..\..\..\src\leveldb\helpers\memenv
3.设置OpenSSL、Berkeley DB、Boost包含文件、库文件路径;
..\..\..\..\3rdParty\openssl-1.0.1c\include
..\..\..\..\3rdParty\boost_1_50_0\include
..\..\..\..\3rdParty\db-4.8.30.NC\include
4.设置附加库目录:
..\..\..\..\3rdParty\openssl-1.0.1c\lib
..\..\..\..\3rdParty\db-4.8.30.NC\lib
..\..\..\..\3rdParty\boost_1_50_0\lib
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.将文件\leveldb\db\c.cc中的#include <unistd.h>替换为:
#ifndef _UNISTD_H
#define _UNISTD_H
#include <io.h>
#include <process.h>
#endif
10.把文件\leveldb\db\db_bench.cc和leveldb\db\leveldb_main.cc中的main函数注释掉
11.把文件leveldb\db\db_iter.cc增加typedef signed int ssize_t;
12.BTC源码中有2个bloom文件,分别是bloom.cpp、\leveldb\util\bloom.cc,编译时生成的bloom.obj冲突,把其中1个文件改名即可,把bloom.cc改名为bloomdb.cc
BTC源码中有2个hash文件,分别是hash.cpp、\leveldb\util\hash.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.额外增加附加库目录:
..\..\..\..\3rdParty\protobuf-2.6.1\lib
$(QTDIR)\lib
$(QTDIR)\plugins\platforms
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)
..\..\..\..\3rdParty\protobuf-2.6.1\include
$(QTDIR)\include
$(QTDIR)\include\QtCore
$(QTDIR)\include\QtGui
$(QTDIR)\include\QtNetwork
$(QTDIR)\include\QtWidgets
$(QTDIR)\include\QtOpenGL
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:\Qt\Qt5.3.2\5.3\msvc2013</QTDIR>
<DebuggerFlavor>WindowsLocalDebugger</DebuggerFlavor>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<LocalDebuggerEnvironment>PATH=$(QTDIR)\bin%3b"$(QTDIR)\bin%3b$(PATH)</LocalDebuggerEnvironment>
<QTDIR>D:\Qt\Qt5.3.2\5.3\msvc2013</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)(); }
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。