比特币源码解读-第3章 整体架构
三、整体架构
本章将从比特币整体框架入手,详细描述比特币钱包客户端实现的功能及其功能实现函数,从而构建对比特币源码的整体认知体系。(注:本章不深入阐述源码实现细节,在后续内容中将详细分析相关源码。)
3.1初始化
根据第二章的内容,比特币钱包客户端初始化入口在源文件ui.cpp中,其中程序类CMyApp中的OnInit()为比特币钱包的入口点函数,OnInit()通过调用OnInit2()函数具体实现程序初始化操作。
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类中,包含新建、重命名、复制等方法,如下图所示:
Ø 收款方地址管理位于CAddressBookDialog类中,包含新建、重命名、复制等等方法,如下图所示: