Lectura del código fuente de Bitcoin

1. Ingrese al directorio de código fuente de bitcoin, lea y compile doc / build-unix.md primero, verifique cómo se compila el código fuente de bitcoin, comprenda las bibliotecas dependientes de bitcoin, probablemente pueda saber qué bitcoin se utiliza, ¡para que tenga un espectro!

Bibliotecas requeridas:

Library    | Purpose          | Description

------------|------------------|----------------------

libssl      | Crypto          | Random Number Generation, Elliptic Curve Cryptography(毕竟是加密货币,猜都猜到用openssl)

libboost    | Utility          | Library for threading, data structures, etc(武器弹药库)

libevent    | Networking      | OS independent asynchronous networking(异步网络编程必备,为什么还用这么老的库)

Optional dependencies:

Library    | Purpose          | Description

------------|------------------|----------------------

miniupnpc  | UPnP Support    | Firewall-jumping support(用于P2P吗)

libdb4.8    | Berkeley DB      | Wallet storage (only needed when wallet enabled)(钱包存储用的berkeley DB)

qt          | GUI              | GUI toolkit (only needed when GUI enabled)(qt,gui编程的老相好)

protobuf    | Payments in GUI  | Data interchange format used for payment protocol (only needed when GUI enabled)(用于支付协议,不是json吗,gui内部数据传输格式?)

libqrencode | QR codes in GUI  | Optional for generating QR codes (only needed when GUI enabled)(二维码库)

univalue    | Utility          | JSON parsing and encoding (bundled version will be used unless --with-system-univalue passed to configure)(json解析和编码)

libzmq3    | ZMQ notification | Optional, allows generating ZMQ notifications (requires ZMQ version >= 4.x)(用于通知,哪些消息需要用通知的方式?)

2, analice la función principal de src / bitcoind.cpp

int main(int argc, char* argv[])
{

    SetupEnvironment();

    // Connect bitcoind signal handlers

    noui_connect();

    return (AppInit(argc, argv) ? EXIT_SUCCESS : EXIT_FAILURE);

}

La función SetupEnvironment del entorno de inicialización se implementa en src / util.cpp

void SetupEnvironment()

{

#ifdef HAVE_MALLOPT_ARENA_MAX

    // glibc-specific: On 32-bit systems set the number of arenas to 1.

    // By default, since glibc 2.10, the C library will create up to two heap

    // arenas per core. This is known to cause excessive virtual address space

    // usage in our usage. Work around it by setting the maximum number of

    // arenas to 1.

    if (sizeof(void*) == 4) {

        mallopt(M_ARENA_MAX, 1);

    }


#endif

    // On most POSIX systems (e.g. Linux, but not BSD) the environment's locale

    // may be invalid, in which case the "C" locale is used as fallback.

#if !defined(WIN32) && !defined(MAC_OSX) && !defined(__FreeBSD__) && !defined(__OpenBSD__)

    try {

        std::locale(""); // Raises a runtime error if current locale is invalid

    } catch (const std::runtime_error&) {

        setenv("LC_ALL", "C", 1);

    }

#endif

    // The path locale is lazy initialized and to avoid deinitialization errors

    // in multithreading environments, it is set explicitly by the main thread.

    // A dummy locale is used to extract the internal default locale, used by

    // fs::path, which is then used to explicitly imbue the path.

    std::locale loc = fs::path::imbue(std::locale::classic());

    fs::path::imbue(loc);

}

La biblioteca glibc creará 2 arenas para cada núcleo, y esto causará el problema de espacio de direcciones virtual insuficiente para el sistema de 32 bits, por lo que aquí se establece en 1. La siguiente configuración regional (es decir, la configuración regional del sistema, es decir, la configuración regional o del país) determinará la codificación de idioma actual, el formato de fecha, el formato de número y otras configuraciones relacionadas con la región utilizadas por el programa. La corrección de la configuración afectará el procesamiento de cadenas en el programa (Cómo generar wchar_t, formato de strftime (), etc.). Las dos últimas líneas son las configuraciones de localización de la ruta del archivo. Std :: locale :: classic () obtiene un objeto de configuración regional que representa la configuración regional C, que está diseñado principalmente para la conversión entre ancho de caracteres y múltiples bytes .

La siguiente es la función noui_connect (), implementada en el archivo src / noui.cpp,

void noui_connect()

{

    // Connect bitcoind signal handlers

    uiInterface.ThreadSafeMessageBox.connect(noui_ThreadSafeMessageBox);

    uiInterface.ThreadSafeQuestion.connect(noui_ThreadSafeQuestion);

    uiInterface.InitMessage.connect(noui_InitMessage);

}

Conéctese a los objetos de señal noui_ThreadSafeMessageBox, noui_ThreadSafeQuestion y noui_InitMessage. Cuando se activa la señal, se llamarán estas funciones conectadas.

La próxima llamada es AppInit, donde AppInitMain es la función principal de la aplicación, que se ampliará más adelante.

30 artículos originales publicados · elogiados 74 · 230,000 vistas +

Supongo que te gusta

Origin blog.csdn.net/ruiyiin/article/details/104633215
Recomendado
Clasificación