public IExpressStore GetCheckpointStore(string checkPointPath) { if (chain.ConsensusNodes.Count != 1) { throw new ArgumentException("Checkpoint restore is only supported on single node express instances", nameof(chain)); } var node = chain.ConsensusNodes[0]; if (IsRunning(node)) { throw new Exception($"node already running"); } checkPointPath = ResolveCheckpointFileName(checkPointPath); if (!fileSystem.File.Exists(checkPointPath)) { throw new Exception($"Checkpoint {checkPointPath} couldn't be found"); } var checkpointTempPath = fileSystem.GetTempFolder(); var folderCleanup = AnonymousDisposable.Create(() => { if (fileSystem.Directory.Exists(checkpointTempPath)) { fileSystem.Directory.Delete(checkpointTempPath, true); } }); var multiSigAccount = node.Wallet.Accounts.Single(a => a.IsMultiSigContract()); RocksDbStore.RestoreCheckpoint(checkPointPath, checkpointTempPath, chain.Magic, multiSigAccount.ScriptHash); return(new CheckpointStore(RocksDbStore.OpenReadOnly(checkpointTempPath), true, folderCleanup)); }
public void RestoreCheckpoint(string checkPointArchive, bool force) { if (chain.ConsensusNodes.Count != 1) { throw new ArgumentException("Checkpoint restore is only supported on single node express instances", nameof(chain)); } checkPointArchive = ResolveCheckpointFileName(checkPointArchive); if (!fileSystem.File.Exists(checkPointArchive)) { throw new Exception($"Checkpoint {checkPointArchive} couldn't be found"); } var node = chain.ConsensusNodes[0]; if (IsRunning(node)) { var scriptHash = node.Wallet.DefaultAccount?.ScriptHash ?? "<unknown>"; throw new InvalidOperationException($"node {scriptHash} currently running"); } var checkpointTempPath = fileSystem.GetTempFolder(); using var folderCleanup = AnonymousDisposable.Create(() => { if (fileSystem.Directory.Exists(checkpointTempPath)) { fileSystem.Directory.Delete(checkpointTempPath, true); } }); var multiSigAccount = node.Wallet.Accounts.Single(a => a.IsMultiSigContract()); var nodeFolder = fileSystem.GetNodePath(node); if (fileSystem.Directory.Exists(nodeFolder)) { if (force) { fileSystem.Directory.Delete(nodeFolder, true); } else { throw new Exception("You must specify force to restore a checkpoint to an existing blockchain."); } } RocksDbStore.RestoreCheckpoint(checkPointArchive, checkpointTempPath, chain.Magic, multiSigAccount.ScriptHash); fileSystem.Directory.Move(checkpointTempPath, nodeFolder); }