學習比特幣程式碼庫的好方法是什麼?
我已經閱讀了掌握比特幣和其他高級資源,並且我相信我對比特幣有相當的了解。我現在想閱讀和理解原始碼。但是,我對 cpp 很陌生,不知道完成這項任務的好方法。有沒有一種系統的方法可以用來有效地學習程式碼庫?
一些好的起點是使用者或網路向比特幣核心輸入內容的地方。這些明顯的兩個地方是 RPC 函式和網路消息處理。RPC 程式碼位於
src/rpc
和src/wallet/rpcwallet.cpp
中src/rpcdump.cpp
。網路消息處理在src/net_processing.cpp
. 通過跟踪函式呼叫並查找全域變數被添加和設置的位置,您可以進入程式碼庫的大部分部分。例如,假設您查看了
sendtoaddress
. 您將從 RPC 函式開始src/wallet/rpcwallet.cpp
並跟踪執行路徑。您會看到它最終會轉到src/wallet/wallet.cpp
以及它如何使用該CreateTransaction
功能。從這裡,您將了解硬幣選擇的工作原理。現在您將看到錢包如何選擇用於交易支出的硬幣。但是它首先是如何發現這些的呢?好吧,當您進行跟踪
sendtoaddress
時,您會遇到AvailableCoins
迭代一些名為的變數mapWallet
並從其中提取內容mapWallet
以建構可選擇硬幣的列表。因此mapWallet
必須是儲存交易的位置,因此您可以mapWallet
在程式碼庫中搜尋變數。這將告訴您該變數在哪裡被使用,並且您可以通過使用mapWallet
來了解它是如何填充和使用的。這樣做會引導您使用填充的函式
mapWallet
。所以現在你想追溯:是什麼呼叫了這些函式,我們是如何到達那個函式的。例如,對於填充mapWallet
,您將遇到AddToWallet
。什麼叫AddToWallet
?功能AddToWalletIfInvolvingMe
。你可以繼續往回走,以了解它是如何運作的。相同的方法可以應用於網路消息處理。例如,假設您想了解塊處理。開始的地方是收到一個塊時,所以在函式中
src/net_processing.cpp
查找。從這裡您可以像我們對 RPC 所做的那樣跟踪函式呼叫和全域變數。它將帶您進入工作量證明驗證以及如何計算塊的目標。它將帶您進行交易驗證。您最終將看到腳本解釋器以及它如何評估事務中的腳本。等等。NetMsgType::BLOCK``ProcessMessage
您可以對每個 RPC 和每個網路消息類型重複此操作,以找出處理事情的位置和方式。這將使您了解大部分程式碼庫。網路消息處理將使您通過所有共識和大部分程式碼庫。跟踪 RPC 基本上可以幫助您完成其他所有事情,因為使用者可以做的幾乎所有事情都可以通過 RPC 完成。這兩個通用入口點是瀏覽程式碼庫並了解 Bitcoin Core 在內部做什麼的好地方。