比特币源码解读-第3章 整体架构

三、整体架构

本章将从比特币整体框架入手,详细描述比特币钱包客户端实现的功能及其功能实现函数,从而构建对比特币源码的整体认知体系。(注:本章不深入阐述源码实现细节,在后续内容中将详细分析相关源码。)

比特币源码解读-第3章 整体架构

3.1初始化

根据第二章的内容,比特币钱包客户端初始化入口在源文件ui.cpp中,其中程序类CMyApp中的OnInit()为比特币钱包的入口点函数,OnInit()通过调用OnInit2()函数具体实现程序初始化操作。

比特币源码解读-第3章 整体架构

3.1.1钱包参数初始化

OnInit2()函数调用ParseParameters()函数对程序输入变量argc、argv进行分割,得到比特币钱包客户端数据文件、调试文件等数据路径。

3.1.2比特币数据初始化

Ø 加载地址

  OnInit2()函数调用LoadAddresses()加载地址,该函数加载addr.txt和addr.dat文件中比特币节点的地址。

Ø 加载索引

  OnInit2()函数调用LoadBlockIndex()加载索引和区块,该函数默认加载blkindex.dat中的数据。

Ø 加载钱包

  OnInit2()函数调用LoadWallet()加载钱包地址,该函数默认wallet.dat中本节点的地址和收款方的地址。

3.1.3 UI界面初始化

数据初始化完成后,通过实例化pframeMain对象,并调用Show()函数完成UI界面初始化。

3.1.4网络初始化

Ø 启动节点,创建处理线程

  OnInit2()函数调用StartNode(strErrors)函数启动当前节点,该节点将监听本地默认端口8333,而后创建4个线程:

(1) 启动获取IRC地址线程:_beginthread(ThreadIRCSeed, 0, NULL)

(2) 启动网络服务线程,处理其它节点连接请求:_beginthread(ThreadSocketHandler, 0, new SOCKET(hListenSocket))

(3) 启动节点链接线程,连接邻近节点:_beginthread(ThreadOpenConnections, 0, NULL)

(4) 启动消息处理线程,处理发送和接收到的消息:_beginthread(ThreadMessageHandler, 0, NULL)

Ø 启动矿工线程

启动矿工挖矿线程:_beginthread(ThreadBitcoinMiner, 0, NULL)

3.2交易发起

比特币钱包客户端发起交易,点击按钮,代码对应在ui.cpp文件中的CSendDialog::OnButtonSend(wxCommandEvent& event) 函数实现。该函数实现以下功能:

Ø 实例化交易对象

Ø 交易金额校验:格式检验、数量校验(是否大于余额)

Ø 调用AddressToHash160()函数得到收款人公钥哈希(hash160)并将创建锁定脚本

Ø SendMoney()函数,实现交易的具体创建过程。

该函数实现了以下功能:

(1) 新建交易CreateTransaction

(2) 提交交易请求CommitTransactionSpent

(3) 接受交易wtxNew.AcceptTransaction

(4) 广播交易wtxNew.RelayWalletTransaction

3.3地址管理

地址管理分为当前节点地址管理和外部节点地址管理,地址信息存储在addr.dat文件中。

Ø 当前节点地址管理功能实现函数定义在ui.h文件中的CYourAddressDialog类中,包含新建、重命名、复制等方法,如下图所示:

比特币源码解读-第3章 整体架构

Ø 收款方地址管理位于CAddressBookDialog类中,包含新建、重命名、复制等等方法,如下图所示:

比特币源码解读-第3章 整体架构