示例#1
0
        /// <summary>
        /// Save each transaction into cache
        /// </summary>
        /// <param name="walletAddress"></param>
        public static void SaveWalletCache(string walletAddress, string transaction)
        {
            if (!string.IsNullOrEmpty(walletAddress))
            {
                walletAddress += "ANONYMITY";
                if (ListTransaction.Count > 0 && _inClearCache == false)
                {
                    if (Directory.Exists(ClassUtility.ConvertPath(System.AppDomain.CurrentDomain.BaseDirectory + WalletTransactionCacheDirectory)) == false)
                    {
                        Directory.CreateDirectory(ClassUtility.ConvertPath(System.AppDomain.CurrentDomain.BaseDirectory + WalletTransactionCacheDirectory));
                    }

                    if (Directory.Exists(ClassUtility.ConvertPath(System.AppDomain.CurrentDomain.BaseDirectory + WalletTransactionCacheDirectory +
                                                                  walletAddress)) == false)
                    {
                        Directory.CreateDirectory(ClassUtility.ConvertPath(System.AppDomain.CurrentDomain.BaseDirectory + WalletTransactionCacheDirectory +
                                                                           walletAddress));
                    }


                    if (!File.Exists(ClassUtility.ConvertPath(System.AppDomain.CurrentDomain.BaseDirectory + WalletTransactionCacheDirectory +
                                                              walletAddress +
                                                              "\\" + WalletTransactionCacheFileExtension)))
                    {
                        File.Create(ClassUtility.ConvertPath(System.AppDomain.CurrentDomain.BaseDirectory + WalletTransactionCacheDirectory + walletAddress + "\\" + WalletTransactionCacheFileExtension)).Close();
                    }
                    try
                    {
                        using (var transactionFile = new StreamWriter(ClassUtility.ConvertPath(
                                                                          System.AppDomain.CurrentDomain.BaseDirectory + WalletTransactionCacheDirectory +
                                                                          walletAddress +
                                                                          "\\" + WalletTransactionCacheFileExtension), true))
                        {
                            transactionFile.WriteLine(transaction);
                        }
                    }
                    catch
                    {
                        // ignored
                    }
                }
            }
        }
示例#2
0
        private static async ValueTask <IReadOnlyList <Class> > CreateClasses(GameServiceClient client)
        {
            ConsoleUtility.WriteLine("Creating classes");
            var classes = new[]
            {
                new Class {
                    Name = "Covert", ImagePath = "https://ajpzgq.dm.files.1drv.com/y4mXvnkneQVHhJCM2Thk1pl4Cx5baH-wl7L5-6otZ7lOBj6dmZxjWzitVFLHbvRGTWhoq36lDHHFGBf96betGJQ8J5Mjc5agn37dMu4Mih-dgeYZDTYu-eLudNDy-Ntq-U0ryaGtmFeS6vCo0nxA7_yba_6XhsfqpVq_tsKm7QWGIeeUaD6zFy38QRISl5F-og5aOAE5iRFdmlHfJcJOYQJng?width=70&height=71&cropmode=none"
                },
                new Class {
                    Name = "Strength", ImagePath = "https://nfekpa.dm.files.1drv.com/y4mr6RzK0c1UnrqMTzd2hKAPVazy8uSmlsD_PgJ3TMh4x49A1qmggJEPYzDnXztatHkz-JFdQP6C7E6M-NwJ3cHlu6D8h6Fv-6P2XIlFH1JAqKhPWscJVqO1zVXeyh176wUliaSrVIspBFdsaxVkZQE2synKMSCt-2-yoxZXCKJhU9KP6amVgqOXYE3vWPtOWm74KTHcMwWNXntrzpmsaeqFw?width=73&height=71&cropmode=none"
                },
                new Class {
                    Name = "Tech", ImagePath = "https://z8wx3g.dm.files.1drv.com/y4mktwH5rgCyBejw6Ib8MMp7-eiZMBEC_xnF3jmW8Jdbt-sqPSoDVIyvmWFNGLbGgENZn9I_mdRPBCF7eB5RPy5hFtl5lELNBrqBkgRUjXH1AnHfyCLlV2XTY_QV_KMqN8wc8_RgSIstZSuY291fLIcL8zisH9rDaewt3NknxopBfqbxD908Cn8HXdl8oG1IIYwQkVhfHW03jD7UlZ-wIhAHg?width=58&height=71&cropmode=none"
                },
                new Class {
                    Name = "Ranged", ImagePath = "https://z8wx3g.dm.files.1drv.com/y4mktwH5rgCyBejw6Ib8MMp7-eiZMBEC_xnF3jmW8Jdbt-sqPSoDVIyvmWFNGLbGgENZn9I_mdRPBCF7eB5RPy5hFtl5lELNBrqBkgRUjXH1AnHfyCLlV2XTY_QV_KMqN8wc8_RgSIstZSuY291fLIcL8zisH9rDaewt3NknxopBfqbxD908Cn8HXdl8oG1IIYwQkVhfHW03jD7UlZ-wIhAHg?width=58&height=71&cropmode=none"
                },
                new Class {
                    Name = "Instinct", ImagePath = "https://mdximq.dm.files.1drv.com/y4mT3HV9mjGjRn_aO8yNjtoj_GnsZhZwdXMT6Jt3to6Xsm3TlKphA0iLI6zIjCAm3bBrmubC97eY4HK6p6JL8mZ_XGGk_wZo7gJphFcLNjqyT3TNcRV1rPlu33sEatJIYwWvRL5oAU1rF0RcpMR7G1M7as7VhaFnomuAteXI0ypCDZ3-tG72q-bAnwJu__GeDnc0KVFM03eiT4Yt6GBUq99fg?width=66&height=71&cropmode=none"
                },
            };

            var existingClasses = await ClassUtility.GetClassesAsync(client, null);

            if (existingClasses.Any())
            {
                return(existingClasses);
            }

            var request = new CreateClassesRequest();

            request.Classes.AddRange(classes);
            request.CreateOptions.Add(CreateOptions.ErrorOnDuplicates);

            var reply = await client.CreateClassesAsync(request);

            if (reply.Status.Code != 200)
            {
                ConsoleUtility.WriteLine($"Failed to create classes: '{reply.Status.Message}'");
            }

            return(reply.Classes);
        }
