public void UnlockAccounts([ValueSource(nameof(UnlockAccountsTestCases))] UnlockAccountsTest test) { IKeyStoreConfig keyStoreConfig = Substitute.For <IKeyStoreConfig>(); keyStoreConfig.Passwords.Returns(test.Passwords); keyStoreConfig.PasswordFiles.Returns(test.PasswordFiles.Select(f => f.Name).ToArray()); keyStoreConfig.UnlockAccounts.Returns(test.UnlockAccounts.Select(a => a.ToString()).ToArray()); IFileSystem fileSystem = Substitute.For <IFileSystem>(); foreach (var passwordFile in test.PasswordFiles) { fileSystem.File.Exists(passwordFile.Name).Returns(passwordFile.Exists); fileSystem.File.ReadAllText(passwordFile.Name).Returns(passwordFile.Content); } IWallet wallet = Substitute.For <IWallet>(); var unlocker = new AccountUnlocker(keyStoreConfig, wallet, fileSystem, LimboLogs.Instance); unlocker.UnlockAccounts(); for (var index = 0; index < test.UnlockAccounts.Length; index++) { var account = test.UnlockAccounts[index]; var expectedPassword = test.ExpectedPasswords[index]; wallet.Received(1).UnlockAccount(account, Arg.Is <SecureString>(s => s.Unsecure() == expectedPassword), TimeSpan.FromDays(1000)); } }
public NodeKeyManager(ICryptoRandom cryptoRandom, IKeyStore keyStore, IKeyStoreConfig config, ILogManager logManager) { _cryptoRandom = cryptoRandom ?? throw new ArgumentNullException(nameof(cryptoRandom)); _keyStore = keyStore ?? throw new ArgumentNullException(nameof(keyStore)); _config = config ?? throw new ArgumentNullException(nameof(config)); _logger = logManager?.GetClassLogger() ?? throw new ArgumentNullException(nameof(logManager)); }
public AccountUnlocker(IKeyStoreConfig config, IWallet wallet, ILogManager logManager, IPasswordProvider passwordProvider) { _config = config ?? throw new ArgumentNullException(nameof(config)); _wallet = wallet ?? throw new ArgumentNullException(nameof(wallet)); _logger = logManager?.GetClassLogger <AccountUnlocker>() ?? throw new ArgumentNullException(nameof(logManager)); _passwordProvider = passwordProvider ?? throw new ArgumentNullException(nameof(passwordProvider)); }
public void Initialize() { NetworkNodeDecoder.Init(); SetupNodeIds(); var logManager = NullLogManager.Instance; //setting config to store 3 nodes in a bucket and for table to have one bucket//setting config to store 3 nodes in a bucket and for table to have one bucket _configurationProvider = new ConfigProvider(); INetworkConfig networkConfig = _configurationProvider.GetConfig <INetworkConfig>(); networkConfig.PongTimeout = 50; networkConfig.BucketSize = 3; networkConfig.BucketsCount = 1; IKeyStoreConfig keyStoreConfig = _configurationProvider.GetConfig <IKeyStoreConfig>(); IStatsConfig statsConfig = _configurationProvider.GetConfig <IStatsConfig>(); var calculator = new NodeDistanceCalculator(networkConfig); _nodeTable = new NodeTable(new FileKeyStore(keyStoreConfig, new EthereumJsonSerializer(), new AesEncrypter(keyStoreConfig, logManager), new CryptoRandom(), logManager), calculator, networkConfig, logManager); _nodeTable.Initialize(TestItem.PublicKeyA); _timestamp = new Timestamp(); var evictionManager = new EvictionManager(_nodeTable, logManager); var lifecycleFactory = new NodeLifecycleManagerFactory(_nodeTable, new DiscoveryMessageFactory(networkConfig, _timestamp), evictionManager, new NodeStatsManager(statsConfig, logManager), networkConfig, logManager); _udpClient = Substitute.For <IMessageSender>(); _discoveryManager = new DiscoveryManager(lifecycleFactory, _nodeTable, new NetworkStorage("test", networkConfig, logManager, new PerfService(logManager)), networkConfig, logManager); _discoveryManager.MessageSender = _udpClient; }
public async Task Execute(CancellationToken cancellationToken) { // why is the await Task.Run here? await Task.Run(() => { IKeyStoreConfig keyStoreConfig = _context.Config <IKeyStoreConfig>(); INetworkConfig networkConfig = _context.Config <INetworkConfig>(); AesEncrypter encrypter = new AesEncrypter( keyStoreConfig, _context.LogManager); _context.KeyStore = new FileKeyStore( keyStoreConfig, _context.EthereumJsonSerializer, encrypter, _context.CryptoRandom, _context.LogManager); _context.Wallet = _context.Config <IInitConfig>() switch { var config when config.EnableUnsecuredDevWallet&& config.KeepDevWalletInMemory => new DevWallet(_context.Config <IWalletConfig>(), _context.LogManager), var config when config.EnableUnsecuredDevWallet&& !config.KeepDevWalletInMemory => new DevKeyStoreWallet(_context.KeyStore, _context.LogManager), _ => NullWallet.Instance }; INodeKeyManager nodeKeyManager = new NodeKeyManager(_context.CryptoRandom, _context.KeyStore, keyStoreConfig, _context.LogManager); _context.NodeKey = nodeKeyManager.LoadNodeKey(); _context.Enode = new Enode(_context.NodeKey.PublicKey, IPAddress.Parse(networkConfig.ExternalIp), networkConfig.P2PPort); _context.LogManager.SetGlobalVariable("enode", _context.Enode.ToString()); }); }
public AccountUnlocker(IKeyStoreConfig config, IWallet wallet, IFileSystem fileSystem, ILogManager logManager) { _config = config ?? throw new ArgumentNullException(nameof(config)); _wallet = wallet ?? throw new ArgumentNullException(nameof(wallet)); _fileSystem = fileSystem ?? throw new ArgumentNullException(nameof(fileSystem)); _logger = logManager?.GetClassLogger <AccountUnlocker>() ?? throw new ArgumentNullException(nameof(logManager)); }
public static int FindUnlockAccountIndex(this IKeyStoreConfig keyStoreConfig, Address address) { return(Array.IndexOf( (keyStoreConfig.UnlockAccounts ?? Array.Empty <string>()) .Select(a => a.ToUpperInvariant()) .ToArray(), address.ToString().ToUpperInvariant())); }
public FileKeyStore(IKeyStoreConfig keyStoreConfig, IJsonSerializer jsonSerializer, ISymmetricEncrypter symmetricEncrypter, ICryptoRandom cryptoRandom, ILogManager logManager) { _logger = logManager?.GetClassLogger() ?? throw new ArgumentNullException(nameof(logManager)); _config = keyStoreConfig ?? throw new ArgumentNullException(nameof(keyStoreConfig)); _jsonSerializer = jsonSerializer ?? throw new ArgumentNullException(nameof(jsonSerializer)); _symmetricEncrypter = symmetricEncrypter ?? throw new ArgumentNullException(nameof(symmetricEncrypter)); _cryptoRandom = cryptoRandom ?? throw new ArgumentNullException(nameof(cryptoRandom)); _keyStoreEncoding = Encoding.GetEncoding(_config.KeyStoreEncoding); _privateKeyGenerator = new PrivateKeyGenerator(_cryptoRandom); }
public FileKeyStore(IKeyStoreConfig keyStoreConfig, IJsonSerializer jsonSerializer, ISymmetricEncrypter symmetricEncrypter, ICryptoRandom cryptoRandom, ILogManager logManager) { _logger = logManager?.GetClassLogger() ?? throw new ArgumentNullException(nameof(logManager)); _config = keyStoreConfig ?? throw new ArgumentNullException(nameof(keyStoreConfig)); _jsonSerializer = jsonSerializer ?? throw new ArgumentNullException(nameof(jsonSerializer)); _symmetricEncrypter = symmetricEncrypter ?? throw new ArgumentNullException(nameof(symmetricEncrypter)); _cryptoRandom = cryptoRandom ?? throw new ArgumentNullException(nameof(cryptoRandom)); _keyStoreEncoding = _config.KeyStoreEncoding.Equals("UTF-8", StringComparison.InvariantCultureIgnoreCase) ? new UTF8Encoding(false) : Encoding.GetEncoding(_config.KeyStoreEncoding); _privateKeyGenerator = new PrivateKeyGenerator(_cryptoRandom); }
public void Initialize() { var config = new VaultConfig(); _keyStoreConfig = new KeyStoreConfig(); _keyStoreIOSettingsProvider = new VaultKeyStoreIOSettingsProvider(config); ILogManager logger = LimboLogs.Instance; _serializer = new EthereumJsonSerializer(); _cryptoRandom = new CryptoRandom(); _store = new FileKeyStore(_keyStoreConfig, _serializer, new AesEncrypter(_keyStoreConfig, logger), _cryptoRandom, logger, _keyStoreIOSettingsProvider); }
public NodeKeyManager( ICryptoRandom cryptoRandom, IKeyStore keyStore, IKeyStoreConfig config, ILogManager logManager, IPasswordProvider passwordProvider, IFileSystem fileSystem) { _cryptoRandom = cryptoRandom ?? throw new ArgumentNullException(nameof(cryptoRandom)); _keyStore = keyStore ?? throw new ArgumentNullException(nameof(keyStore)); _config = config ?? throw new ArgumentNullException(nameof(config)); _logger = logManager?.GetClassLogger() ?? throw new ArgumentNullException(nameof(logManager)); _passwordProvider = passwordProvider ?? throw new ArgumentNullException(nameof(passwordProvider)); _fileSystem = fileSystem ?? throw new ArgumentNullException(nameof(fileSystem)); }
public void Initialize() { _config = new KeyStoreConfig(); _keyStoreDir = _config.KeyStoreDirectory; if (!Directory.Exists(_keyStoreDir)) { Directory.CreateDirectory(_keyStoreDir); } ILogManager logManager = NullLogManager.Instance; _serializer = new EthereumJsonSerializer(); _cryptoRandom = new CryptoRandom(); _store = new FileKeyStore(_config, _serializer, new AesEncrypter(_config, logManager), _cryptoRandom, logManager); var testsContent = File.ReadAllText("basic_tests.json"); _testsModel = _serializer.Deserialize <KeyStoreTestsModel>(testsContent); }
public async Task Execute(CancellationToken cancellationToken) { var(_get, _set) = _api.ForInit; // why is the await Task.Run here? await Task.Run(() => { IKeyStoreConfig keyStoreConfig = _get.Config <IKeyStoreConfig>(); INetworkConfig networkConfig = _get.Config <INetworkConfig>(); AesEncrypter encrypter = new AesEncrypter( keyStoreConfig, _get.LogManager); var keyStore = _set.KeyStore = new FileKeyStore( keyStoreConfig, _get.EthereumJsonSerializer, encrypter, _get.CryptoRandom, _get.LogManager, new PrivateKeyStoreIOSettingsProvider(keyStoreConfig)); _set.Wallet = _get.Config <IInitConfig>() switch { var config when config.EnableUnsecuredDevWallet&& config.KeepDevWalletInMemory => new DevWallet(_get.Config <IWalletConfig>(), _get.LogManager), var config when config.EnableUnsecuredDevWallet&& !config.KeepDevWalletInMemory => new DevKeyStoreWallet(_get.KeyStore, _get.LogManager), _ => new ProtectedKeyStoreWallet(keyStore, new ProtectedPrivateKeyFactory(_get.CryptoRandom, _get.Timestamper), _get.Timestamper, _get.LogManager), }; new AccountUnlocker(keyStoreConfig, _get.Wallet, _get.LogManager, new KeyStorePasswordProvider(keyStoreConfig)) .UnlockAccounts(); var passwordProvider = new KeyStorePasswordProvider(keyStoreConfig) .OrReadFromConsole($"Provide password for validator account { keyStoreConfig.BlockAuthorAccount}"); INodeKeyManager nodeKeyManager = new NodeKeyManager(_get.CryptoRandom, _get.KeyStore, keyStoreConfig, _get.LogManager, passwordProvider, _get.FileSystem); var nodeKey = _set.NodeKey = nodeKeyManager.LoadNodeKey(); _set.OriginalSignerKey = nodeKeyManager.LoadSignerKey(); var enode = _set.Enode = new Enode(nodeKey.PublicKey, IPAddress.Parse(networkConfig.ExternalIp), networkConfig.P2PPort); _get.LogManager.SetGlobalVariable("enode", enode.ToString()); }, cancellationToken); }
public void Initialize() { _keyStoreConfig = new KeyStoreConfig(); _testPasswordSecured = new SecureString(); _wrongPasswordSecured = new SecureString(); for (int i = 0; i < _testPassword.Length; i++) { _testPasswordSecured.AppendChar(_testPassword[i]); _wrongPasswordSecured.AppendChar('*'); } _testPasswordSecured.MakeReadOnly(); _wrongPasswordSecured.MakeReadOnly(); ILogManager logger = LimboLogs.Instance; _serializer = new EthereumJsonSerializer(); _cryptoRandom = new CryptoRandom(); _store = new FileKeyStore(_keyStoreConfig, _serializer, new AesEncrypter(_keyStoreConfig, logger), _cryptoRandom, logger); }
public async Task Execute(CancellationToken cancellationToken) { // why is the await Task.Run here? await Task.Run(() => { IKeyStoreConfig keyStoreConfig = _context.Config <IKeyStoreConfig>(); INetworkConfig networkConfig = _context.Config <INetworkConfig>(); AesEncrypter encrypter = new AesEncrypter( keyStoreConfig, _context.LogManager); _context.KeyStore = new FileKeyStore( keyStoreConfig, _context.EthereumJsonSerializer, encrypter, _context.CryptoRandom, _context.LogManager); _context.Wallet = _context.Config <IInitConfig>() switch { var config when config.EnableUnsecuredDevWallet&& config.KeepDevWalletInMemory => new DevWallet(_context.Config <IWalletConfig>(), _context.LogManager), var config when config.EnableUnsecuredDevWallet&& !config.KeepDevWalletInMemory => new DevKeyStoreWallet(_context.KeyStore, _context.LogManager), _ => new ProtectedKeyStoreWallet(_context.KeyStore, new ProtectedPrivateKeyFactory(_context.CryptoRandom, _context.Timestamper), _context.Timestamper, _context.LogManager), }; new AccountUnlocker(keyStoreConfig, _context.Wallet, new FileSystem(), _context.LogManager).UnlockAccounts(); INodeKeyManager nodeKeyManager = new NodeKeyManager(_context.CryptoRandom, _context.KeyStore, keyStoreConfig, _context.LogManager); _context.NodeKey = nodeKeyManager.LoadNodeKey(); _context.OriginalSignerKey = nodeKeyManager.LoadSignerKey(); _context.Enode = new Enode(_context.NodeKey.PublicKey, IPAddress.Parse(networkConfig.ExternalIp), networkConfig.P2PPort); _context.LogManager.SetGlobalVariable("enode", _context.Enode.ToString()); }, cancellationToken); }
private static void SetFinalDataDirectory(string?dataDir, IInitConfig initConfig, IKeyStoreConfig keyStoreConfig) { if (!string.IsNullOrWhiteSpace(dataDir)) { string newDbPath = initConfig.BaseDbPath.GetApplicationResourcePath(dataDir); string newKeyStorePath = keyStoreConfig.KeyStoreDirectory.GetApplicationResourcePath(dataDir); string newLogDirectory = initConfig.LogDirectory.GetApplicationResourcePath(dataDir); if (_logger.IsInfo) { _logger.Info($"Setting BaseDbPath to: {newDbPath}, from: {initConfig.BaseDbPath}"); _logger.Info($"Setting KeyStoreDirectory to: {newKeyStorePath}, from: {keyStoreConfig.KeyStoreDirectory}"); _logger.Info($"Setting LogDirectory to: {newLogDirectory}, from: {initConfig.LogDirectory}"); } initConfig.BaseDbPath = newDbPath; keyStoreConfig.KeyStoreDirectory = newKeyStorePath; initConfig.LogDirectory = newLogDirectory; } else { initConfig.BaseDbPath ??= "".GetApplicationResourcePath("db"); keyStoreConfig.KeyStoreDirectory ??= "".GetApplicationResourcePath("keystore"); initConfig.LogDirectory ??= "".GetApplicationResourcePath("logs"); } }
public PrivateKeyStoreIOSettingsProvider( IKeyStoreConfig keyStoreConfig) { _config = keyStoreConfig ?? throw new ArgumentNullException(nameof(keyStoreConfig)); }
public AesEncrypter(IKeyStoreConfig keyStoreConfig, ILogManager logManager) { _config = keyStoreConfig ?? throw new ArgumentNullException(nameof(keyStoreConfig)); _logger = logManager?.GetClassLogger() ?? throw new ArgumentNullException(nameof(logManager)); }
public KeyStorePasswordProvider(IKeyStoreConfig keyStoreConfig) { _keyStoreConfig = keyStoreConfig ?? throw new ArgumentNullException(nameof(keyStoreConfig)); _filePasswordProvider = new FilePasswordProvider(Map); }
private static void Run(string[] args) { _logger.Info("Nethermind starting initialization."); AppDomain.CurrentDomain.ProcessExit += CurrentDomainOnProcessExit; IFileSystem fileSystem = new FileSystem();; PluginLoader pluginLoader = new PluginLoader( "plugins", fileSystem, typeof(CliquePlugin), typeof(EthashPlugin), typeof(NethDevPlugin)); pluginLoader.Load(SimpleConsoleLogManager.Instance); Type configurationType = typeof(IConfig); IEnumerable <Type> configTypes = new TypeDiscovery().FindNethermindTypes(configurationType) .Where(ct => ct.IsInterface); CommandLineApplication app = new CommandLineApplication { Name = "Nethermind.Runner" }; app.HelpOption("-?|-h|--help"); app.VersionOption("-v|--version", () => ClientVersion.Version, () => ClientVersion.Description); GlobalDiagnosticsContext.Set("version", ClientVersion.Version); CommandOption dataDir = app.Option("-dd|--datadir <dataDir>", "data directory", CommandOptionType.SingleValue); CommandOption configFile = app.Option("-c|--config <configFile>", "config file path", CommandOptionType.SingleValue); CommandOption dbBasePath = app.Option("-d|--baseDbPath <baseDbPath>", "base db path", CommandOptionType.SingleValue); CommandOption logLevelOverride = app.Option("-l|--log <logLevel>", "log level", CommandOptionType.SingleValue); CommandOption configsDirectory = app.Option("-cd|--configsDirectory <configsDirectory>", "configs directory", CommandOptionType.SingleValue); CommandOption loggerConfigSource = app.Option("-lcs|--loggerConfigSource <loggerConfigSource>", "path to the NLog config file", CommandOptionType.SingleValue); foreach (Type configType in configTypes.OrderBy(c => c.Name)) { if (configType == null) { continue; } ConfigCategoryAttribute?typeLevel = configType.GetCustomAttribute <ConfigCategoryAttribute>(); if (typeLevel?.HiddenFromDocs ?? false) { continue; } foreach (PropertyInfo propertyInfo in configType .GetProperties(BindingFlags.Public | BindingFlags.Instance) .OrderBy(p => p.Name)) { ConfigItemAttribute?configItemAttribute = propertyInfo.GetCustomAttribute <ConfigItemAttribute>(); if (!(configItemAttribute?.HiddenFromDocs ?? false)) { app.Option($"--{configType.Name.Substring(1).Replace("Config", String.Empty)}.{propertyInfo.Name}", $"{(configItemAttribute == null ? "<missing documentation>" : configItemAttribute.Description + $" (DEFAULT: {configItemAttribute.DefaultValue})" ?? "<missing documentation>")}", CommandOptionType.SingleValue); } } } ManualResetEventSlim appClosed = new ManualResetEventSlim(true); app.OnExecute(async() => { appClosed.Reset(); IConfigProvider configProvider = BuildConfigProvider(app, loggerConfigSource, logLevelOverride, configsDirectory, configFile); IInitConfig initConfig = configProvider.GetConfig <IInitConfig>(); IKeyStoreConfig keyStoreConfig = configProvider.GetConfig <IKeyStoreConfig>(); Console.Title = initConfig.LogFileName; Console.CancelKeyPress += ConsoleOnCancelKeyPress; SetFinalDataDirectory(dataDir.HasValue() ? dataDir.Value() : null, initConfig, keyStoreConfig); NLogManager logManager = new(initConfig.LogFileName, initConfig.LogDirectory); _logger = logManager.GetClassLogger(); if (_logger.IsDebug) { _logger.Debug($"Nethermind version: {ClientVersion.Description}"); } ConfigureSeqLogger(configProvider); SetFinalDbPath(dbBasePath.HasValue() ? dbBasePath.Value() : null, initConfig); LogMemoryConfiguration(); EthereumJsonSerializer serializer = new(); if (_logger.IsDebug) { _logger.Debug($"Nethermind config:{Environment.NewLine}{serializer.Serialize(initConfig, true)}{Environment.NewLine}"); } ApiBuilder apiBuilder = new(configProvider, logManager); INethermindApi nethermindApi = apiBuilder.Create(); foreach (Type pluginType in pluginLoader.PluginTypes) { if (Activator.CreateInstance(pluginType) is INethermindPlugin plugin) { nethermindApi.Plugins.Add(plugin); } } EthereumRunner ethereumRunner = new EthereumRunner(nethermindApi); await ethereumRunner.Start(_processCloseCancellationSource.Token).ContinueWith(x => { if (x.IsFaulted && _logger.IsError) { _logger.Error("Error during ethereum runner start", x.Exception); } }); await Task.WhenAny(_cancelKeySource.Task, _processExit.Task); _logger.Info("Closing, please wait until all functions are stopped properly..."); await ethereumRunner.StopAsync(); _logger.Info("All done, goodbye!"); appClosed.Set(); return(0); }); app.Execute(args); appClosed.Wait(); }