public IExpressNode GetExpressNode(bool offlineTrace = false) { // Check to see if there's a neo-express blockchain currently running by // attempting to open a mutex with the multisig account address for a name chain.InitalizeProtocolSettings(); for (int i = 0; i < chain.ConsensusNodes.Count; i++) { var consensusNode = chain.ConsensusNodes[i]; if (IsRunning(consensusNode)) { return(new Node.OnlineNode(chain, consensusNode)); } } var node = chain.ConsensusNodes[0]; var nodePath = fileSystem.GetNodePath(node); if (!fileSystem.Directory.Exists(nodePath)) { fileSystem.Directory.CreateDirectory(nodePath); } return(new Node.OfflineNode(RocksDbStore.Open(nodePath), node.Wallet, chain, offlineTrace)); }
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); }
public IExpressStore GetNodeStore(ExpressConsensusNode node, bool discard) { var folder = fileSystem.GetNodePath(node); if (discard) { try { var rocksDbStore = RocksDbStore.OpenReadOnly(folder); return(new CheckpointStore(rocksDbStore)); } catch { return(new CheckpointStore(NullReadOnlyStore.Instance)); } } else { return(RocksDbStore.Open(folder)); } }
public CheckpointFixture() { var dbPath = RocksDbUtility.GetTempPath(); try { using var db = RocksDbUtility.OpenDb(dbPath); using var store = new RocksDbStore(db); store.PutSeekData((0, 2), (1, 4)); CheckpointPath = RocksDbUtility.GetTempPath(); RocksDbUtility.CreateCheckpoint(db, CheckpointPath, Network, AddressVersion, ScriptHash); } finally { if (Directory.Exists(dbPath)) { Directory.Delete(dbPath, true); } } }