Как скомпилировать Core 0.8.6 в Ubuntu (EC2)?

Я пытаюсь скомпилировать v0.8.6 основного клиента из исходного кода , чтобы сравнить производительность IDB (начальная загрузка блокчейна) между версиями.

Я создал новую машину Ubuntu Xenial 16.04 на Amazon EC2. Затем я выполнил следующие команды (которых было достаточно для версии 0.9.3 и выше):

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

Кроме того, для этой конкретной версии я запустил:

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

Затем я проверил исходный код и начал компиляцию:

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

Меня интересует только запуск headless bitcoind, но я не уверен, что он уже был отделен от пользовательского интерфейса в этом выпуске.

Я получаю следующую ошибку:

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

Интересно, что версии 0.7, 0.6 и 0.5 успешно компилируются, хотя они зависают во время IDB, так что, возможно, компиляция просто не удалась. Позже сделаю для них отдельный пост.

Я подозреваю, что мне нужно установить некоторые очень специфические версии зависимостей, но я не уверен, какие и как это сделать. Я не использовал Linux в течение многих лет.

У меня все еще есть виртуальная машина, поэтому я могу предоставить более подробную информацию, если это необходимо.

Я открыт для альтернативных подходов, даже с использованием виртуальной машины Windows :-)

1) В этой теме предлагается отменить настройку BOOST_VARIANT_USE_RELAXED_GET_BY_DEFAULT или применить это изменение . 2) Какая у вас буст версия? P.S. Крутой проект!
@NickODell libboost-all-devверсия 1.58.0. Я мог бы сначала попробовать gitian подход.
Что касается версий до 0.8, которые застревают в IBD, вам необходимо увеличить количество блокировок BDB, как описано здесь: bitcoin.org/en/alert/2013-03-15-upgrade-deadline .
@PieterWuille спасибо, на самом деле я уже это сделал. Они застревают в разных блоках: gist.github.com/Sjors/70f14baf1f834f3547bf35553faff610#v072 Я мог бы попробовать gitian и для них, потому что я уверен, что зависимости по умолчанию в современной Ubuntu беспорядочны.
Вы используете слишком свежую версию OpenSSL, которая требует строгих подписей DER, которые стали обязательными в биткойнах только после BIP66. Вам понадобится патч здесь: github.com/bitcoin/bitcoin/pull/5634/files , чтобы использовать цепочку pre-BIP66 с новым OpenSSL.
PS так что на синхронизацию ушло 184 часа. Вот диаграмма: medium.com/@provoost/…
знаете ли вы зависимости, которые вам понадобились для сборки 0.8.6 и других версий до 0.8? Спасибо за любое понимание!
Просто чтобы уточнить, версии используемых вами зависимостей. (например, вы уже упомянули 1.58.0 boost — а как насчет других? Спасибо!)

Ответы (2)

Вы можете использовать систему сборки gitian. Инструкции по сборке 0.8.x с помощью gitian доступны здесь: https://github.com/bitcoin/bitcoin/tree/0.8/contrib/gitian-descriptors и здесь: https://github.com/bitcoin/bitcoin/blob/ 0.8/doc/релиз-процесс.md . Использование gitian должно дать вам точно такие же двоичные файлы, как те, которые были выпущены.

Спасибо, это отличная возможность узнать о Gitian. Я отмечу ваш ответ как принятый, если это сработает.
К сожалению, это не будет работать из коробки на EC2 (T2): sudo /usr/sbin/kvm-ok INFO: Your CPU does not support KVM extensions KVM acceleration can NOT be usedпохоже, мне придется использовать что-то необычное, например Ravello , или я что-то упускаю?
IIRC EC2 сама по себе является виртуальной машиной, поэтому вы не можете использовать в ней KVM. Тем не менее, вы должны иметь возможность использовать LXC, и для этого есть инструкции внизу первой ссылки, которую я разместил (игнорируйте материал виртуального бокса). Вам также нужно будет выполнять make-base-vmкоманды с --lxcопцией.

Ник ODell указал мне на решение :

Отредактируйте rpcrawtransaction.cppи измените:

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

К:

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

Этого было достаточно, чтобы заставить его скомпилироваться.

Кроме того, я применил патч OpenSSL , указанный Питером Вуйлем .

Вы должны сделать это вручную, потому что depends/packages/openssl.mkбольше не существует, а имя и подпись функции изменились. Просто откройте src/key.cppи замените все внутри CKey::Verifyфункциональных скобок этой новой версией .

На данный момент синхронизировано более 210 000 блоков, поэтому я предполагаю, что это сработало.