Esempio n. 1
0
        public void Receive(SocketDataBody data)
        {
            if (data.Type == SocketDataType.Receive)
            {
                if (data.Body != string.Empty && data.Body != "deep-sync")
                {
                    var newBlocks = JsonConvert.DeserializeObject <Block[]>(data.Body).ToList();

                    this.blockchain.RemoveBlockInterval(newBlocks.First().Index, newBlocks.Last().Index);

                    foreach (var block in newBlocks)
                    {
                        this.blockchain.AddBlock(block);
                    }

                    Console.WriteLine("End syncing...");
                }
                else if (data.Body == "deep-sync")
                {
                    Console.WriteLine("Start deep sync procedure...");
                    var ip   = data.NodesPair.Item2.Split(':')[0];
                    var port = int.Parse(data.NodesPair.Item2.Split(':')[1]);

                    CommandFabric.RunDynamic($"deep-sync -ip {ip} -p {port}");
                }
                else
                {
                    Console.WriteLine("Already is up-to-date...");
                }
            }
        }
Esempio n. 2
0
        public string Aggregate(SocketDataBody data)
        {
            var block = JsonConvert.DeserializeObject <Block>(data.Body);

            if (block.Index == this.blockchain.LastBlock.Index &&
                block.BlockHash == this.blockchain.LastBlock.BlockHash)
            {
                Console.WriteLine("All is synced...");
                return(string.Empty);
            }
            else
            {
                if (block.Index > this.blockchain.LastBlock.Index)
                {
                    var ip   = data.NodesPair.Item1.Split(':')[0];
                    var port = int.Parse(data.NodesPair.Item1.Split(':')[1]);

                    CommandFabric.RunDynamic($"sync -ip {ip} -p {port}");

                    return(string.Empty);
                }
                else
                {
                    return("sync");
                    //return JsonConvert.SerializeObject(this.blockchain.Blocks.Where(b => b.Index != 0).ToArray());
                }
            }
        }
Esempio n. 3
0
        public string Aggregate(SocketDataBody data)
        {
            try
            {
                Console.WriteLine("Sync aggregate");
                var lastBlockInfo  = JsonConvert.DeserializeObject <Tuple <int, string> >(data.Body);
                var lastBlockIndex = lastBlockInfo.Item1;
                var lastBlockHash  = lastBlockInfo.Item2;

                if (lastBlockIndex <= this.blockchain.LastBlock.Index && this.blockchain.Blocks[lastBlockIndex].BlockHash == lastBlockHash)
                {
                    var blocks = this.blockchain.Blocks.GetRange(lastBlockIndex,
                                                                 (this.blockchain.Blocks.Count - lastBlockIndex)).ToArray();

                    return(JsonConvert.SerializeObject(blocks));
                }
                else if (lastBlockIndex <= this.blockchain.LastBlock.Index && this.blockchain.Blocks[lastBlockIndex].BlockHash != lastBlockHash)
                {
                    Console.WriteLine("Another node must deep sync...");

                    return("deep-sync");
                }
                else
                {
                    return(string.Empty);
                }
            }
            catch
            {
                return(string.Empty);
            }
        }
        public void ReceiveResponse(SocketDataBody data)
        {
            var commandName = data.CommandName;

            var command = CommandsReflector.GetGlobalCommand(commandName).Item1;

            command.Receive(data);
        }
Esempio n. 5
0
        public string Aggregate(SocketDataBody data)
        {
            var    port     = AsyncListener.Port;
            string hostName = Dns.GetHostName(); // Retrive the Name of HOST
            var    ips      = Dns.GetHostByName(hostName).AddressList;
            string ip       = ips[ips.Length - 1].ToString();

            return($"{ip}:{port}");
        }
Esempio n. 6
0
        public void Receive(SocketDataBody data)
        {
            if (data.Type == SocketDataType.Send)
            {
                var transaction = JsonConvert.DeserializeObject <Transaction>(data.Body);

                this.blockchain.AddTransaction(transaction);
            }
        }
Esempio n. 7
0
        public void Receive(SocketDataBody data)
        {
            if (data.Type == SocketDataType.Receive)
            {
                if (data.Body != string.Empty)
                {
                    var newBlocks = JsonConvert.DeserializeObject <Block[]>(data.Body).ToList();

                    this.blockchain.RemoveBlockInterval(newBlocks.First().Index, newBlocks.Last().Index);

                    foreach (var block in newBlocks)
                    {
                        this.blockchain.AddBlock(block);
                    }
                }
            }
        }
