數據目錄是存放比特幣數據文件的位置,包含區塊數據和錢包數據等相關文件。
默認位置
默認位置與操作系統相關,下面列出 3 種常用操作系統下比特幣數據目錄的默認存放位置:
macOSX
~/Library/Application Support/Bitcoin
Unix/Linux
~/.bitcoin
你需要使用“ls -a”來查看以點開頭的(隱藏)目錄。 如果不是該目錄,你也可以這樣搜索:
find / -name wallet.dat -print 2>/dev/null
Windows
C:\Documents and Settings\Username\Application Data\Bitcoin (XP)
C:\Users\Username\AppData\Roaming\Bitcoin (Vista, 7, 8 and 10)
目錄“AppData”和“Application data”默認是隱藏的。
你也可以存儲比特幣數據目錄到任何驅動器或文件。
如果你想存儲到指定目錄 D:\BitcoinData 中,點擊 bitcoin-qt.exe 快捷方式的屬性,在目標后面添加字符串“-datadir=D:\BitcoinData”,如下:
“C:\Program Files (x86)\Bitcoin\bitcoin-qt.ext” -datadir=D:\BitcoinData
啟動比特幣,現在你將看到所有的文件都在新的數據目錄中創建。
源碼剖析
數據目錄默認的位置硬編在源碼“util.cpp”文件的 GetDefaultDataDir() 函數中。
boost::filesystem::path GetDefaultDataDir() { namespace fs = boost::filesystem; // Windows < Vista: C:\Documents and Settings\Username\Application Data\Bitcoin // Windows >= Vista: C:\Users\Username\AppData\Roaming\Bitcoin // Mac: ~/Library/Application Support/Bitcoin // Unix: ~/.bitcoin #ifdef WIN32 // Windows return GetSpecialFolderPath(CSIDL_APPDATA) / "Bitcoin"; #else // Unix/Linux fs::path pathRet; char* pszHome = getenv("HOME"); if (pszHome == NULL || strlen(pszHome) == 0) pathRet = fs::path("/"); else pathRet = fs::path(pszHome); #ifdef MAC_OSX // Mac pathRet /= "Library/Application Support"; TryCreateDirectory(pathRet); return pathRet / "Bitcoin"; #else // Unix return pathRet / ".bitcoin"; #endif #endif }
目錄結構/層級
比特幣版本號:v0.12.1
- bitcoin.conf
- /blocks/
- blk00000.dat
- index/
- 000003.log
- CURRENT
- LOCK
- LOG
- MANIFEST-000002
- rev00000.dat
- /chainstate/
- 000003.log
- CURRENT
- LOCK
- LOG
- MANIFEST-000002
- db.log
- debug.log
- fee_estimates.dat
- peers.dat
- wallet.dat
目錄內容
文件
比特幣核心文檔 file.md 內容總覽。
- .cookie【v0.12.0 及之后的版本】
- 會話 RPC 驗證 cookie(當首次使用 cookie 驗證時寫入,在關閉時刪除)。
- .lock
- 比特幣數據目錄鎖文件。
- banlist.dat
- 存儲禁用節點的 IPs/子網。
- bitcoin.conf【可選】
- 包含用於 bitcoind 或 bitcoin-qt 的配置選項。
- bitcoind.pid
- 存儲 bitcoind 運行時的進程號。
- blocks/blk000??.dat【v0.8.0 及之后的版本】; blkxxxx.dat【v0.8.0 之前的版本】
- 區塊數據(定制,每個文件 128MiB);包含鏈接的原始區塊。存儲的是真正的比特幣區塊,以網絡格式,轉儲到硬盤上。
- blocks/rev000??.dat【v0.8.0 及之后的版本】
- 區塊回退數據(定制)。
- blocks/index/*【v0.8.0 及之后的版本】; blkindex.dat【v0.8.0 之前的版本】
- 區塊索引(LevelDB);與 blkxxxx.dat 一起使用的索引信息。
- chainstate/*【v0.8.0 及之后的版本】
- 區塊鏈狀態數據庫(LevelDB)。
- database/*【v0.8.0 及之后的版本】;【v0.16.0 及之后的版本】
- BDB(Berkeley DB)數據庫環境,僅用於錢包;移動到 wallets/ 目錄下。
- db.log【v0.16.0 及之后的版本】
- 錢包數據庫日志文件,移動到 wallets/ 目錄下。
- debug.log
- 比特幣詳細的日志文件,包含通過 bitcoind 或 bitcoin-qt 生成的調試信息和日志信息。不時自動修剪。
- fee_estimates.dat【v0.10.0 及之后的版本】
- 存儲用於確認所必需的估算的最小交易費和優先級的統計數據。在程序關閉之前保存,並在啟動時讀入。
- indexes/txindex/*【v0.17.0 及之后的版本】
- 可選的交易索引數據庫(LevelDB)。
- mempool.dat【v0.14.0 及之后的版本】
- 內存池交易的導出數據。
- peers.dat【v0.7.0 及之后的版本】; addr.dat【v0.7.0 之前的版本】
- 對端 IP 地址數據庫(特定的格式)。存儲對端信息以便更容易重連。該文件使用比特幣指定的文件格式,與任何數據庫系統不相關;存儲 ip 地址以便更容易重新連接。
- wallets/wallet.dat【v0.16.0 及之后的版本】; wallet.dat
- 包含密鑰和交易的個人錢包(BDB);存儲密鑰,交易,元數據和選項。請務必備份該文件。它包含花費你的比特幣所必須的密鑰。
- wallets/database/*【v0.16.0 及之后的版本】
- BDB 數據庫環境。
- wallets/db.log【v0.16.0 及之后的版本】
- 錢包數據庫日志文件。
- onion_private_key【v0.12.0 及之后的版本】
- 使用 -listenonion 選項緩存的洋蔥路由隱藏服務私鑰。
- guisettings.ini.bak
- 使用 -resetguisettings 選項后之前的 GUI 設置的備份。
該數據,索引和日志文件通過 Oracle Berkeley DB 使用,這是比特幣使用的嵌入式鍵/值對數據存儲。
數據庫子目錄
包含 BDB(Berkeley DB)日志文件。
testnet3 子目錄
包含這些文件的測試網版本(如果使用啟動選項 -testnet 運行)。
區塊子目錄【v0.8 及以上版本】
包含區塊鏈數據。
- blk*.dat
- 以網絡格式存儲真正的比特幣區塊到硬盤上。它們僅用於重新掃描錢包中丟失的交易,重組到鏈的不同部分,以及將區塊數據提供給正在同步的其他節點。
- blocks/index 子目錄【v0.8 及以上版本】
- LevelDB 數據庫,包含關於所有已知區塊的元數據,以及在硬盤上找到它們的位置。沒有這個,找到一個區塊將會非常慢。
鏈狀態子目錄【v0.8 及以上版本】
LevelDB 數據庫,具有所有當前未花費的交易輸出的緊湊表達和關於它們來源交易的一些元數據。 此處的數據對驗證新傳入區塊和交易是必須的。 從理論上講,它可以從區塊數據重建(參閱 -reindex 命令行選項),但這需要相當長的時間。 如果沒有它,理論上你仍然可以進行驗證,但這意味着對於所花費的每個輸出,通過區塊(截至 2017 年 11 月區塊總大小為 150GB)進行全面掃描。
鎖子目錄【v0.8 及以上版本】
包含“撤銷”數據。
- rev*.dat
你可以把區塊當作鏈狀態的“補丁”(它們消耗一些未花費的輸出,並生成新的輸出),並把撤銷數據當作反向補丁。 它們是回滾鏈狀態所必須的,在重組時是必要的。
個人身份識別數據【v0.8 及以上版本】
如果你希望向朋友發送區塊鏈,避免它們大量下載,這部分可能對你有用。
- wallet.dat
- 包含鏈接到它們的地址和交易。請務必備份此文件。它包含花費比特幣所需的密鑰。你不應將此文件傳輸給任何第三方,否則它們可能會光顧你的比特幣。
- db.log
- 可能包含與你的錢包有關的信息。它可以安全刪除。
- debug.log
- 可能包含 IP 地址和交易 ID。它可以安全刪除。
- database/folder
- 這應該僅存於 bitcoin-qt 運行時。它包含你的錢包相關的信息(BDB 狀態)。
- peers.dat
- 不知道是否包含個人身份識別數據。它可以安全刪除。
其他的文件和目錄(blocks, blocks/index, chainstate)可以安全地傳輸/存檔,因為它們包含僅與公共區塊鏈有關的信息。
轉讓
“區塊”和“鏈狀態”目錄中的數據庫文件是跨平台的,可以在不同的平台間進行復制安裝。 這些文件統稱為節點的“區塊數據庫”,表示節點在同步過程中下載的所有信息。 換句話說,如果將 A 節點數據目錄的區塊數據庫復制到 B 節點的數據目錄,B 節點將具有與 A 節點一樣的同步百分比。 這通常比再次進行普通初始化同步快得多。但是,當你以這種方式復制某人的數據庫,你必須絕對信任他。 比特幣核心將其區塊數據庫文件當作 100% 准確且值得信賴,而在正常初始化同步期間,它將對端提供的每個區塊視為無效,直到另有證明為止。 如果攻擊者能夠修改你的區塊數據文件,那么他們可以做各種導致你丟失比特幣的邪惡事件。 因此,你應該只在你個人的控制下從別人那里復制區塊數據庫,並且只能通過安全連接復制。
每個節點都有一個唯一的區塊數據庫,並且所有文件都是高可連接的。 所以,如果你把一個數據目錄中的“區塊”或“鏈狀態”目錄中的幾個文件復制到另一個數據目錄中,這幾乎肯定會導致第二個節點崩潰或在未來的某個隨機點卡住。 如果你想把區塊數據庫從一個數據目錄復制到另一個數據目錄,必須刪除舊數據庫並一次復制全部文件。 復制時必須關閉兩個節點。
只寫入“區塊”目錄中編號最大的文件。之前的文件永遠不會改變。 此外,當訪問這些區塊 blk.dat 文件時,通常按高度順序訪問它們。 因此,可以把“區塊”目錄或 blk.dat 文件的某個自己單獨符號鏈接到磁存儲驅動器上而不會造成太大的性能損失(參閱拆分數據目錄), 以及如果兩個節點以相同的區塊數據庫啟動(由於前面描述的復制),后續同步運行將非常有效。
Thanks for your time.