比特幣原始碼解讀之整體框架
本文主要描述了程序啟動時初始化(載入地址、區塊、錢包資訊,啟動節點執行緒以及礦工挖礦執行緒等)、比特幣客戶端交易的發起(交易初始化、提交交易請求、確認和廣播及交易)以及比特幣客戶端當前節點地址和收款方地址。下文將根據總體框架圖分別描述各個功能在原始碼中的函式實現(注:本文不深入函式細節,旨在讓大家對整個框架有個初步瞭解)。
整體框架結構圖如下所示:
1 初始化引數
(1)初始化入口在ui.cpp的OnInit()函式,OnInit()呼叫OnInit2()函式。
(2)OnInit2()函式呼叫LoadAddresses()載入地址,該函式載入addr.txt檔案中其他節點的地址。
(3)OnInit2()函式呼叫LoadBlockIndex()載入區塊,該函式預設載入blkindex.dat中的資料。
(4)OnInit2()函式呼叫LoadWallet()載入錢包地址,該函式預設wallet.dat中本節點的地址和收款方的地址。
(5)OnInit2()函式呼叫ReacceptWalletTransactions()處理孤立塊。
(6)OnInit2()函式呼叫StartNode(strErrors)函式啟動當前節點,該節點將監聽本地預設埠8333,而後建立4個執行緒:
- 從IRC中獲取地址資訊:_beginthread(ThreadIRCSeed, 0, NULL)
- 接收其他節點的連線請求資訊_beginthread(ThreadSocketHandler, 0, new SOCKET(hListenSocket))
- 本節點和其他節點建立聯絡_beginthread(ThreadOpenConnections, 0, NULL)
- 訊息處理執行緒,處理髮送和接收的消_beginthread(ThreadMessageHandler, 0, NULL)
(7)OnInit2()函式將啟動ThreadBitcoinMiner執行緒,該執行緒用來區塊的產生、交易的確認等等。
2 交易
(1)比特幣客戶端發起交易入口在ui.cpp檔案
CSendDialog::OnButtonSend(wxCommandEvent& event) 函式進行處理。
(2)交易的發起位於SendMoney()函式,該函式實現了以下功能:
- 新建交易CreateTransaction
- 提交交易請求CommitTransactionSpent
- 接受交易wtxNew.AcceptTransaction
- 廣播交易wtxNew.RelayWalletTransaction
3 地址管理
地址管理分為當前節點地址管理和收款方地址管理,地址儲存在wallet.dat檔案中。
(1)當前節點地址管理位於CYourAddressDialog類中,包含新建、重新命名、複製等等方法,如下圖所示:
(2)收款方地址管理位於CAddressBookDialog類中,包含新建、重新命名、複製等等方法,如下圖所示:
總結
本文屬於比特幣系列的第二篇,原始碼介紹的第一篇。本文主要是介紹比特幣總體框架,不涉及各個功能的實現細節,讓大家對比特幣有一個全域性認識,各個功能實現細節將會在後續系列文章中進行描述。大家如果有什麼疑問,可以在本文下方留言。
作者:雨後的蚊子