Compilando Bitcoin Core v0.10.0 en Ubuntu 20.04

Estoy tratando de compilar Bitcoin Core v0.10.0 en Ubuntu 20.04, pero aparece el siguiente error:

rpcserver.cpp: En la función 'void StartRPCThreads()':
rpcserver.cpp:594:77: error: no hay función coincidente para llamar a 'boost::asio::ssl::context::context(boost::asio::io_service&, boost::asio::ssl::context_base: :método)'
  594 | rpc_ssl_context = nuevo ssl::context(*rpc_io_service, ssl::context::sslv23);
      | ^
En el archivo incluido desde /usr/include/boost/asio/ssl/context.hpp:757,
                 de /usr/include/boost/asio/ssl.hpp:18,
                 de rpcprotocol.h:16,
                 de rpcserver.h:10,
                 de rpcserver.cpp:6:
/usr/include/boost/asio/ssl/impl/context.ipp:371:1: nota: candidato: 'boost::asio::ssl::context::context(boost::asio::ssl::context&& )'
  371 | contexto::contexto(contexto&& otro)
      | ^~~~~~~
/usr/include/boost/asio/ssl/impl/context.ipp:371:1: nota: el candidato espera 1 argumento, se proporcionan 2
/usr/include/boost/asio/ssl/impl/context.ipp:63:1: nota: candidato: 'boost::asio::ssl::context::context(boost::asio::ssl::context_base ::método)'
   63 | contexto::contexto(contexto::método m)
      | ^~~~~~~
/usr/include/boost/asio/ssl/impl/context.ipp:63:1: nota: el candidato espera 1 argumento, se proporcionan 2
rpcserver.cpp:613:50: error: 'class boost::asio::ssl::context' no tiene ningún miembro llamado 'impl'
  613 | SSL_CTX_set_cipher_list(rpc_ssl_context->impl(), strCiphers.c_str());
      | ^~~~
rpcserver.cpp: En instanciación de 'void RPCListen(boost::shared_ptr >, boost::asio::ssl::context&, bool) [con Protocolo = boost::asio::ip::tcp; SocketAcceptorService = impulso::asio::ejecutor]':
rpcserver.cpp:673:58: requerido desde aquí
rpcserver.cpp:482:111: error: 'class boost::asio::basic_socket_acceptor' no tiene ningún miembro llamado 'get_io_service'
  482 | boost::shared_ptr > conn(new AcceptedConnectionImpl(aceptador->get_io_service(), context, fUseSSL));
      | ~~~~~~~~~~^~~~~~~~~~~~~~
En el archivo incluido de natives/block.h:9,
                 de chainparams.h:11,
                 de base58.h:17,
                 de rpcserver.cpp:8:
./primitives/transaction.h: En instanciación de 'static _OI std::__copy_move::__copy_m(_II, _II, _OI) [with _II = const CTxOut*; _OI = CTxSalida*]':
/usr/include/c++/9/bits/stl_algobase.h:404:30: requerido de '_OI std::__copy_move_a(_II, _II, _OI) [con bool _IsMove = false; _II = const CTxSalida*; _OI = CTxSalida*]'
/usr/include/c++/9/bits/stl_algobase.h:441:30: requerido de '_OI std::__copy_move_a2(_II, _II, _OI) [con bool _IsMove = false; _II = __gnu_cxx::__normal_iterator >; _OI = __gnu_cxx::__normal_iterator >]'
/usr/include/c++/9/bits/stl_algobase.h:474:7: requerido de '_OI std::copy(_II, _II, _OI) [with _II = __gnu_cxx::__normal_iterator >; _OI = __gnu_cxx::__normal_iterator >]'
/usr/include/c++/9/bits/vector.tcc:238:31: requerido de 'std::vector& std::vector::operator=(const std::vector&) [con _Tp = CTxOut; _Alloc = estándar:: asignador]'
monedas.h:90:19: requerido desde aquí
./primitives/transaction.h:103:7: advertencia: implícitamente declarado 'CScript& CScript::operator=(const CScript&)' está en desuso [-Wdeprecated-copy]
  103 | clase CTxOut
      | ^~~~~~
En el archivo incluido de ./primitives/transaction.h:10,
                 de primitivas/bloque.h:9,
                 de chainparams.h:11,
                 de base58.h:17,
                 de rpcserver.cpp:8:
./script/script.h:365:5: nota: porque 'CScript' tiene 'CScript::CScript(const CScript&)' proporcionado por el usuario
  365 | CScript(const CScript& b) : std::vector(b.begin(), b.end()) { }
      | ^~~~~~~
En el archivo incluido de /usr/include/c++/9/algorithm:61,
                 de serializar.h:9,
                 de cantidad.h:9,
                 de rpcserver.h:9,
                 de rpcserver.cpp:6:
/usr/include/c++/9/bits/stl_algobase.h:342:18: nota: primero se requiere el método sintetizado 'CTxOut& CTxOut::operator=(const CTxOut&)' aquí
  342 | *__resultado = *__primero;
      | ~~~~~~~~~~^~~~~~~~~~
En archivo incluido de chain.h:11,
                 de principal.h:14,
                 de rpcserver.cpp:10:
