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..."); } } }
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()); } } }
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); }
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}"); }
public void Receive(SocketDataBody data) { if (data.Type == SocketDataType.Send) { var transaction = JsonConvert.DeserializeObject <Transaction>(data.Body); this.blockchain.AddTransaction(transaction); } }
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); } } } }
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}"); }
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); }
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); } }
public string Aggregate(SocketDataBody body) { return("Done"); }
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); // } //} } }