比特币核心阻止多开造成数据冲突的方法

.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前获取锁会导致父子进程同时持有锁,导致问题。
posted @ 2024-03-07 13:22  nanlour  阅读(27)  评论(0)    收藏  举报