示例#3
0
        /// <summary>
        /// Load block in cache.
        /// </summary>
        /// <returns></returns>
        public static void LoadBlockchainCache()
        {
            if (ListBlock != null)
            {
                ListBlock.Clear();
            }
            else
            {
                ListBlock = new List <string>();
            }

            if (Directory.Exists(ClassUtility.ConvertPath(System.AppDomain.CurrentDomain.BaseDirectory + WalletBlockCacheDirectory + "\\")))
            {
                if (
                    File.Exists(ClassUtility.ConvertPath(System.AppDomain.CurrentDomain.BaseDirectory + WalletBlockCacheDirectory +
                                                         "/blockchain" + WalletBlockCacheFileExtension)))
                {
                    int counter = 0;
                    using (FileStream fs = File.Open(ClassUtility.ConvertPath(System.AppDomain.CurrentDomain.BaseDirectory + WalletBlockCacheDirectory +
                                                                              "/blockchain" + WalletBlockCacheFileExtension), FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
                        using (BufferedStream bs = new BufferedStream(fs))
                            using (StreamReader sr = new StreamReader(bs))
                            {
                                string line;
                                while ((line = sr.ReadLine()) != null)
                                {
                                    ListBlock.Add(line);
                                    counter++;
                                }
                            }
                }
            }
            else
            {
                if (Directory.Exists(ClassUtility.ConvertPath(System.AppDomain.CurrentDomain.BaseDirectory + WalletBlockCacheDirectory)) == false)
                {
                    Directory.CreateDirectory(ClassUtility.ConvertPath(System.AppDomain.CurrentDomain.BaseDirectory + WalletBlockCacheDirectory));
                }

                Directory.CreateDirectory(ClassUtility.ConvertPath(System.AppDomain.CurrentDomain.BaseDirectory + WalletBlockCacheDirectory));
            }
        }
        /// <summary>
        ///     Save peer list.
        /// </summary>
        public static void SavePeerList()
        {
            try
            {
                File.Create(AppDomain.CurrentDomain.BaseDirectory + PeerFileName).Close();

                using (var writer =
                           new StreamWriter(ClassUtility.ConvertPath(AppDomain.CurrentDomain.BaseDirectory + PeerFileName)))
                {
                    foreach (var peer in PeerList.ToArray())
                    {
                        var peerData = JsonConvert.SerializeObject(peer.Value);
                        writer.WriteLine(peerData);
                    }
                }
            }
            catch
            {
            }
        }
示例#5
0
        /// <summary>
        ///     Remove by contact name, because they should are unique.
        /// </summary>
        /// <param name="name"></param>
        public static void RemoveContact(string name)
        {
            if (ListContactWallet.ContainsKey(name.ToLower()))
            {
                ListContactWallet.Remove(name.ToLower());
            }

            File.Create(ClassUtility.ConvertPath(AppDomain.CurrentDomain.BaseDirectory + ContactFileName))
            .Close();     // Create and close the file for don't make in busy permissions.

            foreach (var contact in ListContactWallet)
            {
                using (var writerContact =
                           new StreamWriter(ClassUtility.ConvertPath(AppDomain.CurrentDomain.BaseDirectory + ContactFileName),
                                            true))
                {
                    writerContact.WriteLine(contact.Value.Item1 + "|" + contact.Value.Item2);
                }
            }
        }
示例#6
0
        /// <summary>
        /// Clear each block into cache.
        /// </summary>
        public static bool RemoveWalletBlockCache()
        {
            try
            {
                if (Directory.Exists(ClassUtility.ConvertPath(System.AppDomain.CurrentDomain.BaseDirectory + WalletBlockCacheDirectory + "\\")))
                {
                    File.Delete(ClassUtility.ConvertPath(System.AppDomain.CurrentDomain.BaseDirectory + WalletBlockCacheDirectory +
                                                         "/blockchain." + WalletBlockCacheFileExtension));
                    Directory.Delete(ClassUtility.ConvertPath(System.AppDomain.CurrentDomain.BaseDirectory + WalletBlockCacheDirectory + "\\"), true);
                    Directory.CreateDirectory(ClassUtility.ConvertPath(System.AppDomain.CurrentDomain.BaseDirectory + WalletBlockCacheDirectory));
                }
            }
            catch
            {
                //
            }

            ListBlock.Clear();
            return(true);
        }
示例#7
0
        /// <summary>
        /// Save each block into cache
        /// </summary>
        /// <param name="block"></param>
        public static async Task SaveWalletBlockCache(string block)
        {
            if (Directory.Exists(ClassUtility.ConvertPath(System.AppDomain.CurrentDomain.BaseDirectory + WalletBlockCacheDirectory)) == false)
            {
                Directory.CreateDirectory(ClassUtility.ConvertPath(System.AppDomain.CurrentDomain.BaseDirectory + WalletBlockCacheDirectory));
            }
            if (File.Exists(ClassUtility.ConvertPath(System.AppDomain.CurrentDomain.BaseDirectory + WalletBlockCacheDirectory +
                                                     "/blockchain" + WalletBlockCacheFileExtension)) == false)
            {
                try
                {
                    File.Create(ClassUtility.ConvertPath(System.AppDomain.CurrentDomain.BaseDirectory + WalletBlockCacheDirectory +
                                                         "/blockchain" + WalletBlockCacheFileExtension)).Close();

                    using (var transactionFile = new StreamWriter(ClassUtility.ConvertPath(System.AppDomain.CurrentDomain.BaseDirectory + WalletBlockCacheDirectory +
                                                                                           "/blockchain" + WalletBlockCacheFileExtension), true))
                    {
                        await transactionFile.WriteAsync(block + "\n").ConfigureAwait(false);
                    }
                }
                catch
                {
                    // ignored
                }
            }
            else
            {
                try
                {
                    using (var transactionFile = new StreamWriter(ClassUtility.ConvertPath(System.AppDomain.CurrentDomain.BaseDirectory + WalletBlockCacheDirectory +
                                                                                           "/blockchain" + WalletBlockCacheFileExtension), true))
                    {
                        await transactionFile.WriteAsync(block + "\n").ConfigureAwait(false);
                    }
                }
                catch
                {
                    //
                }
            }
        }
示例#8
0
        /// <summary>
        /// Create the log directory and log files if they not exist.
        /// </summary>
        private static bool LogInitializationFile()
        {
            if (Directory.Exists(ClassUtility.ConvertPath(AppDomain.CurrentDomain.BaseDirectory + LogDirectory)) == false)
            {
                Directory.CreateDirectory(ClassUtility.ConvertPath(AppDomain.CurrentDomain.BaseDirectory + LogDirectory));
                return(false);
            }

            if (!File.Exists(ClassUtility.ConvertPath(AppDomain.CurrentDomain.BaseDirectory + LogGeneral)))
            {
                File.Create(ClassUtility.ConvertPath(AppDomain.CurrentDomain.BaseDirectory + LogGeneral)).Close();
                return(false);
            }

            if (!File.Exists(ClassUtility.ConvertPath(AppDomain.CurrentDomain.BaseDirectory + LogWalletUpdater)))
            {
                File.Create(ClassUtility.ConvertPath(AppDomain.CurrentDomain.BaseDirectory + LogWalletUpdater)).Close();
                return(false);
            }

            if (!File.Exists(ClassUtility.ConvertPath(AppDomain.CurrentDomain.BaseDirectory + LogApi)))
            {
                File.Create(ClassUtility.ConvertPath(AppDomain.CurrentDomain.BaseDirectory + LogApi)).Close();
                return(false);
            }

            if (!File.Exists(ClassUtility.ConvertPath(AppDomain.CurrentDomain.BaseDirectory + LogSync)))
            {
                File.Create(ClassUtility.ConvertPath(AppDomain.CurrentDomain.BaseDirectory + LogSync)).Close();
                return(false);
            }

            if (!File.Exists(ClassUtility.ConvertPath(AppDomain.CurrentDomain.BaseDirectory + LogRemoteNodeSync)))
            {
                File.Create(ClassUtility.ConvertPath(AppDomain.CurrentDomain.BaseDirectory + LogRemoteNodeSync)).Close();
                return(false);
            }

            return(true);
        }
示例#9
0
        public MainWindow()
        {
            InitializeComponent();

            KeyDown += VplControl.VplControl_KeyDown;
            KeyUp   += VplControl.VplControl_KeyUp;

            VplControl.ExternalNodeTypes.AddRange(
                ClassUtility.GetTypesInNamespace(Assembly.GetExecutingAssembly(), "TUM.CMS.VplControl.Test.Nodes")
                .ToList());

            VplControl.ExternalNodeTypes.AddRange(
                ClassUtility.GetTypesInNamespace(Assembly.GetExecutingAssembly(), "TUM.CMS.VplControl.Watch3D.Nodes")
                .ToList());

            VplControl.ExternalNodeTypes.Add(typeof(ScriptingNode));
            VplControl.ExternalNodeTypes.Add(typeof(Watch3DNode));

            VplControl.NodeTypeMode = NodeTypeModes.All;

            // VplPropertyGrid.SelectedObject = VplControl;
        }
示例#10
0
        /// <summary>
        ///     Insert a new contact to the list and save the database file.
        /// </summary>
        /// <param name="name"></param>
        /// <param name="walletAddress"></param>
        /// <returns></returns>
        public static bool InsertContact(string name, string walletAddress)
        {
            if (ListContactWallet.ContainsKey(name.ToLower()))
            {
#if DEBUG
                Log.WriteLine("Contact name: " + name + " already exist.");
#endif
                return(false);
            }

            foreach (var contactList in ListContactWallet)
            {
                if (contactList.Value.Item2.ToLower() == walletAddress.ToLower())
                {
#if DEBUG
                    Log.WriteLine("Contact wallet address: " + walletAddress + " already exist.");
#endif
                    return(false);
                }

                if (contactList.Value.Item1.ToLower() == name.ToLower())
                {
#if DEBUG
                    Log.WriteLine("Contact wallet address: " + walletAddress + " already exist.");
#endif
                    return(false);
                }
            }

            ListContactWallet.Add(name.ToLower(), new Tuple <string, string>(name, walletAddress));
            using (var writerContact =
                       new StreamWriter(ClassUtility.ConvertPath(AppDomain.CurrentDomain.BaseDirectory + ContactFileName),
                                        true))
            {
                writerContact.WriteLine(name + "|" + walletAddress);
            }

            return(true);
        }
示例#11
0
        /// <summary>
        /// Catch unexpected exception and them to a log file.
        /// </summary>
        private static void EnableCatchUnexpectedException()
        {
            AppDomain.CurrentDomain.UnhandledException += delegate(object sender, UnhandledExceptionEventArgs args2)
            {
                var filePath  = ClassUtility.ConvertPath(AppDomain.CurrentDomain.BaseDirectory + UnexpectedExceptionFile);
                var exception = (Exception)args2.ExceptionObject;
                using (var writer = new StreamWriter(filePath, true))
                {
                    writer.WriteLine("Message :" + exception.Message + "<br/>" + Environment.NewLine +
                                     "StackTrace :" +
                                     exception.StackTrace +
                                     "" + Environment.NewLine + "Date :" + DateTime.Now);
                    writer.WriteLine(Environment.NewLine +
                                     "-----------------------------------------------------------------------------" +
                                     Environment.NewLine);
                }

                Trace.TraceError(exception.StackTrace);
                Console.WriteLine("Unexpected error catched, check the error file: " + ClassUtility.ConvertPath(System.AppDomain.CurrentDomain.BaseDirectory + UnexpectedExceptionFile));
                Environment.Exit(1);
            };
        }
        /// <summary>
        ///     Load setting file of the wallet gui.
        /// </summary>
        public static bool LoadSetting()
        {
            if (!File.Exists(ClassUtility.ConvertPath(AppDomain.CurrentDomain.BaseDirectory + _WalletSettingFile)))
            {
                SaveSetting();
                return(true); // This is the first start of the wallet gui.
            }

            string jsonSetting = string.Empty;

            using (var reader =
                       new StreamReader(ClassUtility.ConvertPath(AppDomain.CurrentDomain.BaseDirectory + _WalletSettingFile)))
            {
                string line;
                while ((line = reader.ReadLine()) != null)
                {
                    jsonSetting += line;
                }
            }

            try
            {
                var walletSettingJsonObject = JsonConvert.DeserializeObject <ClassWalletSettingJson>(jsonSetting);
                ClassTranslation.CurrentLanguage            = walletSettingJsonObject.wallet_current_language;
                Program.WalletXiropht.WalletSyncHostname    = walletSettingJsonObject.wallet_sync_manual_host;
                Program.WalletXiropht.WalletSyncMode        = (ClassWalletSyncMode)walletSettingJsonObject.wallet_sync_mode;
                Program.WalletXiropht.WalletEnableProxyMode = walletSettingJsonObject.enable_proxy_mode;
                ClassPeerList.PeerMaxBanTime        = walletSettingJsonObject.peer_max_ban_time;
                ClassPeerList.PeerMaxDisconnect     = walletSettingJsonObject.peer_max_disconnect;
                ClassPeerList.PeerEnableTrustSystem = walletSettingJsonObject.enable_peer_trust_system;
            }
            catch
            {
                return(false);
            }

            return(true);
        }
        /// <summary>
        /// Generates the 'count by' method.
        /// </summary>
        /// <param name="file">The file.</param>
        /// <param name="propertyMaps">The property maps.</param>
        /// <param name="returnedClassMap">The returned class map.</param>
        public override void GenerateCountBy(StreamWriter file, IList <IPropertyMap> propertyMaps, IClassMap returnedClassMap)
        {
            ArrayList allColumns = returnedClassMap.GetTableMap().ColumnMaps;

            // build the 'where' statement
            bool          first      = true;
            StringBuilder whereQuery = new StringBuilder(16 * propertyMaps.Count);

            foreach (IPropertyMap propertyMap in propertyMaps)
            {
                if (!first)
                {
                    whereQuery.Append(" AND ");
                }

                whereQuery
                .Append('`')
                .Append(propertyMap.GetColumnMap().Name)
                .Append("`='\" + m_state.EscapeString(")
                .Append(ClassUtility.GetParamName(propertyMap))
                .Append(".ToString()) + \"'");

                first = false;
            }

            string entityClassName = EntityGenerator.GetTypeName(returnedClassMap);
            string sqlCommand      = "SELECT  count(*)"
                                     + " FROM `" + returnedClassMap.GetTableMap().Name + "`"
                                     + " WHERE " + whereQuery.ToString();

            // create an array and store results
            file.WriteLine();
            file.WriteLine("			return (long) m_state.ExecuteScalar(");
            file.WriteLine("				\""+ sqlCommand + "\");");
            file.WriteLine();
        }
        /// <summary>
        ///     Check password validity
        /// </summary>
        private bool CheckPasswordValidity()
        {
            if (textBoxPassword.Text.Length >= ClassConnectorSetting.WalletMinPasswordLength)
            {
                if (ClassUtility.CheckPassword(textBoxPassword.Text))
                {
                    MethodInvoker invoke = () => pictureBoxPasswordStatus.BackgroundImage = Resources.valid;
                    BeginInvoke(invoke);
                    return(true);
                }
                else
                {
                    MethodInvoker invoke = () => pictureBoxPasswordStatus.BackgroundImage = Resources.error;
                    BeginInvoke(invoke);
                }
            }
            else
            {
                MethodInvoker invoke = () => pictureBoxPasswordStatus.BackgroundImage = Resources.error;
                BeginInvoke(invoke);
            }

            return(false);
        }
示例#15
0
        public SelectionNode(VplControl hostCanvas) : base(hostCanvas)
        {
            searchTextBox           = new SearchTextBox();
            searchTextBox.OnSearch += searchTextBox_OnSearch;

            var tempTypeList = new List <Type>();

            AddControlToNode(searchTextBox);

            listBox.DisplayMemberPath = "Name";
            listBox.MaxHeight         = 140;

            AddControlToNode(listBox);


            if (hostCanvas.NodesFilterted)
            {
                foreach (var item in hostCanvas.ExternalNodeTypes)
                {
                    if (item.Namespace.Contains(hostCanvas.NodesFilterName))
                    {
                        tempTypeList.Add(item);
                    }
                }
            }
            else
            {
                switch (hostCanvas.NodeTypeMode)
                {
                case NodeTypeModes.OnlyInternalTypes:
                    tempTypeList.AddRange(
                        ClassUtility.GetTypesInNamespace(Assembly.GetExecutingAssembly(), "TUM.CMS.VplControl.Nodes")
                        .ToList());
                    break;

                case NodeTypeModes.OnlyExternalTypes:
                    tempTypeList.AddRange(hostCanvas.ExternalNodeTypes);
                    break;

                case NodeTypeModes.All:
                    tempTypeList.AddRange(
                        ClassUtility.GetTypesInNamespace(Assembly.GetExecutingAssembly(), "TUM.CMS.VplControl.Nodes")
                        .ToList());
                    tempTypeList.AddRange(hostCanvas.ExternalNodeTypes);
                    break;
                }
            }

            tempTypeList = tempTypeList.OrderBy(x => x.Name).ToList();


            foreach (var type in tempTypeList.Where(type => !type.IsAbstract))
            {
                if (type.Name.Contains('<') || type.Name.Contains("ComboboxItem"))
                {
                }
                else
                {
                    typeList.Add(type);
                }
            }


            listBox.ItemsSource               = typeList;
            searchTextBox.PreviewKeyDown     += searchTextBox_KeyDown;
            listBox.PreviewMouseLeftButtonUp += listBox_PreviewMouseLeftButtonUp;

            listBox.SelectionMode = SelectionMode.Single;


            Border.MouseLeave += SelectionNode_MouseLeave;
            MouseEnter        += SelectionNode_MouseEnter;
        }
示例#16
0
 /// <summary>
 /// Load RPC Database file.
 /// </summary>
 /// <returns></returns>
 public static bool LoadRpcDatabaseFile()
 {
     RpcDatabaseContent = new Dictionary <string, ClassWalletObject>();
     try
     {
         if (File.Exists(ClassUtility.ConvertPath(AppDomain.CurrentDomain.BaseDirectory + RpcDatabaseFile)))
         {
             using (FileStream fs = File.Open(ClassUtility.ConvertPath(AppDomain.CurrentDomain.BaseDirectory + RpcDatabaseFile), FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
             {
                 using (BufferedStream bs = new BufferedStream(fs))
                 {
                     using (StreamReader sr = new StreamReader(bs))
                     {
                         string line;
                         int    lineRead = 0;
                         while ((line = sr.ReadLine()) != null)
                         {
                             lineRead++;
                             if (line.StartsWith(ClassRpcDatabaseEnumeration.DatabaseWalletStartLine))
                             {
                                 string walletData = line.Replace(ClassRpcDatabaseEnumeration.DatabaseWalletStartLine, "");
                                 walletData = ClassAlgo.GetDecryptedResultManual(ClassAlgoEnumeration.Rijndael, walletData, RpcDatabasePassword, ClassWalletNetworkSetting.KeySize);
                                 if (walletData != ClassAlgoErrorEnumeration.AlgoError)
                                 {
                                     var splitWalletData = walletData.Split(new[] { "|" }, StringSplitOptions.None);
                                     var walletAddress   = splitWalletData[0];
                                     if (!RpcDatabaseContent.ContainsKey(walletAddress))
                                     {
                                         var walletPublicKey  = splitWalletData[1];
                                         var walletPrivateKey = splitWalletData[2];
                                         var walletPinCode    = splitWalletData[3];
                                         var walletPassword   = splitWalletData[4];
                                         var walletObject     = new ClassWalletObject(walletAddress, walletPublicKey, walletPassword, walletPrivateKey, walletPinCode, walletData);
                                         if (!RpcDatabaseContent.ContainsKey(walletAddress))
                                         {
                                             RpcDatabaseContent.Add(walletAddress, walletObject);
                                         }
                                     }
                                 }
                                 else
                                 {
                                     ClassConsole.ConsoleWriteLine("Decrypt database of wallets failed at line: " + lineRead);
                                     return(false);
                                 }
                             }
                         }
                     }
                 }
             }
         }
         else
         {
             File.Create(ClassUtility.ConvertPath(AppDomain.CurrentDomain.BaseDirectory + RpcDatabaseFile)).Close();
         }
     }
     catch
     {
         return(false);
     }
     RpcDatabaseStreamWriter = new StreamWriter(ClassUtility.ConvertPath(AppDomain.CurrentDomain.BaseDirectory + RpcDatabaseFile), true, Encoding.UTF8, 8192)
     {
         AutoFlush = true
     };
     return(true);
 }
示例#17
0
        /// <summary>
        /// Force to save whole databases of wallets.
        /// </summary>
        public static async Task <bool> SaveWholeRpcWalletDatabaseFile()
        {
            while (InSave)
            {
                await Task.Delay(100);
            }
            InSave = true;
            bool success = false;

            while (!success)
            {
                try
                {
                    try
                    {
                        RpcDatabaseStreamWriter?.Close();
                        RpcDatabaseStreamWriter?.Dispose();
                    }
                    catch
                    {
                    }

                    File.Copy(ClassUtility.ConvertPath(AppDomain.CurrentDomain.BaseDirectory + RpcDatabaseFile), ClassUtility.ConvertPath(AppDomain.CurrentDomain.BaseDirectory + RpcDatabaseFileBackup + "-" + DateTimeOffset.Now.ToUnixTimeMilliseconds())); // Backup wallet database just in case.

                    File.Create(ClassUtility.ConvertPath(AppDomain.CurrentDomain.BaseDirectory + RpcDatabaseFile)).Close();

                    RpcDatabaseStreamWriter = new StreamWriter(ClassUtility.ConvertPath(AppDomain.CurrentDomain.BaseDirectory + RpcDatabaseFile), true, Encoding.UTF8, 8192)
                    {
                        AutoFlush = true
                    };

                    foreach (var wallet in RpcDatabaseContent)
                    {
                        string encryptedWallet = ClassAlgo.GetEncryptedResultManual(ClassAlgoEnumeration.Rijndael, wallet.Value.GetWalletAddress() + "|" + wallet.Value.GetWalletPublicKey() + "|" + wallet.Value.GetWalletPrivateKey() + "|" + wallet.Value.GetWalletPinCode() + "|" + wallet.Value.GetWalletPassword(), RpcDatabasePassword, ClassWalletNetworkSetting.KeySize);
                        RpcDatabaseStreamWriter.WriteLine(ClassRpcDatabaseEnumeration.DatabaseWalletStartLine + encryptedWallet);
                    }
                    success = true;
                }
                catch
                {
                    RpcDatabaseStreamWriter = new StreamWriter(ClassUtility.ConvertPath(AppDomain.CurrentDomain.BaseDirectory + RpcDatabaseFile), true, Encoding.UTF8, 8192)
                    {
                        AutoFlush = true
                    };
                }
            }
            InSave = false;
            return(true);
        }
示例#18
0
        /// <summary>
        /// Read database files of the mining pool.
        /// </summary>
        public static bool InitializationMiningPoolDatabases()
        {
            try
            {
                #region Read Database Miner stats
                if (File.Exists(ClassUtility.ConvertPath(AppDomain.CurrentDomain.BaseDirectory + MinerDatabaseFile)))
                {
                    using (FileStream fs = File.Open(ClassUtility.ConvertPath(AppDomain.CurrentDomain.BaseDirectory + MinerDatabaseFile), FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
                    {
                        using (BufferedStream bs = new BufferedStream(fs))
                        {
                            using (StreamReader sr = new StreamReader(bs))
                            {
                                string line;
                                while ((line = sr.ReadLine()) != null)
                                {
                                    if (line.StartsWith(ClassMiningPoolMinerDatabaseEnumeration.DatabaseMinerStart))
                                    {
                                        string minerWalletAddress = string.Empty;
                                        var    minerLine          = line.Replace(ClassMiningPoolMinerDatabaseEnumeration.DatabaseMinerStart, "");
                                        var    splitMinerLine     = minerLine.Split(new[] { "|" }, StringSplitOptions.None);
                                        foreach (var minerInfo in splitMinerLine)
                                        {
                                            if (minerInfo != null)
                                            {
                                                if (!string.IsNullOrEmpty(minerInfo))
                                                {
                                                    if (minerInfo.StartsWith(ClassMiningPoolMinerDatabaseEnumeration.DatabaseMinerWalletAddress))
                                                    {
                                                        minerWalletAddress = minerInfo.Replace(ClassMiningPoolMinerDatabaseEnumeration.DatabaseMinerWalletAddress, "");
                                                        if (!ClassMinerStats.DictionaryMinerStats.ContainsKey(minerWalletAddress))
                                                        {
                                                            ClassMinerStats.DictionaryMinerStats.Add(minerWalletAddress, new ClassMinerStatsObject());
                                                            ClassMinerStats.DictionaryMinerTransaction.Add(minerWalletAddress, new List <string>());
                                                        }
                                                    }
                                                    if (!string.IsNullOrEmpty(minerWalletAddress))
                                                    {
                                                        if (minerInfo.StartsWith(ClassMiningPoolMinerDatabaseEnumeration.DatabaseMinerTotalGoodShare))
                                                        {
                                                            ClassMinerStats.DictionaryMinerStats[minerWalletAddress].TotalGoodShare = long.Parse(minerInfo.Replace(ClassMiningPoolMinerDatabaseEnumeration.DatabaseMinerTotalGoodShare, ""));
                                                        }
                                                        else if (minerInfo.StartsWith(ClassMiningPoolMinerDatabaseEnumeration.DatabaseMinerTotalInvalidShare))
                                                        {
                                                            ClassMinerStats.DictionaryMinerStats[minerWalletAddress].TotalInvalidShare = float.Parse(minerInfo.Replace(ClassMiningPoolMinerDatabaseEnumeration.DatabaseMinerTotalInvalidShare, ""));
                                                        }
                                                        else if (minerInfo.StartsWith(ClassMiningPoolMinerDatabaseEnumeration.DatabaseMinerTotalMiningScore))
                                                        {
                                                            ClassMinerStats.DictionaryMinerStats[minerWalletAddress].TotalMiningScore = long.Parse(minerInfo.Replace(ClassMiningPoolMinerDatabaseEnumeration.DatabaseMinerTotalMiningScore, ""));
                                                        }
                                                        else if (minerInfo.StartsWith(ClassMiningPoolMinerDatabaseEnumeration.DatabaseMinerTotalBalance))
                                                        {
                                                            ClassMinerStats.DictionaryMinerStats[minerWalletAddress].TotalBalance = decimal.Parse(minerInfo.Replace(ClassMiningPoolMinerDatabaseEnumeration.DatabaseMinerTotalBalance, "").Replace(".", ","), NumberStyles.Currency, Program.GlobalCultureInfo);
                                                        }
                                                        else if (minerInfo.StartsWith(ClassMiningPoolMinerDatabaseEnumeration.DatabaseMinerCustomMinimumPayment))
                                                        {
                                                            ClassMinerStats.DictionaryMinerStats[minerWalletAddress].CustomMinimumPayment = decimal.Parse(minerInfo.Replace(ClassMiningPoolMinerDatabaseEnumeration.DatabaseMinerCustomMinimumPayment, "").Replace(".", ","), NumberStyles.Currency, Program.GlobalCultureInfo);
                                                        }
                                                    }
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
                else
                {
                    File.Create(ClassUtility.ConvertPath(AppDomain.CurrentDomain.BaseDirectory + MinerDatabaseFile)).Close();
                }
                #endregion

                #region Read Database Pool
                if (File.Exists(ClassUtility.ConvertPath(AppDomain.CurrentDomain.BaseDirectory + PoolDatabaseFile)))
                {
                    using (FileStream fs = File.Open(ClassUtility.ConvertPath(AppDomain.CurrentDomain.BaseDirectory + PoolDatabaseFile), FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
                    {
                        using (BufferedStream bs = new BufferedStream(fs))
                        {
                            using (StreamReader sr = new StreamReader(bs))
                            {
                                string line;
                                while ((line = sr.ReadLine()) != null)
                                {
                                    var splitBlockFound = line;
                                    ClassMiningPoolGlobalStats.ListBlockFound.Add(ClassMiningPoolGlobalStats.ListBlockFound.Count, splitBlockFound);
                                }
                            }
                        }
                    }
                }
                else
                {
                    File.Create(ClassUtility.ConvertPath(AppDomain.CurrentDomain.BaseDirectory + PoolDatabaseFile)).Close();
                }
                #endregion

                #region Read Database Transactions
                if (File.Exists(ClassUtility.ConvertPath(AppDomain.CurrentDomain.BaseDirectory + MinerTransactionDatabaseFile)))
                {
                    using (FileStream fs = File.Open(ClassUtility.ConvertPath(AppDomain.CurrentDomain.BaseDirectory + MinerTransactionDatabaseFile), FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
                    {
                        using (BufferedStream bs = new BufferedStream(fs))
                        {
                            using (StreamReader sr = new StreamReader(bs))
                            {
                                string line;
                                List <KeyValuePair <long, string> > ListTransactionPool = new List <KeyValuePair <long, string> >();
                                while ((line = sr.ReadLine()) != null)
                                {
                                    if (line.StartsWith(ClassMiningPoolTransactionDatabaseEnumeration.DatabaseTransactionStart))
                                    {
                                        var transactionLine      = line.Replace(ClassMiningPoolTransactionDatabaseEnumeration.DatabaseTransactionStart, "");
                                        var splitTransactionLine = transactionLine.Split(new[] { "|" }, StringSplitOptions.None);
                                        if (ClassMinerStats.DictionaryMinerTransaction.ContainsKey(splitTransactionLine[0]))
                                        {
                                            ClassMinerStats.DictionaryMinerTransaction[splitTransactionLine[0]].Add(splitTransactionLine[1] + "|" + splitTransactionLine[2] + "|" + splitTransactionLine[3] + "|" + splitTransactionLine[4]);
                                        }
                                        else
                                        {
                                            ClassMinerStats.DictionaryMinerTransaction.Add(splitTransactionLine[0], new List <string>()
                                            {
                                                splitTransactionLine[1] + "|" + splitTransactionLine[2] + "|" + splitTransactionLine[3] + "|" + splitTransactionLine[4]
                                            });
                                        }
                                        if (!ClassMinerStats.DictionaryMinerStats.ContainsKey(splitTransactionLine[0]))
                                        {
                                            ClassMinerStats.DictionaryMinerStats.Add(splitTransactionLine[0], new ClassMinerStatsObject());
                                        }
                                        long    dateSend   = long.Parse(splitTransactionLine[4]);
                                        decimal amountPaid = decimal.Parse(splitTransactionLine[2]);
                                        decimal feePaid    = decimal.Parse(splitTransactionLine[3]);
                                        ClassMinerStats.DictionaryMinerStats[splitTransactionLine[0]].TotalPaid += (amountPaid + feePaid);
                                        string transactionInfo = splitTransactionLine[1] + "|" + splitTransactionLine[2] + "|" + splitTransactionLine[3] + "|" + splitTransactionLine[4];
                                        KeyValuePair <long, string> transactionKeyValuePair = new KeyValuePair <long, string>(dateSend, transactionInfo);
                                        ListTransactionPool.Add(transactionKeyValuePair);
                                        ClassMiningPoolGlobalStats.PoolTotalPaid += (amountPaid + feePaid);
                                    }
                                }
                                if (ListTransactionPool.Count > 0)
                                {
                                    ListTransactionPool = ListTransactionPool.OrderBy(x => x.Key).ToList();
                                    foreach (var transactionPool in ListTransactionPool)
                                    {
                                        ClassMinerStats.DictionaryPoolTransaction.Add(ClassMinerStats.DictionaryPoolTransaction.Count, transactionPool.Value);
                                    }
                                    ListTransactionPool.Clear();
                                }
                            }
                        }
                    }
                }
                else
                {
                    File.Create(ClassUtility.ConvertPath(AppDomain.CurrentDomain.BaseDirectory + MinerTransactionDatabaseFile)).Close();
                }
                #endregion
            }
            catch (Exception error)
            {
                ClassLog.ConsoleWriteLog("Error on initialization of mining pool databases, exception: " + error.Message, ClassLogEnumeration.IndexPoolGeneralErrorLog, ClassLogConsoleEnumeration.IndexPoolConsoleRedLog, true);
                return(false);
            }
            return(true);
        }
示例#19
0
        /// <summary>
        /// Stop auto save mining pool databases.
        /// </summary>
        public static void StopAutoSaveMiningPoolDatabases()
        {
            if (ThreadAutoSaveMiningPoolDatabases != null && (ThreadAutoSaveMiningPoolDatabases.IsAlive || ThreadAutoSaveMiningPoolDatabases != null))
            {
                ThreadAutoSaveMiningPoolDatabases.Abort();
                GC.SuppressFinalize(ThreadAutoSaveMiningPoolDatabases);
            }
            #region Save Database Miner Stats
            if (ClassMinerStats.DictionaryMinerStats.Count > 0)
            {
                File.Create(ClassUtility.ConvertPath(AppDomain.CurrentDomain.BaseDirectory + MinerDatabaseFile)).Close();
                using (var minerWriter = new StreamWriter(ClassUtility.ConvertPath(AppDomain.CurrentDomain.BaseDirectory + MinerDatabaseFile), true, Encoding.UTF8, 8192)
                {
                    AutoFlush = true
                })
                {
                    foreach (var miner in ClassMinerStats.DictionaryMinerStats)
                    {
                        if (!string.IsNullOrEmpty(miner.Key))
                        {
                            string line = ClassMiningPoolMinerDatabaseEnumeration.DatabaseMinerStart +
                                          ClassMiningPoolMinerDatabaseEnumeration.DatabaseMinerWalletAddress + miner.Key + "|" +
                                          ClassMiningPoolMinerDatabaseEnumeration.DatabaseMinerTotalGoodShare + miner.Value.TotalGoodShare + "|" +
                                          ClassMiningPoolMinerDatabaseEnumeration.DatabaseMinerTotalInvalidShare + miner.Value.TotalInvalidShare + "|" +
                                          ClassMiningPoolMinerDatabaseEnumeration.DatabaseMinerTotalMiningScore + miner.Value.TotalMiningScore + "|" +
                                          ClassMiningPoolMinerDatabaseEnumeration.DatabaseMinerTotalBalance + miner.Value.TotalBalance + "|" +
                                          ClassMiningPoolMinerDatabaseEnumeration.DatabaseMinerTotalPaid + miner.Value.TotalPaid + "|" +
                                          ClassMiningPoolMinerDatabaseEnumeration.DatabaseMinerCustomMinimumPayment + miner.Value.CustomMinimumPayment;
                            minerWriter.WriteLine(line);
                        }
                    }
                }
                ClassLog.ConsoleWriteLog("Auto save miner database: " + ClassMinerStats.DictionaryMinerStats.Count + " total miners saved.", ClassLogEnumeration.IndexPoolGeneralLog);
            }
            #endregion


            #region Save Database Pool
            if (ClassMiningPoolGlobalStats.ListBlockFound.Count > 0)
            {
                File.Create(ClassUtility.ConvertPath(AppDomain.CurrentDomain.BaseDirectory + PoolDatabaseFile)).Close();
                int totalBlockFound = ClassMiningPoolGlobalStats.ListBlockFound.Count;
                using (var poolWriter = new StreamWriter(ClassUtility.ConvertPath(AppDomain.CurrentDomain.BaseDirectory + PoolDatabaseFile), true, Encoding.UTF8, 8192)
                {
                    AutoFlush = true
                })
                {
                    for (int i = 0; i < totalBlockFound; i++)
                    {
                        if (i < totalBlockFound)
                        {
                            poolWriter.WriteLine(ClassMiningPoolGlobalStats.ListBlockFound[i]);
                        }
                    }
                }
                ClassLog.ConsoleWriteLog("Auto save pool database: " + totalBlockFound + " total blocks found saved.", ClassLogEnumeration.IndexPoolGeneralLog);
            }
            #endregion


            #region Save Database Transactions
            if (ClassMinerStats.DictionaryMinerTransaction.Count > 0)
            {
                File.Create(ClassUtility.ConvertPath(AppDomain.CurrentDomain.BaseDirectory + MinerTransactionDatabaseFile)).Close();
                using (var transactionMinerWriter = new StreamWriter(ClassUtility.ConvertPath(AppDomain.CurrentDomain.BaseDirectory + MinerTransactionDatabaseFile), true, Encoding.UTF8, 8192)
                {
                    AutoFlush = true
                })
                {
                    foreach (var miner in ClassMinerStats.DictionaryMinerTransaction)
                    {
                        if (!string.IsNullOrEmpty(miner.Key))
                        {
                            if (miner.Value.Count > 0)
                            {
                                foreach (var transaction in miner.Value)
                                {
                                    string line = ClassMiningPoolTransactionDatabaseEnumeration.DatabaseTransactionStart + miner.Key + "|" + transaction;
                                    transactionMinerWriter.WriteLine(line);
                                }
                            }
                        }
                    }
                }
            }

            #endregion
        }
示例#20
0
        /// <summary>
        /// Auto save mining pools databases.
        /// </summary>
        public static void AutoSaveMiningPoolDatabases()
        {
            if (ThreadAutoSaveMiningPoolDatabases != null && (ThreadAutoSaveMiningPoolDatabases.IsAlive || ThreadAutoSaveMiningPoolDatabases != null))
            {
                ThreadAutoSaveMiningPoolDatabases.Abort();
                GC.SuppressFinalize(ThreadAutoSaveMiningPoolDatabases);
            }
            ThreadAutoSaveMiningPoolDatabases = new Thread(delegate()
            {
                while (!Program.Exit)
                {
                    try
                    {
                        #region Save Database Miner Stats
                        if (ClassMinerStats.DictionaryMinerStats.Count > 0)
                        {
                            File.Create(ClassUtility.ConvertPath(AppDomain.CurrentDomain.BaseDirectory + MinerDatabaseFile)).Close();
                            using (var minerWriter = new StreamWriter(ClassUtility.ConvertPath(AppDomain.CurrentDomain.BaseDirectory + MinerDatabaseFile), true, Encoding.UTF8, 8192)
                            {
                                AutoFlush = true
                            })
                            {
                                foreach (var miner in ClassMinerStats.DictionaryMinerStats)
                                {
                                    if (!string.IsNullOrEmpty(miner.Key))
                                    {
                                        string line = ClassMiningPoolMinerDatabaseEnumeration.DatabaseMinerStart +
                                                      ClassMiningPoolMinerDatabaseEnumeration.DatabaseMinerWalletAddress + miner.Key + "|" +
                                                      ClassMiningPoolMinerDatabaseEnumeration.DatabaseMinerTotalGoodShare + miner.Value.TotalGoodShare + "|" +
                                                      ClassMiningPoolMinerDatabaseEnumeration.DatabaseMinerTotalInvalidShare + miner.Value.TotalInvalidShare + "|" +
                                                      ClassMiningPoolMinerDatabaseEnumeration.DatabaseMinerTotalMiningScore + miner.Value.TotalMiningScore + "|" +
                                                      ClassMiningPoolMinerDatabaseEnumeration.DatabaseMinerTotalBalance + miner.Value.TotalBalance + "|" +
                                                      ClassMiningPoolMinerDatabaseEnumeration.DatabaseMinerTotalPaid + miner.Value.TotalPaid + "|" +
                                                      ClassMiningPoolMinerDatabaseEnumeration.DatabaseMinerCustomMinimumPayment + miner.Value.CustomMinimumPayment;
                                        minerWriter.WriteLine(line);
                                    }
                                }
                            }
                            ClassLog.ConsoleWriteLog("Auto save miner database: " + ClassMinerStats.DictionaryMinerStats.Count + " total miners saved.", ClassLogEnumeration.IndexPoolGeneralLog);
                        }
                        #endregion
                        Thread.Sleep(AutoSaveMiningPoolDatabasesInterval);

                        #region Save Database Pool
                        if (ClassMiningPoolGlobalStats.ListBlockFound.Count > 0)
                        {
                            File.Create(ClassUtility.ConvertPath(AppDomain.CurrentDomain.BaseDirectory + PoolDatabaseFile)).Close();
                            int totalBlockFound = ClassMiningPoolGlobalStats.ListBlockFound.Count;
                            using (var poolWriter = new StreamWriter(ClassUtility.ConvertPath(AppDomain.CurrentDomain.BaseDirectory + PoolDatabaseFile), true, Encoding.UTF8, 8192)
                            {
                                AutoFlush = true
                            })
                            {
                                for (int i = 0; i < totalBlockFound; i++)
                                {
                                    if (i < totalBlockFound)
                                    {
                                        poolWriter.WriteLine(ClassMiningPoolGlobalStats.ListBlockFound[i]);
                                    }
                                }
                            }
                            ClassLog.ConsoleWriteLog("Auto save pool database: " + totalBlockFound + " total blocks found saved.", ClassLogEnumeration.IndexPoolGeneralLog);
                        }
                        #endregion
                        Thread.Sleep(AutoSaveMiningPoolDatabasesInterval);
                    }
                    catch (Exception error)
                    {
                        ClassLog.ConsoleWriteLog("Auto save databases of the pool exception: " + error.Message + " retry after few seconds", ClassLogEnumeration.IndexPoolGeneralLog, ClassLogConsoleEnumeration.IndexPoolConsoleRedLog, true);
                        Thread.Sleep(5000);
                    }
                }
            });
            ThreadAutoSaveMiningPoolDatabases.Start();
        }
示例#21
0
        /// <summary>
        /// Enable auto payment system.
        /// </summary>
        public static void EnableAutoPaymentSystem()
        {
            if (ThreadAutoPaymentSystem != null && (ThreadAutoPaymentSystem.IsAlive || ThreadAutoPaymentSystem != null))
            {
                ThreadAutoPaymentSystem.Abort();
                GC.SuppressFinalize(ThreadAutoPaymentSystem);
            }

            if (MiningPoolSetting.MiningPoolIntervalPayment > 0)
            {
                if (MiningPoolSetting.MiningPoolMinimumBalancePayment > 0)
                {
                    if (MiningPoolSetting.MiningPoolFeeTransactionPayment > 0)
                    {
                        if (MiningPoolSetting.MiningPoolFeeTransactionPayment >= ClassConnectorSetting.MinimumWalletTransactionFee)
                        {
                            ThreadAutoPaymentSystem = new Thread(async delegate()
                            {
                                while (!Program.Exit)
                                {
                                    try
                                    {
                                        if (!PoolOnProceedBlockReward)
                                        {
                                            PoolOnSendingTransaction = true;
                                            if (await ClassRpcWallet.GetCurrentBalance())
                                            {
                                                ClassLog.ConsoleWriteLog("Start to proceed payments.", ClassLogEnumeration.IndexPoolPaymentLog);

                                                if (ClassMinerStats.DictionaryMinerStats.Count > 0)
                                                {
                                                    foreach (var minerStats in ClassMinerStats.DictionaryMinerStats)
                                                    {
                                                        if (minerStats.Value.TotalBan <= MiningPoolSetting.MiningPoolMaxTotalBanMiner)
                                                        {
                                                            if (minerStats.Value.TotalBalance >= MiningPoolSetting.MiningPoolMinimumBalancePayment)
                                                            {
                                                                if (minerStats.Value.CustomMinimumPayment == 0 || minerStats.Value.TotalBalance >= minerStats.Value.CustomMinimumPayment) // Make payment if the miner don't have select a custom minimum payment or when his current balance reach his custom minimum payment set.
                                                                {
                                                                    if (await ClassRpcWallet.GetCurrentBalance())
                                                                    {
                                                                        if (minerStats.Value.TotalBalance <= ClassMiningPoolGlobalStats.PoolCurrentBalance)
                                                                        {
                                                                            decimal minersBalanceBase = minerStats.Value.TotalBalance;
                                                                            decimal minersBalance     = minerStats.Value.TotalBalance;
                                                                            minersBalance             = minersBalance - MiningPoolSetting.MiningPoolFeeTransactionPayment;
                                                                            ClassLog.ConsoleWriteLog("Attempt to send transaction of " + minersBalance + " " + ClassConnectorSetting.CoinNameMin + " to miner " + minerStats.Key, ClassLogEnumeration.IndexPoolPaymentLog);
                                                                            long dateSent = ClassUtility.GetCurrentDateInSecond();

                                                                            string resultPayment = await ClassRpcWallet.SendTransaction(minerStats.Key, minersBalance);
                                                                            if (resultPayment != string.Empty)
                                                                            {
                                                                                var resultPaymentSplit = resultPayment.Split(new[] { "|" }, StringSplitOptions.None);
                                                                                switch (resultPaymentSplit[0])
                                                                                {
                                                                                case ClassRpcWalletCommand.SendTokenTransactionConfirmed:
                                                                                    minerStats.Value.TotalBalance            -= minersBalanceBase;
                                                                                    minerStats.Value.TotalPaid               += minersBalanceBase;
                                                                                    ClassMiningPoolGlobalStats.PoolTotalPaid += minersBalanceBase;
                                                                                    ClassMinerStats.InsertTransactionPayment(minerStats.Key, resultPaymentSplit[1], minersBalance, dateSent);
                                                                                    ClassLog.ConsoleWriteLog("Transaction sent to miner " + minerStats.Key + " is confirmed, transaction hash: " + resultPaymentSplit[1], ClassLogEnumeration.IndexPoolPaymentLog, ClassLogConsoleEnumeration.IndexPoolConsoleGreenLog, true);
                                                                                    break;

                                                                                default:
                                                                                    ClassLog.ConsoleWriteLog("Transaction sent to miner " + minerStats.Key + " is not confirmed, response received: " + resultPaymentSplit[0], ClassLogEnumeration.IndexPoolPaymentLog, ClassLogConsoleEnumeration.IndexPoolConsoleRedLog, true);
                                                                                    break;
                                                                                }
                                                                            }
                                                                            else
                                                                            {
                                                                                ClassLog.ConsoleWriteLog("No response from RPC Wallet to proceed payment to miner: " + minerStats.Key, ClassLogEnumeration.IndexPoolPaymentErrorLog);
                                                                            }
                                                                        }
                                                                        else
                                                                        {
                                                                            ClassLog.ConsoleWriteLog("Can't proceed payment to miner: " + minerStats.Key + ",  not enought coin on the pool wallet. | " + minerStats.Value.TotalBalance + "/" + ClassMiningPoolGlobalStats.PoolCurrentBalance, ClassLogEnumeration.IndexPoolPaymentErrorLog, ClassLogConsoleEnumeration.IndexPoolConsoleRedLog, true);
                                                                        }
                                                                    }
                                                                    else
                                                                    {
                                                                        ClassLog.ConsoleWriteLog("Can't proceed payment to miner: " + minerStats.Key + ", cannot get current pool balance.", ClassLogEnumeration.IndexPoolPaymentErrorLog, ClassLogConsoleEnumeration.IndexPoolConsoleRedLog, true);
                                                                    }
                                                                }
                                                            }
                                                        }
                                                        else
                                                        {
                                                            ClassLog.ConsoleWriteLog("Can't proceed payment to miner: " + minerStats.Key + ", the miner have reach too much ban.", ClassLogEnumeration.IndexPoolPaymentErrorLog, ClassLogConsoleEnumeration.IndexPoolConsoleRedLog);
                                                        }
                                                    }
                                                }


                                                ClassLog.ConsoleWriteLog("End to proceed payments.", ClassLogEnumeration.IndexPoolPaymentLog);
                                            }
                                            else
                                            {
                                                ClassLog.ConsoleWriteLog("Can't proceed payment, cannot get current pool balance.", ClassLogEnumeration.IndexPoolPaymentErrorLog, ClassLogConsoleEnumeration.IndexPoolConsoleRedLog, true);
                                            }
                                            PoolOnSendingTransaction = false;
                                        }
                                        else
                                        {
                                            ClassLog.ConsoleWriteLog("Pool currently on proceed block reward, payments will are launch after.", ClassLogEnumeration.IndexPoolPaymentLog, ClassLogConsoleEnumeration.IndexPoolConsoleYellowLog, true);
                                        }
                                    }
                                    catch (Exception error)
                                    {
                                        PoolOnSendingTransaction = false;
                                        ClassLog.ConsoleWriteLog("Proceed payments exception error: " + error.Message, ClassLogEnumeration.IndexPoolPaymentErrorLog, ClassLogConsoleEnumeration.IndexPoolConsoleRedLog, true);
                                    }
                                    Thread.Sleep(MiningPoolSetting.MiningPoolIntervalPayment * 1000);
                                }
                            });
                            ThreadAutoPaymentSystem.Start();
                        }
                        else
                        {
                            ClassLog.ConsoleWriteLog("Warning, the transaction " + ClassConnectorSetting.CoinNameMin + " fee is less than the minimum accepted of: " + ClassConnectorSetting.MinimumWalletTransactionFee + ", the payment system will not be enabled.", ClassLogEnumeration.IndexPoolPaymentErrorLog, ClassLogConsoleEnumeration.IndexPoolConsoleRedLog, true);
                        }
                    }
                    else
                    {
                        ClassLog.ConsoleWriteLog("Warning, the transaction " + ClassConnectorSetting.CoinNameMin + " fee is less or equals of 0, the payment system will not be enabled.", ClassLogEnumeration.IndexPoolPaymentErrorLog, ClassLogConsoleEnumeration.IndexPoolConsoleRedLog, true);
                    }
                }
                else
                {
                    ClassLog.ConsoleWriteLog("Warning, the minimum of " + ClassConnectorSetting.CoinNameMin + " to reach for proceed payment, is less or equals of 0, the payment system will not be enabled.", ClassLogEnumeration.IndexPoolPaymentErrorLog, ClassLogConsoleEnumeration.IndexPoolConsoleRedLog, true);
                }
            }
            else
            {
                ClassLog.ConsoleWriteLog("Warning, the interval of payment is less or equals of 0 second, the payment system will not be enabled.", ClassLogEnumeration.IndexPoolPaymentErrorLog, ClassLogConsoleEnumeration.IndexPoolConsoleRedLog, true);
            }
        }
示例#22
0
        /// <summary>
        /// Handle get request received from client.
        /// </summary>
        /// <param name="packet"></param>
        /// <returns></returns>
        private async Task HandlePacketHttpAsync(string packet)
        {
            if (packet.Contains("|"))
            {
                var splitPacket = packet.Split(new[] { "|" }, StringSplitOptions.None);

                switch (splitPacket[0])
                {
                case ClassApiEnumeration.GetPoolPaymentById:
                    if (int.TryParse(splitPacket[1], out var paymentId))
                    {
                        if (paymentId > 0)
                        {
                            paymentId--;
                        }
                        if (ClassMinerStats.DictionaryPoolTransaction.ContainsKey(paymentId))
                        {
                            var    payment  = ClassMinerStats.DictionaryPoolTransaction[paymentId].Split(new[] { "|" }, StringSplitOptions.None);
                            string hash     = payment[0];
                            string amount   = payment[1];
                            string fee      = payment[2];
                            string timeSent = payment[3];
                            Dictionary <string, string> paymentContent = new Dictionary <string, string>()
                            {
                                { "payment_id", splitPacket[1] },
                                { "payment_hash", hash },
                                { "payment_amount", ClassUtility.FormatMaxDecimalPlace(amount) },
                                { "payment_fee", ClassUtility.FormatMaxDecimalPlace(fee) },
                                { "payment_date_sent", timeSent }
                            };
                            await BuildAndSendHttpPacketAsync(string.Empty, true, paymentContent);

                            break;
                        }
                        else
                        {
                            await BuildAndSendHttpPacketAsync(ClassApiEnumeration.IndexNotExist);
                        }
                    }
                    else
                    {
                        await BuildAndSendHttpPacketAsync(ClassApiEnumeration.PacketError);
                    }
                    break;

                case ClassApiEnumeration.GetPoolBlockById:
                    if (int.TryParse(splitPacket[1], out var blockId))
                    {
                        if (blockId > 0)
                        {
                            blockId--;
                        }
                        if (ClassMiningPoolGlobalStats.ListBlockFound.ContainsKey(blockId))
                        {
                            var blockFound  = ClassMiningPoolGlobalStats.ListBlockFound[blockId];
                            var splitBlock  = blockFound.Split(new[] { "|" }, StringSplitOptions.None);
                            var blockResult = await ClassRemoteApi.GetBlockInformation(splitBlock[0]);

                            if (blockResult != null)
                            {
                                try
                                {
                                    JObject jObjectBlock = JObject.Parse(blockResult);
                                    if (jObjectBlock.ContainsKey("result"))     // Usually showed has not exist when the remote node don't have finish to sync blocks mined.
                                    {
                                        await BuildAndSendHttpPacketAsync(ClassApiEnumeration.IndexNotExist);
                                    }
                                    else
                                    {
                                        await BuildAndSendHttpPacketAsync(blockResult, false, null, true);     // Send already jsonfyed request.
                                    }
                                }
                                catch (Exception error)
                                {
                                    ClassLog.ConsoleWriteLog("Pool API - Remote Node HTTP API packet exception: " + error.Message + " packet received: " + blockResult, ClassLogEnumeration.IndexPoolApiErrorLog, ClassLogConsoleEnumeration.IndexPoolConsoleRedLog);
                                    await BuildAndSendHttpPacketAsync(ClassApiEnumeration.PacketError);
                                }
                            }
                            else
                            {
                                ClassLog.ConsoleWriteLog("Pool API - Warning, your Remote Node HTTP API seems to not respond !", ClassLogEnumeration.IndexPoolApiErrorLog, ClassLogConsoleEnumeration.IndexPoolConsoleRedLog, true);
                                await BuildAndSendHttpPacketAsync(ClassApiEnumeration.PacketError);
                            }
                            break;
                        }
                        else
                        {
                            await BuildAndSendHttpPacketAsync(ClassApiEnumeration.IndexNotExist);
                        }
                    }
                    else
                    {
                        await BuildAndSendHttpPacketAsync(ClassApiEnumeration.PacketError);
                    }
                    break;

                case ClassApiEnumeration.GetWalletPaymentById:
                    if (splitPacket.Length > 1)
                    {
                        if (ClassMinerStats.DictionaryMinerStats.ContainsKey(splitPacket[1]))
                        {
                            if (ClassMinerStats.DictionaryMinerTransaction.ContainsKey(splitPacket[1]))
                            {
                                if (int.TryParse(splitPacket[2], out var walletPaymentId))
                                {
                                    if (walletPaymentId > 0)
                                    {
                                        walletPaymentId--;
                                    }
                                    if (ClassMinerStats.DictionaryMinerTransaction[splitPacket[1]].Count > walletPaymentId)
                                    {
                                        var    paymentSplit        = ClassMinerStats.DictionaryMinerTransaction[splitPacket[1]][walletPaymentId].Split(new[] { "|" }, StringSplitOptions.None);
                                        string transactionHash     = paymentSplit[0];
                                        string transactionAmount   = paymentSplit[1];
                                        string transactionFee      = paymentSplit[2];
                                        string transactionDateSent = paymentSplit[3];
                                        Dictionary <string, string> paymentContent = new Dictionary <string, string>()
                                        {
                                            { "payment_hash", transactionHash },
                                            { "payment_amount", ClassUtility.FormatMaxDecimalPlace(transactionAmount) },
                                            { "payment_fee", ClassUtility.FormatMaxDecimalPlace(transactionFee) },
                                            { "payment_date_sent", transactionDateSent }
                                        };
                                        await BuildAndSendHttpPacketAsync(string.Empty, true, paymentContent);
                                    }
                                    else
                                    {
                                        await BuildAndSendHttpPacketAsync(ClassApiEnumeration.WalletPaymentIndexNotExist);
                                    }
                                }
                                else
                                {
                                    await BuildAndSendHttpPacketAsync(ClassApiEnumeration.PacketError);
                                }
                            }
                            else
                            {
                                await BuildAndSendHttpPacketAsync(ClassApiEnumeration.WalletNoPaymentExist);
                            }
                        }
                        else
                        {
                            await BuildAndSendHttpPacketAsync(ClassApiEnumeration.WalletNotExist);
                        }
                    }
                    else
                    {
                        await BuildAndSendHttpPacketAsync(ClassApiEnumeration.PacketError);
                    }
                    break;

                case ClassApiEnumeration.GetWalletStats:
                    if (splitPacket.Length > 1)
                    {
                        if (ClassMinerStats.DictionaryMinerStats.ContainsKey(splitPacket[1]))
                        {
                            int     totalPayment         = 0;
                            long    totalGoodShare       = 0;
                            float   totalInvalidShare    = 0;
                            string  totalBalance         = "0";
                            string  totalPaid            = "0";
                            decimal totalHashrate        = 0;
                            decimal totalMiningScore     = 0;
                            decimal totalMiningScorePool = 0;
                            decimal customMinimumPayment = 0;
                            long    lastShareReceived    = 0;

                            if (ClassMinerStats.DictionaryMinerTransaction.ContainsKey(splitPacket[1]))
                            {
                                totalPayment = ClassMinerStats.DictionaryMinerTransaction[splitPacket[1]].Count;
                            }
                            totalGoodShare       = ClassMinerStats.DictionaryMinerStats[splitPacket[1]].TotalGoodShare;
                            totalInvalidShare    = ClassMinerStats.DictionaryMinerStats[splitPacket[1]].TotalInvalidShare;
                            totalBalance         = ClassMinerStats.DictionaryMinerStats[splitPacket[1]].TotalBalance.ToString("F" + ClassConnectorSetting.MaxDecimalPlace);
                            totalPaid            = ClassMinerStats.DictionaryMinerStats[splitPacket[1]].TotalPaid.ToString("F" + ClassConnectorSetting.MaxDecimalPlace);
                            totalHashrate        = ClassMinerStats.DictionaryMinerStats[splitPacket[1]].CurrentTotalHashrate;
                            totalMiningScore     = ClassMinerStats.DictionaryMinerStats[splitPacket[1]].TotalMiningScore;
                            customMinimumPayment = ClassMinerStats.DictionaryMinerStats[splitPacket[1]].CustomMinimumPayment;
                            lastShareReceived    = ClassMinerStats.DictionaryMinerStats[splitPacket[1]].DateOfLastGoodShare;
                            foreach (var minerStats in ClassMinerStats.DictionaryMinerStats)
                            {
                                if (minerStats.Value.TotalBan <= MiningPoolSetting.MiningPoolMaxTotalBanMiner)
                                {
                                    if (minerStats.Value.TotalMiningScore > 0)
                                    {
                                        totalMiningScorePool += minerStats.Value.TotalMiningScore;
                                    }
                                }
                            }
                            Dictionary <string, string> minerStatsContent = new Dictionary <string, string>()
                            {
                                { "wallet_address", splitPacket[1] },
                                { "wallet_total_hashrate", "" + totalHashrate },
                                { "wallet_total_good_share", "" + totalGoodShare },
                                { "wallet_total_invalid_share", "" + totalInvalidShare },
                                { "wallet_total_balance", totalBalance },
                                { "wallet_total_paid", totalPaid },
                                { "wallet_total_payment", "" + totalPayment },
                                { "wallet_total_mining_score", totalMiningScore.ToString("F0") },
                                { "wallet_total_pool_mining_score", totalMiningScorePool.ToString("F0") },
                                { "wallet_custom_minimum_payment", "" + customMinimumPayment },
                                { "wallet_last_share_received", "" + lastShareReceived }
                            };
                            await BuildAndSendHttpPacketAsync(string.Empty, true, minerStatsContent);

                            break;
                        }
                        else
                        {
                            await BuildAndSendHttpPacketAsync(ClassApiEnumeration.WalletNotExist);
                        }
                    }
                    else
                    {
                        await BuildAndSendHttpPacketAsync(ClassApiEnumeration.PacketError);
                    }
                    break;

                case ClassApiEnumeration.SetWalletCustomMinimumPayment:
                    if (splitPacket.Length > 2)
                    {
                        if (ClassMinerStats.DictionaryMinerStats.ContainsKey(splitPacket[1]))
                        {
                            var customMinimumPaymentString = ClassUtility.FormatMaxDecimalPlace(splitPacket[2].Replace(".", ",")).Replace(".", ",");
                            if (decimal.TryParse(customMinimumPaymentString, NumberStyles.Currency, Program.GlobalCultureInfo, out var customMinimumPayment))
                            {
                                if (customMinimumPayment >= MiningPoolSetting.MiningPoolMinimumBalancePayment)
                                {
                                    ClassMinerStats.DictionaryMinerStats[splitPacket[1]].CustomMinimumPayment = customMinimumPayment;
                                    await BuildAndSendHttpPacketAsync(ClassApiEnumeration.CustomMinimumPaymentChanged);
                                }
                                else
                                {
                                    await BuildAndSendHttpPacketAsync(ClassApiEnumeration.CustomMinimumPaymentTooLowest);
                                }
                            }
                            else
                            {
                                await BuildAndSendHttpPacketAsync(ClassApiEnumeration.CustomMinimumPaymentNotValid);
                            }
                        }
                        else
                        {
                            await BuildAndSendHttpPacketAsync(ClassApiEnumeration.WalletNotExist);
                        }
                    }
                    else
                    {
                        await BuildAndSendHttpPacketAsync(ClassApiEnumeration.PacketError);
                    }
                    break;

                default:
                    await BuildAndSendHttpPacketAsync(ClassApiEnumeration.PacketNotExist);

                    break;
                }
            }
            else
            {
                switch (packet)
                {
                case ClassApiEnumeration.GetPoolStats:
                    decimal networkHashrate    = 0;
                    string  networkInformation = await ClassRemoteApi.GetNetworkInformation();

                    if (networkInformation != null)
                    {
                        var networkInformationObject = JObject.Parse(networkInformation);
                        networkHashrate = decimal.Parse(networkInformationObject["coin_network_hashrate"].ToString());
                        string lastBlockFoundDate = "0";
                        if (ClassMiningPoolGlobalStats.ListBlockFound.Count > 0)
                        {
                            lastBlockFoundDate = ClassMiningPoolGlobalStats.ListBlockFound[ClassMiningPoolGlobalStats.ListBlockFound.Count - 1].Split(new[] { "|" }, StringSplitOptions.None)[1];
                        }
                        var    lastBlockFound      = int.Parse(ClassMiningPoolGlobalStats.CurrentBlockId) - 1;
                        string blockHash           = string.Empty;
                        string blockTimestampFound = "0";
                        string blockReward         = "0";
                        if (ClassApi.DictionaryBlockHashCache.ContainsKey(lastBlockFound))
                        {
                            blockHash           = ClassApi.DictionaryBlockHashCache[lastBlockFound];
                            blockTimestampFound = ClassApi.DictionaryBlockDateFoundCache[lastBlockFound];
                            blockReward         = ClassApi.DictionaryBlockRewardCache[lastBlockFound];
                        }
                        else
                        {
                            var blockResult = await ClassRemoteApi.GetBlockInformation("" + lastBlockFound);

                            if (blockResult != null)
                            {
                                JObject blockJson = JObject.Parse(blockResult);
                                blockHash           = blockJson["block_hash"].ToString();
                                blockTimestampFound = blockJson["block_timestamp_found"].ToString();
                                blockReward         = blockJson["block_reward"].ToString();
                                try
                                {
                                    ClassApi.DictionaryBlockHashCache.Add(lastBlockFound, blockHash);
                                }
                                catch
                                {
                                }
                                try
                                {
                                    ClassApi.DictionaryBlockDateFoundCache.Add(lastBlockFound, blockTimestampFound);
                                }
                                catch
                                {
                                }
                                try
                                {
                                    ClassApi.DictionaryBlockRewardCache.Add(lastBlockFound, blockReward);
                                }
                                catch
                                {
                                }
                            }
                            else
                            {
                                ClassLog.ConsoleWriteLog("Pool API - Warning, your Remote Node HTTP API seems to not respond !", ClassLogEnumeration.IndexPoolApiErrorLog, ClassLogConsoleEnumeration.IndexPoolConsoleRedLog, true);
                                await BuildAndSendHttpPacketAsync(ClassApiEnumeration.PacketError);
                            }
                        }
                        string miningPortInfo = string.Empty;
                        if (MiningPoolSetting.MiningPoolMiningPort.Count > 0)
                        {
                            int counter = 0;
                            foreach (var miningPort in MiningPoolSetting.MiningPoolMiningPort)
                            {
                                counter++;
                                if (counter < MiningPoolSetting.MiningPoolMiningPort.Count)
                                {
                                    miningPortInfo += miningPort.Key + "|" + miningPort.Value + ";";     // Mining port + mining difficulty;
                                }
                                else
                                {
                                    miningPortInfo += miningPort.Key + "|" + miningPort.Value;     // Mining port + mining difficulty;
                                }
                            }
                        }
                        Dictionary <string, string> poolStatsContent = new Dictionary <string, string>()
                        {
                            { "pool_hashrate", ClassMiningPoolGlobalStats.TotalMinerHashrate.ToString() },
                            { "pool_total_miner_connected", ClassMiningPoolGlobalStats.TotalMinerConnected.ToString() },
                            { "pool_total_worker_connected", ClassMiningPoolGlobalStats.TotalWorkerConnected.ToString() },
                            { "pool_total_payment", ClassMinerStats.DictionaryPoolTransaction.Count.ToString() },
                            { "pool_total_paid", ClassMiningPoolGlobalStats.PoolTotalPaid.ToString("F" + ClassConnectorSetting.MaxDecimalPlace) },
                            { "pool_total_block_found", ClassMiningPoolGlobalStats.ListBlockFound.Count.ToString() },
                            { "pool_fee", MiningPoolSetting.MiningPoolFee.ToString() },
                            { "pool_last_block_found_date", lastBlockFoundDate },
                            { "pool_mining_port_and_difficulty", miningPortInfo },
                            { "pool_minimum_payment", "" + MiningPoolSetting.MiningPoolMinimumBalancePayment },
                            { "network_height", ClassMiningPoolGlobalStats.CurrentBlockId },
                            { "network_difficulty", ClassMiningPoolGlobalStats.CurrentBlockDifficulty },
                            { "network_hashrate", networkHashrate.ToString() },
                            { "network_last_block_hash", blockHash },
                            { "network_last_block_found_timestamp", blockTimestampFound },
                            { "network_last_block_reward", blockReward }
                        };
                        await BuildAndSendHttpPacketAsync(string.Empty, true, poolStatsContent);
                    }
                    else
                    {
                        ClassLog.ConsoleWriteLog("Pool API - Warning, your Remote Node HTTP API seems to not respond !", ClassLogEnumeration.IndexPoolApiErrorLog, ClassLogConsoleEnumeration.IndexPoolConsoleRedLog, true);
                        await BuildAndSendHttpPacketAsync(ClassApiEnumeration.PacketError);
                    }
                    break;

                default:
                    await BuildAndSendHttpPacketAsync(ClassApiEnumeration.PacketNotExist);

                    break;
                }
            }
        }
        /// <summary>
        ///     Load block in cache.
        /// </summary>
        /// <returns></returns>
        public static void LoadBlockchainCache()
        {
            if (ListBlock != null)
            {
                ListBlock.Clear();
                ListBlockIndex.Clear();
            }
            else
            {
                ListBlock      = new Dictionary <string, ClassBlockObject>();
                ListBlockIndex = new Dictionary <int, string>();
            }
            OnLoad = true;
            try
            {
                Task.Factory.StartNew(() =>
                {
                    if (Directory.Exists(
                            ClassUtility.ConvertPath(AppDomain.CurrentDomain.BaseDirectory + WalletBlockCacheDirectory +
                                                     "\\")))
                    {
                        if (
                            File.Exists(ClassUtility.ConvertPath(AppDomain.CurrentDomain.BaseDirectory +
                                                                 WalletBlockCacheDirectory +
                                                                 "/blockchain" + WalletBlockCacheFileExtension)))
                        {
                            var counter = 0;
                            using (var fs =
                                       File.Open(
                                           ClassUtility.ConvertPath(AppDomain.CurrentDomain.BaseDirectory +
                                                                    WalletBlockCacheDirectory + "/blockchain" +
                                                                    WalletBlockCacheFileExtension), FileMode.Open,
                                           FileAccess.Read, FileShare.ReadWrite))
                                using (var bs = new BufferedStream(fs))
                                    using (var sr = new StreamReader(bs))
                                    {
                                        string line;
                                        while ((line = sr.ReadLine()) != null)
                                        {
                                            var blockLine = line.Split(new[] { "#" }, StringSplitOptions.None);
                                            if (!ListBlock.ContainsKey(blockLine[1]))
                                            {
                                                var blockObject = new ClassBlockObject
                                                {
                                                    BlockHeight          = blockLine[0],
                                                    BlockHash            = blockLine[1],
                                                    BlockTransactionHash = blockLine[2],
                                                    BlockTimestampCreate = blockLine[3],
                                                    BlockTimestampFound  = blockLine[4],
                                                    BlockDifficulty      = blockLine[5],
                                                    BlockReward          = blockLine[6]
                                                };

                                                ListBlock.Add(blockLine[1], blockObject);
                                                ListBlockIndex.Add(ListBlockIndex.Count, blockLine[1]);
                                                counter++;
                                            }
#if DEBUG
                                            else
                                            {
                                                Log.WriteLine("Duplicate block line: " + line);
                                            }
#endif
                                        }
                                    }
                        }
                    }
                    else
                    {
                        if (Directory.Exists(
                                ClassUtility.ConvertPath(AppDomain.CurrentDomain.BaseDirectory +
                                                         WalletBlockCacheDirectory)) ==
                            false)
                        {
                            Directory.CreateDirectory(
                                ClassUtility.ConvertPath(AppDomain.CurrentDomain.BaseDirectory +
                                                         WalletBlockCacheDirectory));
                        }

                        Directory.CreateDirectory(
                            ClassUtility.ConvertPath(AppDomain.CurrentDomain.BaseDirectory +
                                                     WalletBlockCacheDirectory));
                    }

                    OnLoad = false;
                    Program.WalletXiropht.ClassWalletObject.TotalBlockInSync = ListBlock.Count;
                }, Program.WalletXiropht.WalletCancellationToken.Token,
                                      TaskCreationOptions.DenyChildAttach, TaskScheduler.Current).ConfigureAwait(false);
            }
            catch
            {
                Program.WalletXiropht.ClassWalletObject.TotalBlockInSync = 0;
                ListBlock.Clear();
                ListBlockIndex.Clear();
                OnLoad = false;
            }
        }
        /// <summary>
        /// Insert new math combinaison
        /// </summary>
        /// <param name="combinaison"></param>
        /// <param name="idThread"></param>
        public bool InsertMathCombinaison(string combinaison, int idThread)
        {
            if (_lastDateRamCounted < DateTimeOffset.Now.ToUnixTimeSeconds())
            {
                if (Environment.OSVersion.Platform == PlatformID.Unix)
                {
                    var availbleRam = long.Parse(ClassUtility.RunCommandLineMemoryAvailable());
                    _lastDateRamCounted = DateTimeOffset.Now.ToUnixTimeSeconds() + RamCounterInterval;
                    if (availbleRam <= _ramLimitInMb)
                    {
                        return(true);
                    }
                }
                else
                {
                    float availbleRam = _ramCounter.NextValue();
                    _lastDateRamCounted = DateTimeOffset.Now.ToUnixTimeSeconds() + RamCounterInterval;
                    if (availbleRam <= _ramLimitInMb)
                    {
                        return(true);
                    }
                }
            }

            try
            {
                if (MiningListCache.Count > 0)
                {
                    bool inserted = false;
                    for (int i = 0; i < MiningListCache.Count; i++)
                    {
                        if (!inserted)
                        {
                            if (i < MiningListCache.Count)
                            {
                                if (MiningListCache[i].Count < MaxMathCombinaisonPerCache)
                                {
                                    if (MiningListCache[i].ContainsKey(combinaison))
                                    {
                                        return(false);
                                    }

                                    MiningListCache[i].Add(combinaison, idThread);
                                    inserted = true;
                                }
                            }
                        }
                    }

                    if (!inserted)
                    {
                        MiningListCache.Add(new Dictionary <string, int>());
                        if (!MiningListCache[MiningListCache.Count - 1].ContainsKey(combinaison))
                        {
                            MiningListCache[MiningListCache.Count - 1].Add(combinaison, idThread);
                            return(true);
                        }
                    }
                }
                else
                {
                    MiningListCache.Add(new Dictionary <string, int>());
                    if (!MiningListCache[0].ContainsKey(combinaison))
                    {
                        MiningListCache[0].Add(combinaison, idThread);
                        return(true);
                    }

                    return(false);
                }
            }
            catch
            {
                return(false);
            }

            return(true);
        }
示例#25
0
        public MainWindow()
        {
            InitializeComponent();

            KeyDown += VplControl.VplControl_KeyDown;
            KeyUp   += VplControl.VplControl_KeyUp;

            VplControl.ExternalNodeTypes.AddRange(
                ClassUtility.GetTypesInNamespace(Assembly.GetExecutingAssembly(), "TUM.CMS.VplControl.Test.Nodes")
                .ToList());

            VplControl.ExternalNodeTypes.AddRange(
                ClassUtility.GetTypesInNamespace(Assembly.GetAssembly(typeof(Watch3DNode)), "TUM.CMS.VplControl.Watch3D.Nodes")
                .ToList());

            VplControl.ExternalNodeTypes.AddRange(
                ClassUtility.GetTypesInNamespace(Assembly.GetAssembly(typeof(EnergyCalculatorNode)), "TUM.CMS.VplControl.Energy.Nodes")
                .ToList());
            VplControl.ExternalNodeTypes.AddRange(
                ClassUtility.GetTypesInNamespace(Assembly.GetAssembly(typeof(IfcMapsNode)), "TUM.CMS.VplControl.IFC.Nodes")
                .ToList());


            VplControl.ExternalNodeTypes.Add(typeof(ScriptingNode));
            // VplControl.ExternalNodeTypes.Add(typeof(Watch3DNode));

            VplControl.NodeTypeMode = NodeTypeModes.All;
            //VplControl.NodeTypeMode = NodeTypeModes.OnlyInternalTypes;
            VplControl.NodesFilterted = false;

            var groupNamespaces = VplControl.ExternalNodeTypes.GroupBy(u => u.Namespace).Select(grp => grp.ToList()).ToList();

            Separator separator = new Separator();

            Nodes.Items.Add(separator);

            foreach (var namespaceItem in groupNamespaces)
            {
                var namespaceNameList = namespaceItem[0].Namespace.Split('.');
                var namespaceName     = namespaceNameList[3];
                if (namespaceNameList[3] == "")
                {
                    namespaceName = namespaceNameList[2];
                }

                MenuItem namespaceMenuItem = new MenuItem();
                namespaceMenuItem.Header = namespaceName;
                namespaceMenuItem.Name   = namespaceName;
                Nodes.Items.Add(namespaceMenuItem);
                foreach (var item in namespaceItem)
                {
                    if (!item.Name.Contains("<"))
                    {
                        MenuItem tempItem1 = new MenuItem();
                        tempItem1.Header = item.Name;
                        tempItem1.Click += NodeItem_Click;
                        namespaceMenuItem.Items.Add(tempItem1);
                    }
                }
            }

            foreach (var namespaceItem in groupNamespaces)
            {
                var namespaceNameList = namespaceItem[0].Namespace.Split('.');
                var namespaceName     = namespaceNameList[3];
                if (namespaceNameList[3] == "")
                {
                    namespaceName = namespaceNameList[2];
                }

                MenuItem namespaceMenuItem = new MenuItem();
                namespaceMenuItem.Header = namespaceName;
                namespaceMenuItem.Click += ChangeNodesFilter_Click;
                SelectShownNodes.Items.Add(namespaceMenuItem);
            }

            Separator separator1 = new Separator();

            SelectShownNodes.Items.Add(separator1);

            MenuItem namespaceMenuItem1 = new MenuItem();

            namespaceMenuItem1.Header = "All";
            namespaceMenuItem1.Click += ChangeNodesFilter_Click;
            SelectShownNodes.Items.Add(namespaceMenuItem1);


            string dirPath = Directory.GetParent(Directory.GetCurrentDirectory()) + "\\Templates\\";

            string[] files = Directory.GetFiles(dirPath);


            foreach (var file in files)
            {
                FileInfo       info       = new FileInfo(file);
                FileAttributes attributes = info.Attributes;
                if (info.Extension.ToUpper() == ".VPLXML")
                {
                    MenuItem menuItem = new MenuItem();

                    menuItem.Header = Path.GetFileNameWithoutExtension(info.Name);
                    menuItem.Click += OpenTemplateNode;
                    NodesTemplate.Items.Add(menuItem);
                }
            }
        }
        /// <summary>
        /// Generates the 'find' method.
        /// </summary>
        /// <param name="file">The file.</param>
        /// <param name="classMap">The class map.</param>
        public override void GenerateFind(StreamWriter file, IClassMap classMap)
        {
            ArrayList primaryColumns = classMap.GetTableMap().GetPrimaryKeyColumnMaps();

            StringBuilder whereQuery = new StringBuilder();
            StringBuilder findParams = new StringBuilder();
            bool          first      = true;

            foreach (IColumnMap primColumn in primaryColumns)
            {
                IPropertyMap propertyMap = classMap.GetPropertyMapForColumnMap(primColumn);

                if (!first)
                {
                    whereQuery.Append(", ");
                    findParams.Append(", ");
                }

                whereQuery
                .Append('`')
                .Append(primColumn.Name)
                .Append("`='\" + m_state.EscapeString(")
                .Append(ClassUtility.GetParamName(propertyMap))
                .Append(".ToString()) + \"'");

                string paramName = ClassUtility.GetParamName(propertyMap);
                string paramType = ClassUtility.ConvertColumnTypeToCsType(primColumn.DataType);

                findParams.Append(paramType + " " + paramName);

                first = false;
            }

            string entityClassName = EntityGenerator.GetTypeName(classMap);
            string sqlCommand      = "SELECT \" + c_rowFields + \""
                                     + " FROM `" + classMap.GetTableMap().Name + "`"
                                     + " WHERE " + whereQuery.ToString();

            file.WriteLine("		public virtual "+ entityClassName + " Find(" + findParams.ToString() + ")");
            file.WriteLine("		{");
            file.WriteLine("			"+ entityClassName + " result = new " + entityClassName + "();");
            file.WriteLine("			string command = \""+ sqlCommand + "\";");
            file.WriteLine();
            file.WriteLine("			m_state.ExecuteQuery(");
            file.WriteLine("				command,");
            file.WriteLine("				CommandBehavior.SingleRow,");
            file.WriteLine("				delegate(MySqlDataReader reader)");
            file.WriteLine("				{");
            file.WriteLine("					if (!reader.Read())");
            file.WriteLine("					{");
            file.WriteLine("						result = null;");
            file.WriteLine("					}");
            file.WriteLine("					else");
            file.WriteLine("					{");
            file.WriteLine("						FillEntityWithRow(ref result, reader);");
            file.WriteLine("					}");
            file.WriteLine("				}");
            file.WriteLine("			);");
            file.WriteLine();
            file.WriteLine("			return result;");
            file.WriteLine("		}");
            file.WriteLine();
        }
示例#27
0
        /// <summary>
        /// Create the log directory and log files if they not exist.
        /// </summary>
        private static bool LogInitializationFile()
        {
            if (Directory.Exists(ClassUtility.ConvertPath(AppDomain.CurrentDomain.BaseDirectory + LogDirectory)) == false)
            {
                Directory.CreateDirectory(ClassUtility.ConvertPath(AppDomain.CurrentDomain.BaseDirectory + LogDirectory));
                return(false);
            }

            if (!File.Exists(ClassUtility.ConvertPath(AppDomain.CurrentDomain.BaseDirectory + LogPoolGeneralError)))
            {
                File.Create(ClassUtility.ConvertPath(AppDomain.CurrentDomain.BaseDirectory + LogPoolGeneralError)).Close();
                return(false);
            }
            if (!File.Exists(ClassUtility.ConvertPath(AppDomain.CurrentDomain.BaseDirectory + LogPoolGeneral)))
            {
                File.Create(ClassUtility.ConvertPath(AppDomain.CurrentDomain.BaseDirectory + LogPoolGeneral)).Close();
                return(false);
            }
            if (!File.Exists(ClassUtility.ConvertPath(AppDomain.CurrentDomain.BaseDirectory + LogPoolFilteringError)))
            {
                File.Create(ClassUtility.ConvertPath(AppDomain.CurrentDomain.BaseDirectory + LogPoolFilteringError)).Close();
                return(false);
            }
            if (!File.Exists(ClassUtility.ConvertPath(AppDomain.CurrentDomain.BaseDirectory + LogPoolFiltering)))
            {
                File.Create(ClassUtility.ConvertPath(AppDomain.CurrentDomain.BaseDirectory + LogPoolFiltering)).Close();
                return(false);
            }
            if (!File.Exists(ClassUtility.ConvertPath(AppDomain.CurrentDomain.BaseDirectory + LogPoolMinerCheckStatsError)))
            {
                File.Create(ClassUtility.ConvertPath(AppDomain.CurrentDomain.BaseDirectory + LogPoolMinerCheckStatsError)).Close();
                return(false);
            }
            if (!File.Exists(ClassUtility.ConvertPath(AppDomain.CurrentDomain.BaseDirectory + LogPoolMinerCheckStats)))
            {
                File.Create(ClassUtility.ConvertPath(AppDomain.CurrentDomain.BaseDirectory + LogPoolMinerCheckStats)).Close();
                return(false);
            }
            if (!File.Exists(ClassUtility.ConvertPath(AppDomain.CurrentDomain.BaseDirectory + LogPoolPaymentError)))
            {
                File.Create(ClassUtility.ConvertPath(AppDomain.CurrentDomain.BaseDirectory + LogPoolPaymentError)).Close();
                return(false);
            }
            if (!File.Exists(ClassUtility.ConvertPath(AppDomain.CurrentDomain.BaseDirectory + LogPoolPayment)))
            {
                File.Create(ClassUtility.ConvertPath(AppDomain.CurrentDomain.BaseDirectory + LogPoolPayment)).Close();
                return(false);
            }
            if (!File.Exists(ClassUtility.ConvertPath(AppDomain.CurrentDomain.BaseDirectory + LogPoolWalletError)))
            {
                File.Create(ClassUtility.ConvertPath(AppDomain.CurrentDomain.BaseDirectory + LogPoolWalletError)).Close();
                return(false);
            }
            if (!File.Exists(ClassUtility.ConvertPath(AppDomain.CurrentDomain.BaseDirectory + LogPoolWallet)))
            {
                File.Create(ClassUtility.ConvertPath(AppDomain.CurrentDomain.BaseDirectory + LogPoolWallet)).Close();
                return(false);
            }
            if (!File.Exists(ClassUtility.ConvertPath(AppDomain.CurrentDomain.BaseDirectory + LogPoolApiError)))
            {
                File.Create(ClassUtility.ConvertPath(AppDomain.CurrentDomain.BaseDirectory + LogPoolApiError)).Close();
                return(false);
            }
            if (!File.Exists(ClassUtility.ConvertPath(AppDomain.CurrentDomain.BaseDirectory + LogPoolApi)))
            {
                File.Create(ClassUtility.ConvertPath(AppDomain.CurrentDomain.BaseDirectory + LogPoolApi)).Close();
                return(false);
            }
            return(true);
        }
示例#28
0
        /// <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>
        ///     Load transMethodInvoker in cache.
        /// </summary>
        /// <param name="walletAddress"></param>
        /// <returns></returns>
        public static void LoadWalletCache(string walletAddress)
        {
            if (ListTransaction != null)
            {
                ListTransaction.Clear();
            }
            else
            {
                ListTransaction = new Dictionary <string, ClassWalletTransactionObject>();
            }
            if (!string.IsNullOrEmpty(walletAddress))
            {
                OnLoad = true;
                try
                {
                    Task.Factory.StartNew(() =>
                    {
                        if (Directory.Exists(
                                ClassUtility.ConvertPath(AppDomain.CurrentDomain.BaseDirectory +
                                                         WalletTransMethodInvokerCacheDirectory + walletAddress +
                                                         "\\")))
                        {
                            if (File.Exists(ClassUtility.ConvertPath(
                                                AppDomain.CurrentDomain.BaseDirectory + WalletTransMethodInvokerCacheDirectory +
                                                walletAddress + "\\" + WalletTransMethodInvokerCacheFileExtension)))
                            {
                                byte[] AesKeyIv = null;
                                byte[] AesSalt  = null;
                                using (var password = new PasswordDeriveBytes(
                                           Program.WalletXiropht.ClassWalletObject.WalletConnect.WalletAddress +
                                           Program.WalletXiropht.ClassWalletObject.WalletConnect.WalletKey,
                                           ClassUtils.GetByteArrayFromString(ClassUtils.FromHex(
                                                                                 (Program.WalletXiropht.ClassWalletObject.WalletConnect.WalletAddress +
                                                                                  Program.WalletXiropht.ClassWalletObject.WalletConnect.WalletKey)
                                                                                 .Substring(0, 8)))))
                                {
                                    AesKeyIv = password.GetBytes(
                                        ClassConnectorSetting.MAJOR_UPDATE_1_SECURITY_CERTIFICATE_SIZE / 8);
                                    AesSalt = password.GetBytes(16);
                                }

                                var listTransactionEncrypted = new List <string>();
                                using (var fs = File.Open(
                                           ClassUtility.ConvertPath(AppDomain.CurrentDomain.BaseDirectory +
                                                                    WalletTransMethodInvokerCacheDirectory +
                                                                    walletAddress +
                                                                    "\\" + WalletTransMethodInvokerCacheFileExtension),
                                           FileMode.Open, FileAccess.Read, FileShare.Read))
                                    using (var bs = new BufferedStream(fs))
                                        using (var sr = new StreamReader(bs))
                                        {
                                            string line;
                                            while ((line = sr.ReadLine()) != null)
                                            {
                                                listTransactionEncrypted.Add(line);
                                            }
                                        }

                                if (listTransactionEncrypted.Count > 0)
                                {
                                    var line = 0;
                                    foreach (var transactionEncrypted in listTransactionEncrypted)
                                    {
                                        line++;
                                        var walletTransactionDecrypted =
                                            ClassAlgo.GetDecryptedResult(ClassAlgoEnumeration.Rijndael,
                                                                         transactionEncrypted, ClassWalletNetworkSetting.KeySize, AesKeyIv,
                                                                         AesSalt);
                                        if (walletTransactionDecrypted != ClassAlgoErrorEnumeration.AlgoError)
                                        {
                                            var splitTransaction =
                                                walletTransactionDecrypted.Split(new[] { "#" },
                                                                                 StringSplitOptions.None);
                                            if (!ListTransaction.ContainsKey(splitTransaction[1]))
                                            {
                                                var splitBlockchainHeight = splitTransaction[7]
                                                                            .Split(new[] { "~" }, StringSplitOptions.None);

                                                var transactionObject = new ClassWalletTransactionObject
                                                {
                                                    TransactionType          = splitTransaction[0],
                                                    TransactionHash          = splitTransaction[1],
                                                    TransactionWalletAddress = splitTransaction[2],
                                                    TransactionAmount        =
                                                        decimal.Parse(
                                                            splitTransaction[3].ToString(Program.GlobalCultureInfo),
                                                            NumberStyles.Currency, Program.GlobalCultureInfo),
                                                    TransactionFee = decimal.Parse(
                                                        splitTransaction[4].ToString(Program.GlobalCultureInfo),
                                                        NumberStyles.Currency, Program.GlobalCultureInfo),
                                                    TransactionTimestampSend    = long.Parse(splitTransaction[5]),
                                                    TransactionTimestampRecv    = long.Parse(splitTransaction[6]),
                                                    TransactionBlockchainHeight =
                                                        splitBlockchainHeight[0].Replace("{", "")
                                                };
                                                ListTransaction.Add(splitTransaction[1], transactionObject);

                                                Program.WalletXiropht.UpdateLabelSyncInformation(
                                                    "On load transaction database - total transactions loaded and decrypted: " +
                                                    (ListTransaction.Count + ClassWalletTransactionAnonymityCache
                                                     .ListTransaction.Count));
                                            }
#if DEBUG
                                            else
                                            {
                                                Log.WriteLine("Duplicate anonymous transaction: " + walletTransactionDecrypted);
                                            }
#endif
                                        }

#if DEBUG
                                        else
                                        {
                                            Log.WriteLine("Wrong transaction at line: " + line);
                                        }
#endif
                                    }
                                }

                                listTransactionEncrypted.Clear();
                                Program.WalletXiropht.ClassWalletObject.TotalTransactionInSync =
                                    ListTransaction.Count;
                                AesKeyIv = null;
                                AesSalt  = null;
                            }
                            else
                            {
                                File.Create(ClassUtility.ConvertPath(
                                                AppDomain.CurrentDomain.BaseDirectory + WalletTransMethodInvokerCacheDirectory +
                                                walletAddress + "\\" + WalletTransMethodInvokerCacheFileExtension)).Close();
                            }
                        }
                        else
                        {
                            if (Directory.Exists(ClassUtility.ConvertPath(
                                                     AppDomain.CurrentDomain.BaseDirectory +
                                                     WalletTransMethodInvokerCacheDirectory)) ==
                                false)
                            {
                                Directory.CreateDirectory(ClassUtility.ConvertPath(
                                                              AppDomain.CurrentDomain.BaseDirectory +
                                                              WalletTransMethodInvokerCacheDirectory));
                            }

                            Directory.CreateDirectory(ClassUtility.ConvertPath(
                                                          AppDomain.CurrentDomain.BaseDirectory + WalletTransMethodInvokerCacheDirectory +
                                                          walletAddress));
                        }

                        Program.WalletXiropht.ClassWalletObject.TotalTransactionInSync = ListTransaction.Count;
                        OnLoad = false;
                    }, Program.WalletXiropht.WalletCancellationToken.Token,
                                          TaskCreationOptions.DenyChildAttach, TaskScheduler.Current).ConfigureAwait(false);
                }
                catch
                {
                    Program.WalletXiropht.ClassWalletObject.TotalTransactionInSync = 0;
                    ListTransaction.Clear();
                    OnLoad = false;
                }
            }
        }
示例#30
0
        /// <summary>
        /// Start to listen incoming client.
        /// </summary>
        /// <returns></returns>
        public async Task StartHandleClientHttpAsync()
        {
            var isWhitelisted = true;

            if (ClassFilteringMiner.CheckMinerIsBannedByIP(_ip))
            {
                isWhitelisted = false;
            }
            int totalWhile = 0;

            if (isWhitelisted)
            {
                await Task.Run(() => MaxKeepAliveFunctionAsync()).ConfigureAwait(false);

                try
                {
                    while (_clientStatus)
                    {
                        try
                        {
                            using (CancellationTokenSource cancellationPacket = new CancellationTokenSource(1000))
                            {
                                using (NetworkStream clientHttpReader = new NetworkStream(_client.Client))
                                {
                                    using (BufferedStream bufferedStreamNetwork = new BufferedStream(clientHttpReader, ClassConnectorSetting.MaxNetworkPacketSize))
                                    {
                                        byte[] buffer = new byte[ClassConnectorSetting.MaxNetworkPacketSize];

                                        int received = await bufferedStreamNetwork.ReadAsync(buffer, 0, buffer.Length);

                                        if (received > 0)
                                        {
                                            string packet = Encoding.UTF8.GetString(buffer, 0, received);
                                            try
                                            {
                                                if (!GetAndCheckForwardedIp(packet))
                                                {
                                                    break;
                                                }
                                            }
                                            catch
                                            {
                                            }

                                            packet = ClassUtility.GetStringBetween(packet, "GET /", "HTTP");
                                            packet = packet.Replace("%7C", "|"); // Translate special character |
                                            packet = packet.Replace(" ", "");    // Remove empty,space characters
                                            ClassLog.ConsoleWriteLog("HTTP API - packet received from IP: " + _ip + " - " + packet, ClassLogEnumeration.IndexPoolApiLog, ClassLogConsoleEnumeration.IndexPoolConsoleYellowLog);


                                            await HandlePacketHttpAsync(packet);

                                            break;
                                        }
                                        else
                                        {
                                            totalWhile++;
                                        }
                                        if (totalWhile >= 8)
                                        {
                                            break;
                                        }
                                    }
                                }
                            }
                        }
                        catch (Exception error)
                        {
                            ClassLog.ConsoleWriteLog("HTTP API - exception error: " + error.Message, ClassLogEnumeration.IndexPoolApiErrorLog, ClassLogConsoleEnumeration.IndexPoolConsoleRedLog);
                            break;
                        }
                    }
                }
                catch
                {
                }
            }
            CloseClientConnection();
        }