1. 程式人生 > >比特幣原始碼解讀之整體框架

比特幣原始碼解讀之整體框架

      本文主要描述了程序啟動時初始化(載入地址、區塊、錢包資訊,啟動節點執行緒以及礦工挖礦執行緒等)、比特幣客戶端交易的發起(交易初始化、提交交易請求、確認和廣播及交易)以及比特幣客戶端當前節點地址和收款方地址。下文將根據總體框架圖分別描述各個功能在原始碼中的函式實現(注:本文不深入函式細節,旨在讓大家對整個框架有個初步瞭解)。
整體框架結構圖如下所示:

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類中,包含新建、重新命名、複製等等方法,如下圖所示:

總結

       本文屬於比特幣系列的第二篇,原始碼介紹的第一篇。本文主要是介紹比特幣總體框架,不涉及各個功能的實現細節,讓大家對比特幣有一個全域性認識,各個功能實現細節將會在後續系列文章中進行描述。大家如果有什麼疑問,可以在本文下方留言。

作者:雨後的蚊子