比特幣核心阻止多開造成資料衝突的方法

nanlour發表於2024-03-07
.bitcoin資料夾中含有敏感資料,如果多個比特幣核心同時讀寫會造成資料破壞,比特幣的做法是在.bitcoin資料夾中建立.lock檔案,一旦獲取鎖就一直鎖住該檔案知道程序結束,阻止其他比特幣程序使用相同的目錄作為資料目錄,程式碼如下:
bool FileLock::TryLock()
{
if (fd == -1) {
return false;
}

struct flock lock;
lock.l_type = F_WRLCK;
lock.l_whence = SEEK_SET;
lock.l_start = 0;
lock.l_len = 0;
if (fcntl(fd, F_SETLK, &lock) == -1) {
reason = GetErrorReason();
return false;
}

return true;
}

同時有一個細節就是
LockResult LockDirectory(const fs::path& directory, const fs::path& lockfile_name, bool probe_only)
可以選擇probe_only,即嘗試獲取鎖在獲取後立即釋放,作用是如果啟動比特幣選擇了 -daemon, 比特幣將在初始化之後fork建立daemon程序,

如果在fork前獲取鎖會導致父子程序同時持有鎖,導致問題。

相關文章