Lecture du code source Bitcoin

1. Entrez dans le répertoire du code source bitcoin, lisez et compilez d'abord doc / build-unix.md, vérifiez comment le code source bitcoin est compilé, comprenez les bibliothèques dépendantes de bitcoin, vous pouvez probablement savoir quel bitcoin est utilisé, afin d'avoir un spectre!

Bibliothèques requises:

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, analysez la fonction principale 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 fonction SetupEnvironment de l'environnement d'initialisation est implémentée dans 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 bibliothèque glibc créera 2 arènes pour chaque cœur, ce qui entraînera le problème de l'espace d'adressage virtuel insuffisant pour le système 32 bits, donc ici, il est défini sur 1. Les paramètres régionaux suivants (c'est-à-dire les paramètres régionaux du système, c'est-à-dire le pays ou le paramètre régional) détermineront le codage de la langue actuelle, le format de la date, le format numérique et d'autres paramètres régionaux utilisés par le programme. Le fait que les paramètres soient corrects affectera le traitement des chaînes dans le programme (Comment afficher wchar_t, format de strftime (), etc.). Les deux dernières lignes sont les paramètres de localisation du chemin du fichier. Std :: locale :: classic () obtient un objet de paramètres régionaux représentant C locale, qui est principalement conçu pour la conversion entre les caractères larges et les octets multiples .

Vient ensuite la fonction noui_connect (), implémentée dans le fichier 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);

}

Connectez-vous aux objets de signal noui_ThreadSafeMessageBox, noui_ThreadSafeQuestion et noui_InitMessage. Lorsque le signal est déclenché, ces fonctions connectées sont appelées.

Le prochain appel est AppInit, où AppInitMain est la fonction principale de l'application, qui sera développée plus tard!

Publié 30 articles originaux · loué 74 · 230 000 vues +

Je suppose que tu aimes

Origine blog.csdn.net/ruiyiin/article/details/104633215
conseillé
Classement