3

I'm trying to compile v0.8.6 of the core client from source, in order to compare IDB (Initial Blockchain Download) performance between versions.

I created a fresh Ubuntu Xenial 16.04 machine on Amazon EC2. I then ran the following commands (which were sufficient for version 0.9.3 and up):

sudo apt-get update
sudo apt-get upgrade -y
sudo apt-get install build-essential autoconf libboost-all-dev \
                     libssl-dev libtool pkg-config libevent-dev

In addition for this specific version I ran:

sudo apt-get install libdb++-dev libminiupnpc-dev

I then checked out the source and started the compilation:

git clone https://github.com/bitcoin/bitcoin.git
cd bitcoin
git checkout v0.8.6
cd src/
make -f makefile.unix

I'm only interested in running headless bitcoind, but I'm not sure if it was already separated form the UI at that release.

I get the following error:

rpcrawtransaction.cpp:241:77:   required from here
/usr/include/boost/variant/get.hpp:178:5: error: invalid application of ‘sizeof’ to incomplete type ‘boost::STATIC_ASSERTION_FAILURE<false>’
 BOOST_STATIC_ASSERT_MSG(
 ^
makefile.unix:172: recipe for target 'obj/rpcrawtransaction.o' failed
make: *** [obj/rpcrawtransaction.o] Error 1

Interestingly 0.7, 0.6 and 0.5 do compile successfully, although they get stuck during IDB, so perhaps compilation just failed silently. I'll make a separate post for those later.

I suspect that I need to install some very specific versions of dependencies, but I'm not sure which and how to go about that. I haven't used Linux in years.

I still have the VM, so I can provide more details if needed.

I'm open to alternative approaches, even using a Windows VM :-)

Sjors Provoost
  • 858
  • 6
  • 16
  • 1
    1) [This thread](https://github.com/bitcoin/bitcoin/issues/6113) suggests unsetting BOOST_VARIANT_USE_RELAXED_GET_BY_DEFAULT, or applying [this change](https://github.com/bitcoin/bitcoin/commit/8b08d9530b93c7a98e7387167ecd2cd5b0563bfb). 2) What's your boost version? PS: Neat project! – Nick ODell Jul 05 '17 at 17:24
  • 1
    @NickODell `libboost-all-dev` version 1.58.0. I might try the gitian approach first though. – Sjors Provoost Jul 05 '17 at 18:13
  • 1
    As for pre-0.8 versions getting stuck in IBD, you'll need to increase the number of BDB locks as described here: https://bitcoin.org/en/alert/2013-03-15-upgrade-deadline. – Pieter Wuille Jul 05 '17 at 18:27
  • @PieterWuille thanks, I actually already did that. They get stuck at different blocks: https://gist.github.com/Sjors/70f14baf1f834f3547bf35553faff610#v072 I might try gitian for those too, because I'm pretty sure the dependencies are a mess on default modern Ubuntu. – Sjors Provoost Jul 05 '17 at 18:32
  • 1
    You're using a too recent OpenSSL version which requires strict DER signatures, which only became mandatory in Bitcoin after BIP66. You'll need the patch here: https://github.com/bitcoin/bitcoin/pull/5634/files in order to use the pre-BIP66 chain with new OpenSSL. – Pieter Wuille Jul 05 '17 at 21:21
  • P.S. so it took 184 hours to sync. Here's the chart: https://medium.com/@provoost/historical-bitcoin-core-client-performance-c5f16e1f8ccb – Sjors Provoost Jul 22 '17 at 10:53
  • do you know the dependencies that you needed to build 0.8.6 and the other pre-0.8 versions? Thanks for any insight! – LeanMan Jul 18 '20 at 02:39
  • Just to clarify, the versions of the dependencies you used. (e.g., you already mentioned 1.58.0 boost - what about the others? Thanks!) – LeanMan Jul 18 '20 at 02:50

2 Answers2

2

You can use the gitian build system. Instructions for building 0.8.x with gitian are available here: https://github.com/bitcoin/bitcoin/tree/0.8/contrib/gitian-descriptors and here: https://github.com/bitcoin/bitcoin/blob/0.8/doc/release-process.md. Using gitian should get you exactly the same binaries as those that were released.

Andrew Chow
  • 67,209
  • 5
  • 76
  • 149
  • Thanks, that's a great opportunity to learn about Gitian. I'll mark your answer as Accepted if that works out. – Sjors Provoost Jul 05 '17 at 18:06
  • Unfortunately this won't work out of the box on EC2 (T2): `sudo /usr/sbin/kvm-ok INFO: Your CPU does not support KVM extensions KVM acceleration can NOT be used` It looks like I would have to use something fancy like [Ravello](https://www.ravellosystems.com/blog/run-nested-kvm-on-aws-google/), or am I missing something? – Sjors Provoost Jul 06 '17 at 09:22
  • 1
    IIRC EC2 itself is a VM, so you can't use KVM in it. However, you should be able to use LXC and there are instructions for that at the bottom of the first link I posted (ignore the virtualbox stuff). You will need to do the `make-base-vm` commands with the `--lxc` option too. – Andrew Chow Jul 06 '17 at 16:33
1

Nick ODell pointed me to the solution:

Edit rpcrawtransaction.cpp and change:

const CScriptID& hash = boost::get<const CScriptID&>(address);

To:

const CScriptID& hash = boost::get<CScriptID>(address);

This was sufficient to get it to compile.

In addition I applied the OpenSSL patch Pieter Wuille pointed out.

You have to do this manually because depends/packages/openssl.mk no longer exists, and the function name and signature has changed. Simply open src/key.cpp and replace everything inside the CKey::Verify function brackets with this new version.

More than 210,000 blocks synced so far, so I'm assuming this worked.

Sjors Provoost
  • 858
  • 6
  • 16