比特币核心阻止多开造成数据冲突的方法
.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进程,
可以选择probe_only,即尝试获取锁在获取后立即释放,作用是如果启动比特币选择了 -daemon, 比特币将在初始化之后fork创建daemon进程,
如果在fork前获取锁会导致父子进程同时持有锁,导致问题。

浙公网安备 33010602011771号