Example #1
0
        public bool MakeBlock(OleDbConnection connection, string HashId)
        {
            //ВЫбор ззаголовка блока из PoolBlock по хэшу
            string    SQLCMD         = String.Format("SELECT * FROM PoolBlock WHERE [Hash] = '{0}'", HashId);
            DataTable TablePoolBlock = SelectToConnect(connection, SQLCMD);

            PoolBlock block = new PoolBlock(Convert.ToInt32(TablePoolBlock.Rows[0]["ID"]), TablePoolBlock.Rows[0]["Hash"].ToString(),
                                            TablePoolBlock.Rows[0]["HashList"].ToString(), TablePoolBlock.Rows[0]["Data"].ToString());

            string HASHList = block.HashList;
            string HASH     = block.Hash;

            //Плучние ПревХэш
            SQLCMD = "SELECT TOP 1 * FROM BlockList ORDER BY ID DESC";

            DataTable table = SelectToConnect(connection, SQLCMD);

            string PrevHASH = "";

            if (table.Rows.Count == 1)
            {
                PrevHASH = table.Rows[table.Rows.Count - 1]["Hash"].ToString();
            }

            //Запись заголовка блока в BlockList
            SQLCMD = String.Format("INSERT INTO BlockList (PrevHash, Hash, Data) VALUES ('{0}', '{1}', '{2}')", PrevHASH, HASH, block.Data);
            EditToConnect(connection, SQLCMD);

            //Удаление заголовка блока из PoolBlock
            SQLCMD = String.Format("DELETE * FROM PoolBlock WHERE [Hash] = '{0}'", HASH);
            EditToConnect(connection, SQLCMD);

            return(true);
        }
Example #2
0
        private static void TimerTick(object sender, ElapsedEventArgs e, out PoolBlock listOut, Transaction[] transactions, Timer timer,
                                      out Timer timerOut)
        {
            PoolBlock blockList = new PoolBlock();

            for (int i = 0; i < transactions.Count(); i++)
            {
                blockList.Hash     += transactions[i].Hash;
                blockList.HashList += (i < transactions.Count() - 1) ? transactions[i].Hash + ":" : transactions[i].Hash;
            }
            listOut          = blockList;
            timerOut         = timer;
            timerOut.Enabled = false;
        }
Example #3
0
        public static void SetSignature(OleDbConnection connection, string privateKey, string publicKey)
        {
            DataTable dataTable = PoolBlock.SelectToConnect(connection, "SELECT * FROM PoolBlock");

            PoolBlock[] poolBlockLists = new PoolBlock[dataTable.Rows.Count];

            for (int i = 0; i < dataTable.Rows.Count; i++)
            {
                poolBlockLists[i] = new PoolBlock(Convert.ToInt32(dataTable.Rows[i]["ID"]), dataTable.Rows[i]["Hash"].ToString(), dataTable.Rows[i]["Data"].ToString(),
                                                  dataTable.Rows[i]["HashList"].ToString());
            }

            foreach (PoolBlock poolBlockList in poolBlockLists)
            {
                string[] arr_string = Regex.Split(poolBlockList.Data, "/?[:;]");

                bool flag = false;

                string MD5PK      = RSA.GetMd5Hash(publicKey);
                string SignedHash = Convert.ToBase64String(RSA.SignData(RSA.hashedText(poolBlockList.Hash), privateKey));

                foreach (string str in arr_string)
                {
                    if (str == MD5PK)
                    {
                        flag = true;
                        break;
                    }
                }

                if ((arr_string.Count() - 1) == 4 && flag == false)
                {
                    poolBlockList.Data += String.Format("{0}:{1};", SignedHash, MD5PK);
                    EditToConnect(connection, String.Format("UPDATE PoolBlock SET Data = '{0}' WHERE [Hash] = '{1}'", poolBlockList.Data, poolBlockList.Hash));
                    Block block = new Block();
                    block.MakeBlock(connection, poolBlockList.Hash);
                }
                else if ((arr_string.Count() - 1) <= 2 && flag == false)
                {
                    poolBlockList.Data += String.Format("{0}:{1};", SignedHash, MD5PK);
                    EditToConnect(connection, String.Format("UPDATE PoolBlock SET Data = '{0}' WHERE [Hash] = '{1}'", poolBlockList.Data, poolBlockList.Hash));
                }
            }
        }