tinyformat.h: En la función miembro estática 'static const char* tinyformat::detail::FormatIterator::streamStateFromFormat(std::ostream&, unsigned int&, const char*, int, int)':
tinyformat.h:785:21: advertencia: esta declaración puede fallar [-Wimplicit-fallthrough=]
  785 | out.setf(estándar::ios::mayúsculas);
      | ~~~~~~~~^~~~~~~~~~~~~~~~~~~~~
tinyformat.h:786:9: nota: aquí
  786 | caso 'x': caso 'p':
      | ^~~~
tinyformat.h:791:21: advertencia: esta declaración puede fallar [-Wimplicit-fallthrough=]
  791 | out.setf(estándar::ios::mayúsculas);
      | ~~~~~~~~^~~~~~~~~~~~~~~~~~~~~
tinyformat.h:792:9: nota: aquí
  792 | caso 'e':
      | ^~~~
tinyformat.h:797:21: advertencia: esta declaración puede fallar [-Wimplicit-fallthrough=]
  797 | out.setf(estándar::ios::mayúsculas);
      | ~~~~~~~~^~~~~~~~~~~~~~~~~~~~~
tinyformat.h:798:9: nota: aquí
  798 | caso 'f':
      | ^~~~
tinyformat.h:802:21: advertencia: esta declaración puede fallar [-Wimplicit-fallthrough=]
  802 | out.setf(estándar::ios::mayúsculas);
      | ~~~~~~~~^~~~~~~~~~~~~~~~~~~~~
tinyformat.h:803:9: nota: aquí
  803 | caso 'g':
      | ^~~~
make[2]: *** [Makefile:3910: libbitcoin_server_a-rpcserver.o] Error 1
make[2]: dejando el directorio '/usr/local/src/bitcoin-0.10.0/src'
make[1]: *** [Makefile:6475: totalmente recursivo] Error 1
make[1]: dejando el directorio '/usr/local/src/bitcoin-0.10.0/src'
make: *** [Makefile:569: totalmente recursivo] Error 1

Seguí las instrucciones del archivo build-unix.md y creo que el problema está relacionado con las dependencias requeridas, especialmente el paquete libboost-all-dev . Curiosamente, pude compilar todas las versiones publicadas desde la v0.20.1 hasta la 0.16.0, pero nada más antiguo que eso, usando las mismas instrucciones en build-unix.md . Si el problema realmente es libboost-all-dev , ¿cómo puedo resolverlo?

Actualizar:

Instalé boost versión 1.57 como sugirió Pieter con:

tar --bzip2 -xf /ruta/hacia/boost_1_57_0.tar.bz2
cd boost_1_57_0/
./bootstrap.sh --prefijo=/usr/
./b2
sudo ./b2 instalar

Y luego, en la raíz de bitcoin, usé:

./configure --with-boost-liddir=LIB_DIR

Pero como resultado obtuve:

configure: error: ¡No se pudo encontrar una versión de la biblioteca boost_system!

Y probé diferentes caminos pero siempre obtuve el mismo resultado. ¿Es solo un problema de ruta o hay algo más?

Actualización 2:

Aparentemente arreglé el camino con:

./configure --with-boost-libdir=/usr/lib/

Pero cuando ejecuto make me sale este error .

¿Cuál es el problema?

Es posible que necesite una versión anterior de Boost.
¿Sabes qué versión? ¿O incluso si hay algún lugar donde pueda encontrar información sobre la versión de dependencia para la versión específica del núcleo de bitcoin?
Para versiones recientes, esa información está en doc/dependencies.md, pero no existía en el momento de 0.10.0. Simplemente comenzaría con la versión de Boost más reciente en ese momento. Bitcoin Core 0.10.0 se lanzó en febrero de 2015, ¿quizás 1.57 o un poco antes?
Otro aspecto: Bitcoin Core no usaba C++11 hasta 0.13.0, pero el resultado de su compilación sugiere que está usando C++11 aquí. Con un compilador moderno, es posible que desee deshabilitar explícitamente eso ( -std=c++98).
Gracias pieter Lo probaré y actualizaré con los resultados.

Respuestas (1)

Los dos puntos planteados en los comentarios son necesarios para compilar bitcoin core v0.10.0. Primero, la mejor manera de instalar bibliotecas Boost en Unix se describe en build_unix.md, donde en la sección Boost tenemos

sudo su
./bootstrap.sh
./bjam instalar

pero para v0.10.0 necesitamos al menos la versión 1.57 de Boost que se puede encontrar aquí . También necesitaremos versiones anteriores de librerías OpenSSL, en este caso necesitaba los paquetes libssl-devversión 1.0.1f, libssl1.0.0versión 1.0.1f y multiarch-supportversión 2.19.

Después de instalar los paquetes, podemos compilar el núcleo de bitcoin usando

./autogen.sh
./configure --sin-gui CXX="g++ -std=c++98"
hacer
hacer instalar

Las banderas configuresiguen los comentarios para la versión C++ y la ausencia de GUI se debe al hecho de que v0.10.0 solicitará paquetes Qt 4 para la interfaz gráfica que no pude encontrar. Una vez que se sigan esos pasos, el núcleo de bitcoin se compilará con éxito.