Esempio n. 8
0
        public void Receive(SocketDataBody data)
        {
            if (data.Type == SocketDataType.Receive && data.Body != null)
            {
                var ip   = data.Body.Split(':')[0];
                var port = int.Parse(data.Body.Split(':')[1]);

                var isAdded = this.blockchain.RegisterNode(ip, port);

                if (isAdded)
                {
                    Console.WriteLine($"{ip}:{port}");
                    Console.WriteLine("Peer added successfully...");
                }
                else
                {
                    Console.WriteLine("Cannot add peer...");
                }
            }

            Console.WriteLine("Receive connection...");
            Console.WriteLine($"Command: {data.CommandName}, Body: {data.Body}");
        }
Esempio n. 9
0
        public string Aggregate(SocketDataBody data)
        {
            var blockHashes = JsonConvert.DeserializeObject <string[]>(data.Body).ToList();

            blockHashes.Reverse();

            foreach (var blockHash in blockHashes)
            {
                var block = this.blockchain.Blocks.FirstOrDefault(b => b.BlockHash == blockHash);

                if (block != null)
                {
                    var lastValidBlockIndex = block.Index;

                    var blocks = this.blockchain.Blocks.GetRange(lastValidBlockIndex,
                                                                 (this.blockchain.Blocks.Count - lastValidBlockIndex)).ToArray();

                    return(JsonConvert.SerializeObject(blocks));
                }
            }

            return(string.Empty);
        }
Esempio n. 10
0
        public void MakeRequest(string commandName, string[] args, IGlobalCommand command, Commands.Attributes.Command attribute)
        {
            var template = attribute.Template;
            var body     = command.Send(args);
            var targets  = command.GetTargets(args);

            string hostName = Dns.GetHostName(); // Retrive the Name of HOST
            var    ips      = Dns.GetHostByName(hostName).AddressList;
            string ip       = ips[ips.Length - 1].ToString();

            foreach (var target in targets)
            {
                var socket = client.StartSocket(target.Item1, target.Item2);

                if (!AsyncClient.CanConnect)
                {
                    Console.WriteLine($"Cannot connect to {target.Item1}:{target.Item2}");
                    continue;
                }

                var data = new SocketDataBody()
                {
                    CommandName = commandName,
                    Body        = body,
                    Type        = SocketDataType.Send,
                    NodesPair   = new Tuple <string, string>($"{ip}:{AsyncListener.Port}", $"{target.Item1.ToString()}:{target.Item2}")
                };

                client.Send(socket, data);
                AsyncClient.sendDone.WaitOne();

                client.Receive(socket);
                AsyncClient.receiveDone.WaitOne();

                //client.StopSocket(socket);
            }
        }
Esempio n. 11
0
 public string Aggregate(SocketDataBody body)
 {
     return("Done");
 }
Esempio n. 12
0
        public void Receive(SocketDataBody data)
        {
            Console.WriteLine($"{data.NodesPair.Item1} -> {data.NodesPair.Item2}");
            if (data.Type == SocketDataType.Send)
            {
                var block = JsonConvert.DeserializeObject <Block>(data.Body);

                if (block.Index == this.blockchain.LastBlock.Index + 1 &&
                    block.PreviousBlockHash == this.blockchain.LastBlock.BlockHash)
                {
                    string lastBlockHash = this.blockchain.LastBlock.BlockHash;
                    int    nonce         = block.Nonce;
                    string winnerHash    = CryptographyUtilities.BytesToHex(CryptographyUtilities.CalcSHA256($"{lastBlockHash}{nonce}"));

                    if (!winnerHash.ToCharArray().Take(this.blockchain.Difficulty).All(s => s == '0'))
                    {
                        Console.WriteLine("Incorrect hash...");
                        return;
                    }

                    this.blockchain.AddBlock(block);
                }
                else
                {
                    if (block.Index <= this.blockchain.LastBlock.Index)
                    {
                        Console.WriteLine("Other node is not synced...");
                    }
                    else
                    {
                        Console.WriteLine("This node is not synced...");

                        var ip   = data.NodesPair.Item1.Split(':')[0];
                        var port = int.Parse(data.NodesPair.Item1.Split(':')[1]);

                        CommandFabric.RunDynamic($"sync -ip {ip} -p {port}");
                    }
                }
            }
            else if (data.Type == SocketDataType.Receive)
            {
                if (data.Body == "sync")
                {
                    var ip   = data.NodesPair.Item2.Split(':')[0];
                    var port = int.Parse(data.NodesPair.Item2.Split(':')[1]);

                    CommandFabric.RunDynamic($"sync -ip {ip} -p {port}");
                }
                //if (data.Body != string.Empty)
                //{
                //    var newBlocks = JsonConvert.DeserializeObject<Block[]>(data.Body).ToList();

                //    this.blockchain.RemoveBlockInterval(newBlocks.First().Index, newBlocks.Last().Index);

                //    foreach (var block in newBlocks)
                //    {
                //        this.blockchain.AddBlock(block);
                //    }
                //}
            }
        }