Example #4
0
        public static bool MakePoolBlock(OleDbConnection connection, Transaction[] transactions, string privateKey, string publicKey)
        {
            Transaction pool      = new Transaction();
            PoolBlock   blockList = new PoolBlock();
            Timer       timer     = new Timer(10000);

            timer.Elapsed     += (sender, e) => TimerTick(sender, e, out blockList, transactions, timer, out timer);
            blockList.Hash     = null;
            blockList.HashList = null;
            timer.Enabled      = true;
            while (true)
            {
                transactions = pool.GetTransaction(connection);
                if (transactions.Count() >= 20)
                {
                    timer.Enabled = false;
                    timer.Dispose();
                    for (int i = 0; i < 20; i++)
                    {
                        blockList.Hash     += transactions[i].Hash;
                        blockList.HashList += (i < 19) ? transactions[i].Hash + ":" : transactions[i].Hash;
                    }
                    break;
                }
                if (!timer.Enabled && transactions.Count() == 0)
                {
                    Console.Write("\nНет транзакций\n{0}> ", ConfigurationManager.AppSettings["username"]);
                    timer.Enabled = true;
                }
                else if (!timer.Enabled && transactions.Count() != 0)
                {
                    timer.Dispose();
                    break;
                }
                System.Threading.Thread.Sleep(500);
            }
            blockList.Hash = RSA.GetMd5Hash(blockList.Hash);

            string MD5PK = RSA.GetMd5Hash(publicKey);


            string Hash       = blockList.Hash;
            string SignedHash = Convert.ToBase64String(RSA.SignData(RSA.hashedText(blockList.Hash), privateKey));
            string HashList   = blockList.HashList;



            //Создание таблицы с названием которо хранитьсяв Hash
            string SQLCMD = "CREATE TABLE " + Hash + "([ID] INT NOT NULL PRIMARY KEY, [Sender] VARCHAR(255) NULL, [Level] VARCHAR(255) NULL, [Hash] VARCHAR(255) NULL, [SignedHash] TEXT NULL, [Data] TEXT NULL)";

            EditToConnect(connection, SQLCMD);

            string[] HashList_array = Regex.Split(HashList, ":");

            SQLCMD = "SELECT * FROM Transaction WHERE";

            for (int i = 0; i < HashList_array.Count(); i++)
            {
                SQLCMD += " [Hash] = '" + HashList_array[i] + "'";

                if (i != HashList_array.Count() - 1)
                {
                    SQLCMD = SQLCMD + " OR";
                }
            }

            DataTable TableTransacationOnBlock = SelectToConnect(connection, SQLCMD);

            Transaction[] transaction = new Transaction[TableTransacationOnBlock.Rows.Count];
            for (int i = 0; i < TableTransacationOnBlock.Rows.Count; i++)
            {
                transaction[i] = new Transaction(Convert.ToInt32(TableTransacationOnBlock.Rows[i]["ID"]), TableTransacationOnBlock.Rows[i]["Sender"].ToString(),
                                                 TableTransacationOnBlock.Rows[i]["Level"].ToString(), TableTransacationOnBlock.Rows[i]["Hash"].ToString(),
                                                 TableTransacationOnBlock.Rows[i]["SignedHash"].ToString(), TableTransacationOnBlock.Rows[i]["Data"].ToString());
            }


            //Запись данных в тело блока (тело блока создано выше)
            for (int i = 0; i < transaction.Count(); i++)
            {
                SQLCMD = String.Format("INSERT INTO {0} (ID, Sender, Level, Hash, SignedHash, Data) VALUES ('{1}', '{2}', '{3}', '{4}', '{5}', '{6}')",
                                       Hash, transaction[i].ID, transaction[i].Sender, transaction[i].Level, transaction[i].Hash, transaction[i].SignedHash, transaction[i].Data);
                EditToConnect(connection, SQLCMD);
            }

            //Удаление группы транзакций по списку хэшей
            SQLCMD = "DELETE * FROM Transaction WHERE";

            for (int i = 0; i < HashList_array.Count(); i++)
            {
                SQLCMD += " [Hash] = '" + HashList_array[i] + "'";

                if (i != HashList_array.Count() - 1)
                {
                    SQLCMD += " OR";
                }
            }

            EditToConnect(connection, SQLCMD);

            blockList.Data += String.Format("{0}:{1};", SignedHash, MD5PK);

            try
            {
                connection.Open();

                OleDbCommand command = connection.CreateCommand();
                command.CommandText = string.Format("INSERT INTO PoolBlock (Hash, Data, HashList) VALUES ('{0}', '{1}', '{2}')", blockList.Hash, blockList.Data, blockList.HashList);

                OleDbTransaction trans = connection.BeginTransaction();

                command.Transaction = trans;
                command.ExecuteNonQuery();
                trans.Commit();

                connection.Close();
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex);
                return(false);
            }

            return(true);
        }