/// <summary> /// Enable console command line. /// </summary> public static void EnableConsoleCommandLine() { ThreadConsoleCommandLine = new Thread(async delegate() { while (!Program.Exit) { string commandLine = Console.ReadLine(); if (Program.Exit) { break; } try { var splitCommandLine = commandLine.Split(new char[0], StringSplitOptions.None); switch (splitCommandLine[0]) { case ClassConsoleCommandLineEnumeration.CommandLineHelp: ClassConsole.ConsoleWriteLine(ClassConsoleCommandLineEnumeration.CommandLineHelp + " -> show list of command lines.", ClassConsoleColorEnumeration.IndexConsoleMagentaLog, Program.LogLevel); ClassConsole.ConsoleWriteLine(ClassConsoleCommandLineEnumeration.CommandLineCreateWallet + " -> permit to create a new wallet manualy.", ClassConsoleColorEnumeration.IndexConsoleMagentaLog, Program.LogLevel); ClassConsole.ConsoleWriteLine(ClassConsoleCommandLineEnumeration.CommandLineRestoreWallet + " -> permit to restore a wallet manualy. Syntax: " + ClassConsoleCommandLineEnumeration.CommandLineRestoreWallet + " wallet_address", ClassConsoleColorEnumeration.IndexConsoleMagentaLog, Program.LogLevel); ClassConsole.ConsoleWriteLine(ClassConsoleCommandLineEnumeration.CommandLineSaveWallet + " -> permit to save manually the database of wallets.", ClassConsoleColorEnumeration.IndexConsoleMagentaLog, Program.LogLevel); ClassConsole.ConsoleWriteLine(ClassConsoleCommandLineEnumeration.CommandLineLogLevel + " -> change log level. Max log level: " + ClassConsole.MaxLogLevel, ClassConsoleColorEnumeration.IndexConsoleMagentaLog, Program.LogLevel); break; case ClassConsoleCommandLineEnumeration.CommandLineCreateWallet: using (var walletCreatorObject = new ClassWalletCreator()) { new Thread(async delegate() { if (!await walletCreatorObject.StartWalletConnectionAsync(ClassWalletPhase.Create, ClassUtility.MakeRandomWalletPassword())) { ClassConsole.ConsoleWriteLine("RPC Wallet cannot create a new wallet.", ClassConsoleColorEnumeration.IndexConsoleRedLog, Program.LogLevel); } }).Start(); while (walletCreatorObject.WalletCreateResult == ClassWalletCreatorEnumeration.WalletCreatorPending) { Thread.Sleep(100); } switch (walletCreatorObject.WalletCreateResult) { case ClassWalletCreatorEnumeration.WalletCreatorError: ClassConsole.ConsoleWriteLine("RPC Wallet cannot create a new wallet.", ClassConsoleColorEnumeration.IndexConsoleRedLog, Program.LogLevel); break; case ClassWalletCreatorEnumeration.WalletCreatorSuccess: ClassConsole.ConsoleWriteLine("RPC Wallet successfully create a new wallet.", ClassConsoleColorEnumeration.IndexConsoleGreenLog, Program.LogLevel); ClassConsole.ConsoleWriteLine("New wallet address generated: " + walletCreatorObject.WalletAddressResult, ClassConsoleColorEnumeration.IndexConsoleBlueLog, Program.LogLevel); break; } } break; case ClassConsoleCommandLineEnumeration.CommandLineRestoreWallet: if (splitCommandLine.Length < 2) { ClassConsole.ConsoleWriteLine("Please, put the wallet address to restore.", ClassConsoleColorEnumeration.IndexConsoleRedLog, Program.LogLevel); } else { if (ClassRpcDatabase.RpcDatabaseContent.ContainsKey(splitCommandLine[1])) { using (var walletCreatorObject = new ClassWalletCreator()) { new Thread(async delegate() { if (!await walletCreatorObject.StartWalletConnectionAsync(ClassWalletPhase.Restore, ClassUtility.MakeRandomWalletPassword(), ClassRpcDatabase.RpcDatabaseContent[splitCommandLine[1]].GetWalletPrivateKey(), splitCommandLine[1])) { ClassConsole.ConsoleWriteLine("RPC Wallet cannot restore your wallet: " + splitCommandLine[1], ClassConsoleColorEnumeration.IndexConsoleRedLog, Program.LogLevel); } }).Start(); while (walletCreatorObject.WalletCreateResult == ClassWalletCreatorEnumeration.WalletCreatorPending) { Thread.Sleep(100); } switch (walletCreatorObject.WalletCreateResult) { case ClassWalletCreatorEnumeration.WalletCreatorError: ClassConsole.ConsoleWriteLine("RPC Wallet cannot restore a wallet: " + splitCommandLine[1], ClassConsoleColorEnumeration.IndexConsoleRedLog, Program.LogLevel); break; case ClassWalletCreatorEnumeration.WalletCreatorSuccess: ClassConsole.ConsoleWriteLine("RPC Wallet successfully restore wallet: " + splitCommandLine[1], ClassConsoleColorEnumeration.IndexConsoleGreenLog, Program.LogLevel); ClassConsole.ConsoleWriteLine("RPC Wallet execute save the database of wallets..", ClassConsoleColorEnumeration.IndexConsoleYellowLog, Program.LogLevel); if (await ClassRpcDatabase.SaveWholeRpcWalletDatabaseFile()) { ClassConsole.ConsoleWriteLine("RPC Wallet save of the database of wallets done successfully.", ClassConsoleColorEnumeration.IndexConsoleGreenLog, Program.LogLevel); } else { ClassConsole.ConsoleWriteLine("RPC Wallet save of the database of wallets failed, please retry by command line: " + ClassConsoleCommandLineEnumeration.CommandLineSaveWallet, ClassConsoleColorEnumeration.IndexConsoleGreenLog, Program.LogLevel); } break; } } } else { ClassConsole.ConsoleWriteLine("Please, put a valid wallet address stored on the database of your rpc wallet to restore. " + splitCommandLine[1] + " not exist.", ClassConsoleColorEnumeration.IndexConsoleRedLog, Program.LogLevel); } } break; case ClassConsoleCommandLineEnumeration.CommandLineSaveWallet: if (await ClassRpcDatabase.SaveWholeRpcWalletDatabaseFile()) { ClassConsole.ConsoleWriteLine("RPC Wallet save of the database of wallets done successfully.", ClassConsoleColorEnumeration.IndexConsoleGreenLog, Program.LogLevel); } else { ClassConsole.ConsoleWriteLine("RPC Wallet save of the database of wallets failed, please retry by command line: " + ClassConsoleCommandLineEnumeration.CommandLineSaveWallet, ClassConsoleColorEnumeration.IndexConsoleGreenLog, Program.LogLevel); } break; case ClassConsoleCommandLineEnumeration.CommandLineLogLevel: if (splitCommandLine.Length > 1) { if (int.TryParse(splitCommandLine[1], out var logLevel)) { if (logLevel < 0) { logLevel = 0; } else { if (logLevel > ClassConsole.MaxLogLevel) { logLevel = ClassConsole.MaxLogLevel; } } ClassConsole.ConsoleWriteLine("New log level " + Program.LogLevel + " -> " + logLevel, ClassConsoleColorEnumeration.IndexConsoleMagentaLog, Program.LogLevel); Program.LogLevel = logLevel; } } else { ClassConsole.ConsoleWriteLine("Please select a log level.", ClassConsoleColorEnumeration.IndexConsoleRedLog, Program.LogLevel); } break; case ClassConsoleCommandLineEnumeration.CommandLineExit: Program.Exit = true; ClassConsole.ConsoleWriteLine("Closing RPC Wallet..", ClassConsoleColorEnumeration.IndexConsoleRedLog, Program.LogLevel); ClassApi.StopApiHttpServer(); if (ClassRpcSetting.RpcWalletEnableRemoteNodeSync) { ClassWalletUpdater.DisableAutoUpdateWallet(); } ClassRemoteSync.StopRpcWalletToSync(); if (Program.ThreadRemoteNodeSync != null && (Program.ThreadRemoteNodeSync.IsAlive || Program.ThreadRemoteNodeSync != null)) { Program.ThreadRemoteNodeSync.Abort(); GC.SuppressFinalize(Program.ThreadRemoteNodeSync); } ClassConsole.ConsoleWriteLine("Waiting end of save RPC Wallet Database..", ClassConsoleColorEnumeration.IndexConsoleYellowLog, Program.LogLevel); while (ClassRpcDatabase.InSave) { Thread.Sleep(100); } ClassConsole.ConsoleWriteLine("Waiting end of save RPC Wallet Sync Database..", ClassConsoleColorEnumeration.IndexConsoleYellowLog, Program.LogLevel); while (ClassSyncDatabase.InSave) { Thread.Sleep(100); } ClassLog.StopLogSystem(); ClassConsole.ConsoleWriteLine("RPC Wallet is successfully stopped, press ENTER to exit.", ClassConsoleColorEnumeration.IndexConsoleBlueLog, Program.LogLevel); Console.ReadLine(); Process.GetCurrentProcess().Kill(); break; } if (Program.Exit) { break; } } catch (Exception error) { ClassConsole.ConsoleWriteLine("Error command line exception: " + error.Message, ClassConsoleColorEnumeration.IndexConsoleRedLog, Program.LogLevel); ClassConsole.ConsoleWriteLine("For get help use command line " + ClassConsoleCommandLineEnumeration.CommandLineHelp, ClassConsoleColorEnumeration.IndexConsoleRedLog, Program.LogLevel); } } }); ThreadConsoleCommandLine.Start(); }
/// <summary> /// Handle packet wallet received from the blockchain network. /// </summary> /// <param name="packet"></param> private void HandlePacketBlockchainNetworkWallet(string packet) { var splitPacket = packet.Split(new[] { "|" }, StringSplitOptions.None); switch (splitPacket[0]) { case ClassWalletCommand.ClassWalletReceiveEnumeration.WaitingCreatePhase: //ClassConsole.ConsoleWriteLine("Please wait a moment, your wallet pending creation..", ClassConsoleEnumeration.IndexConsoleYellowLog); break; case ClassWalletCommand.ClassWalletReceiveEnumeration.WalletCreatePasswordNeedLetters: case ClassWalletCommand.ClassWalletReceiveEnumeration.WalletCreatePasswordNeedMoreCharacters: WalletCreateResult = ClassWalletCreatorEnumeration.WalletCreatorError; FullDisconnection(); break; case ClassWalletCommand.ClassWalletReceiveEnumeration.CreatePhase: if (splitPacket[1] == ClassAlgoErrorEnumeration.AlgoError) { WalletCreateResult = ClassWalletCreatorEnumeration.WalletCreatorError; FullDisconnection(); } else { var decryptWalletDataCreate = ClassAlgo.GetDecryptedResultManual(ClassAlgoEnumeration.Rijndael, splitPacket[1], WalletPassword, ClassWalletNetworkSetting.KeySize); if (decryptWalletDataCreate == ClassAlgoErrorEnumeration.AlgoError) { WalletCreateResult = ClassWalletCreatorEnumeration.WalletCreatorError; FullDisconnection(); } else { string walletDataCreate = ClassUtils.DecompressData(decryptWalletDataCreate); var splitDecryptWalletDataCreate = walletDataCreate.Split(new[] { "\n" }, StringSplitOptions.None); var pinWallet = splitPacket[2]; var walletAddress = splitDecryptWalletDataCreate[0]; var publicKey = splitDecryptWalletDataCreate[2]; var privateKey = splitDecryptWalletDataCreate[3]; WalletAddressResult = walletAddress; ClassRpcDatabase.InsertNewWalletAsync(walletAddress, publicKey, privateKey, pinWallet, WalletPassword); WalletCreateResult = ClassWalletCreatorEnumeration.WalletCreatorSuccess; FullDisconnection(); } } break; case ClassWalletCommand.ClassWalletReceiveEnumeration.WalletAskSuccess: string walletDataCreation = splitPacket[1]; if (walletDataCreation == ClassAlgoErrorEnumeration.AlgoError) { ClassConsole.ConsoleWriteLine("Restoring wallet failed, please try again later.", ClassConsoleColorEnumeration.IndexConsoleRedLog); WalletCreateResult = ClassWalletCreatorEnumeration.WalletCreatorError; FullDisconnection(); } else { var decryptWalletDataCreation = ClassAlgo.GetDecryptedResultManual(ClassAlgoEnumeration.Rijndael, walletDataCreation, WalletPrivateKey, ClassWalletNetworkSetting.KeySize); if (decryptWalletDataCreation == ClassAlgoErrorEnumeration.AlgoError) { ClassConsole.ConsoleWriteLine("Restoring wallet failed, please try again later.", ClassConsoleColorEnumeration.IndexConsoleRedLog); WalletCreateResult = ClassWalletCreatorEnumeration.WalletCreatorError; FullDisconnection(); } else { var splitWalletData = decryptWalletDataCreation.Split(new[] { "\n" }, StringSplitOptions.None); var publicKey = splitWalletData[2]; var privateKey = splitWalletData[3]; var pinCode = splitWalletData[4]; if (ClassRpcDatabase.RpcDatabaseContent.ContainsKey(WalletAddress)) { ClassRpcDatabase.RpcDatabaseContent[WalletAddress].SetWalletAddress(WalletAddress); ClassRpcDatabase.RpcDatabaseContent[WalletAddress].SetWalletPublicKey(publicKey); ClassRpcDatabase.RpcDatabaseContent[WalletAddress].SetWalletPrivateKey(privateKey); ClassRpcDatabase.RpcDatabaseContent[WalletAddress].SetWalletPinCode(pinCode); WalletCreateResult = ClassWalletCreatorEnumeration.WalletCreatorSuccess; FullDisconnection(); } else { ClassConsole.ConsoleWriteLine("Restoring wallet failed, wallet address: " + WalletAddress + " not exist inside database, please try again later.", ClassConsoleColorEnumeration.IndexConsoleRedLog); WalletCreateResult = ClassWalletCreatorEnumeration.WalletCreatorError; FullDisconnection(); } } } break; } }
static void Main(string[] args) { EnableCatchUnexpectedException(); Console.CancelKeyPress += Console_CancelKeyPress; Thread.CurrentThread.Name = Path.GetFileName(Environment.GetCommandLineArgs()[0]); GlobalCultureInfo = new CultureInfo("fr-FR"); ClassLog.LogInitialization(); ServicePointManager.DefaultConnectionLimit = 65535; ClassConsole.ConsoleWriteLine(ClassConnectorSetting.CoinName + " RPC Wallet - " + Assembly.GetExecutingAssembly().GetName().Version + "R", ClassConsoleColorEnumeration.IndexConsoleBlueLog, LogLevel); if (ClassRpcSetting.InitializeRpcWalletSetting()) { ClassConsole.ConsoleWriteLine("Please write your rpc wallet password for decrypt your databases of wallet (Input keys are hidden): ", ClassConsoleColorEnumeration.IndexConsoleYellowLog, LogLevel); ClassRpcDatabase.SetRpcDatabasePassword(ClassUtility.GetHiddenConsoleInput()); ClassConsole.ConsoleWriteLine("RPC Wallet Database loading..", ClassConsoleColorEnumeration.IndexConsoleYellowLog, LogLevel); if (ClassRpcDatabase.LoadRpcDatabaseFile()) { ClassConsole.ConsoleWriteLine("RPC Wallet Database successfully loaded.", ClassConsoleColorEnumeration.IndexConsoleGreenLog, LogLevel); ClassConsole.ConsoleWriteLine("RPC Sync Database loading..", ClassConsoleColorEnumeration.IndexConsoleYellowLog, LogLevel); if (ClassSyncDatabase.InitializeSyncDatabase()) { ClassConsole.ConsoleWriteLine("RPC Sync Database successfully loaded.", ClassConsoleColorEnumeration.IndexConsoleGreenLog, LogLevel); if (ClassRpcSetting.WalletEnableAutoUpdateWallet) { ClassConsole.ConsoleWriteLine("Enable Auto Update Wallet System..", ClassConsoleColorEnumeration.IndexConsoleYellowLog, LogLevel); ClassWalletUpdater.EnableAutoUpdateWallet(); ClassConsole.ConsoleWriteLine("Enable Auto Update Wallet System done.", ClassConsoleColorEnumeration.IndexConsoleGreenLog, LogLevel); } ClassConsole.ConsoleWriteLine("Start RPC Wallet API Server..", ClassConsoleColorEnumeration.IndexConsoleYellowLog, LogLevel); ClassApi.StartApiHttpServer(); ClassConsole.ConsoleWriteLine("Start RPC Wallet API Server sucessfully started.", ClassConsoleColorEnumeration.IndexConsoleGreenLog, LogLevel); if (ClassRpcSetting.RpcWalletEnableRemoteNodeSync && ClassRpcSetting.RpcWalletRemoteNodeHost != string.Empty && ClassRpcSetting.RpcWalletRemoteNodePort != 0) { ClassConsole.ConsoleWriteLine("RPC Remote Node Sync system loading..", ClassConsoleColorEnumeration.IndexConsoleYellowLog, LogLevel); ThreadRemoteNodeSync = new Thread(async() => await ClassRemoteSync.ConnectRpcWalletToRemoteNodeSyncAsync()); ThreadRemoteNodeSync.Start(); } ClassConsole.ConsoleWriteLine("Enable Command Line system.", ClassConsoleColorEnumeration.IndexConsoleGreenLog, LogLevel); ClassConsoleCommandLine.EnableConsoleCommandLine(); } else { ClassConsole.ConsoleWriteLine("Cannot read RPC Sync Database, the database is maybe corrupted.", ClassConsoleColorEnumeration.IndexConsoleRedLog, LogLevel); Console.WriteLine("Press ENTER to exit."); Console.ReadLine(); Environment.Exit(0); } } else { ClassConsole.ConsoleWriteLine("Cannot read RPC Wallet Database, the database is maybe corrupted.", ClassConsoleColorEnumeration.IndexConsoleRedLog, LogLevel); Console.WriteLine("Press ENTER to exit."); Console.ReadLine(); Environment.Exit(0); } } else { ClassConsole.ConsoleWriteLine("Cannot read RPC Wallet setting, the setting is maybe corrupted, you can delete your setting file to build another one.", ClassConsoleColorEnumeration.IndexConsoleRedLog, LogLevel); Console.WriteLine("Press ENTER to exit."); Console.ReadLine(); Environment.Exit(0); } }