private void receivedBlocksMessage(string address, int port, BlocksMsg msg) { foreach (var block in msg.Blocks) { this.saveBlockToDB(block); if (this.blocksInSynchronizing.ContainsKey(block.Header.Height)) { blocksInSynchronizing.Remove(block.Header.Height); } if (this.newBlocksInDownloading.Contains(block.Header.Height)) { var nodes = this.p2pComponent.GetNodes(); var newMsg = new NewBlockMsg(); newMsg.Header = block.Header; //Broadcast to other node foreach (var node in nodes) { if (node.IsConnected && !node.IsTrackerServer && node.IP != address) { var cmd = P2PCommand.CreateCommand(this.Identity.ToString(), CommandNames.Block.NewBlock, newMsg); this.p2pComponent.SendCommand(node.IP, node.Port, cmd); } } newBlocksInDownloading.Remove(block.Header.Height); } } }
private void receivedNewBlockMessage(string address, int port, NewBlockMsg msg, int nonce) { if (RemoteLatestHeight - LocalHeight <= 10 && msg.Header.Height - LocalHeight <= 10 && !this.tempBlockList.Any(b => b.Header.Height == msg.Header.Height) && !this.blockComponent.CheckBlockExists(msg.Header.Hash)) { if (!this.newBlocksInDownloading.Contains(msg.Header.Height) && !blockedBlockHashList.Contains(msg.Header.Hash)) { this.newBlocksInDownloading.Add(msg.Header.Height); var payload = new GetBlocksMsg(); payload.Heights.Add(msg.Header.Height); var cmd = P2PCommand.CreateCommand(this.Identity.ToString(), CommandNames.Block.GetBlocks, nonce, payload); this.p2pComponent.SendCommand(address, port, cmd); } } }
public void BroadcastNewBlockMessage(BlockHeaderMsg blockHeader) { var nodes = this.p2pComponent.GetNodes(); foreach (var node in nodes) { if (node.IsConnected && !node.IsTrackerServer) { var payload = new NewBlockMsg(); payload.Header = blockHeader; var cmd = P2PCommand.CreateCommand(this.Identity.ToString(), CommandNames.Block.NewBlock, payload); this.p2pComponent.SendCommand(node.IP, node.Port, cmd); } } }
private void receivedNewBlockMessage(string address, int port, NewBlockMsg msg, int nonce) { if (this.blockComponent.GetBlockMsgByHash(msg.Header.Hash) == null) { if (!this.newBlocksInDownloading.Contains(msg.Header.Height)) { this.newBlocksInDownloading.Add(msg.Header.Height); var payload = new GetBlocksMsg(); payload.Heights.Add(msg.Header.Height); var cmd = P2PCommand.CreateCommand(CommandNames.Block.GetBlocks, nonce, payload); this.p2pComponent.SendCommand(address, port, cmd); } } }
private void receivedBlocksMessage(string address, int port, BlocksMsg msg) { this.syncManager.CloseGetBlocksTask(address, port); foreach (var block in msg.Blocks) { try { if (!this.tempBlockList.Any(t => t.Header.Hash == block.Header.Hash) && block.Header.Hash == block.Header.GetHash() && block.Header.Height > GlobalParameters.LocalHeight) { this.tempBlockList.Add(block); } } catch { LogHelper.Error(string.Format("Error IP at {0}:{1}", address, port)); } if (this.newBlocksInDownloading.Contains(block.Header.Height)) { var nodes = this.p2pComponent.GetNodes(); var newMsg = new NewBlockMsg(); newMsg.Header = block.Header; //Broadcast to other node foreach (var node in nodes) { if (node.IsConnected && !node.IsTrackerServer && node.IP != address) { var cmd = P2PCommand.CreateCommand(this.Identity.ToString(), CommandNames.Block.NewBlock, newMsg); this.p2pComponent.SendCommand(node.IP, node.Port, cmd); } } newBlocksInDownloading.Remove(block.Header.Height); } } }
//private void processLongTimeCommand() //{ // LogHelper.Warn("Thread : In to thread threadProcessLongTimeCommand's process action : processLongTimeCommand"); // P2PState state = default(P2PState); // //System.Diagnostics.Stopwatch stopwatch = new System.Diagnostics.Stopwatch(); // while (this.isRunning) // { // if (longTimeCommandQueue.TryDequeue(out state)) // { // if(state != null) // { // try // { // //stopwatch.Reset(); // //stopwatch.Start(); // int index = 0; // switch (state.Command.CommandName) // { // case CommandNames.Block.GetHeaders: // var getHeadersMsg = new GetHeadersMsg(); // getHeadersMsg.Deserialize(state.Command.Payload, ref index); // this.receivedGetHeaders(state.IP, state.Port, getHeadersMsg, state.Command.Nonce); // break; // case CommandNames.Block.GetBlocks: // var getBlocksMsg = new GetBlocksMsg(); // getBlocksMsg.Deserialize(state.Command.Payload, ref index); // this.receivedGetBlocks(state.IP, state.Port, getBlocksMsg, state.Command.Nonce); // break; // default: // break; // } // //stopwatch.Stop(); // //LogHelper.Warn($"processLongTimeCommand : {state.Command.CommandName} -- {stopwatch.ElapsedMilliseconds} , longTimeCommandQueue count = {longTimeCommandQueue.Count()}" ); // } // catch (Exception ex) // { // LogHelper.Error(ex.ToString()); // //LogHelper.Warn($"processLongTimeCommand : {state.Command.CommandName} -- {stopwatch.ElapsedMilliseconds} , longTimeCommandQueue count = {longTimeCommandQueue.Count()} -- Exception msg: {ex.ToString()} "); // } // } // Thread.Sleep(10); // } // else // { // Thread.Sleep(50); // } // } // LogHelper.Warn("Thread : out of thread threadProcessLongTimeCommand's process action : processLongTimeCommand"); //} #endregion private void dataReceived(P2PState state) { int index = 0; switch (state.Command.CommandName) { case CommandNames.Transaction.GetTxPool: this.receivedGetTransactionPool(state.IP, state.Port, state.Command.Nonce); break; case CommandNames.Transaction.TxPool: var txPoolMsg = new TxPoolMsg(); txPoolMsg.Deserialize(state.Command.Payload, ref index); this.receivedTransacitonPoolMessage(state.IP, state.Port, txPoolMsg); break; case CommandNames.Transaction.GetTx: var getTxMsg = new GetTxsMsg(); getTxMsg.Deserialize(state.Command.Payload, ref index); this.receivedGetTransaction(state.IP, state.Port, getTxMsg, state.Command.Nonce); break; case CommandNames.Transaction.Tx: var txsMsg = new TxsMsg(); txsMsg.Deserialize(state.Command.Payload, ref index); this.receivedTransactionMessage(state.IP, state.Port, txsMsg); break; case CommandNames.Transaction.NewTx: var newTxMsg = new NewTxMsg(); newTxMsg.Deserialize(state.Command.Payload, ref index); this.receivedNewTransactionMessage(state.IP, state.Port, newTxMsg); break; case CommandNames.Block.GetHeight: this.receivedGetHeight(state.IP, state.Port, state.Command.Nonce); break; case CommandNames.Block.Height: var heightMsg = new HeightMsg(); heightMsg.Deserialize(state.Command.Payload, ref index); this.receivedHeightMessage(state.IP, state.Port, heightMsg); break; case CommandNames.Block.GetHeaders: var getHeadersMsg = new GetHeadersMsg(); getHeadersMsg.Deserialize(state.Command.Payload, ref index); this.receivedGetHeaders(state.IP, state.Port, getHeadersMsg, state.Command.Nonce); //longTimeCommandQueue.Enqueue(state); break; case CommandNames.Block.Headers: var headersMsg = new HeadersMsg(); headersMsg.Deserialize(state.Command.Payload, ref index); this.receivedHeadersMessage(state.IP, state.Port, headersMsg); break; case CommandNames.Block.GetBlocks: var getBlocksMsg = new GetBlocksMsg(); getBlocksMsg.Deserialize(state.Command.Payload, ref index); this.receivedGetBlocks(state.IP, state.Port, getBlocksMsg, state.Command.Nonce); //longTimeCommandQueue.Enqueue(state); break; case CommandNames.Block.Blocks: var blocksMsg = new BlocksMsg(); blocksMsg.Deserialize(state.Command.Payload, ref index); this.receivedBlocksMessage(state.IP, state.Port, blocksMsg); break; case CommandNames.Block.NewBlock: var newBlockMsg = new NewBlockMsg(); newBlockMsg.Deserialize(state.Command.Payload, ref index); this.receivedNewBlockMessage(state.IP, state.Port, newBlockMsg, state.Command.Nonce); break; case CommandNames.MiningPool.GetMiningPools: this.receivedGetMiningPoolsMessage(state.IP, state.Port); break; case CommandNames.MiningPool.MiningPools: var miningPoolMsg = new MiningPoolMsg(); miningPoolMsg.Deserialize(state.Command.Payload, ref index); receivedMiningPoolsMessage(miningPoolMsg); break; case CommandNames.MiningPool.NewMiningPool: var newMiningPoolMsg = new NewMiningPoolMsg(); newMiningPoolMsg.Deserialize(state.Command.Payload, ref index); this.receivedNewMiningPoolMessage(state, newMiningPoolMsg); break; case CommandNames.Other.Reject: case CommandNames.Other.NotFound: default: break; } }
private void dataReceived(P2PState state) { int index = 0; switch (state.Command.CommandName) { //case CommandNames.P2P.GetAddr: // this.getAddrMsgHandle(state); // break; //case CommandNames.P2P.Addr: // this.addrMsgHandle(state); // break; //case CommandNames.P2P.Heartbeat: // this.heartbeatMsgHandle(state); // break; case CommandNames.Transaction.GetTxPool: this.receivedGetTransactionPool(state.IP, state.Port, state.Command.Nonce); break; case CommandNames.Transaction.TxPool: var txPoolMsg = new TxPoolMsg(); txPoolMsg.Deserialize(state.Command.Payload, ref index); this.receivedTransacitonPoolMessage(state.IP, state.Port, txPoolMsg); break; case CommandNames.Transaction.GetTx: var getTxMsg = new GetTxsMsg(); getTxMsg.Deserialize(state.Command.Payload, ref index); this.receivedGetTransaction(state.IP, state.Port, getTxMsg, state.Command.Nonce); break; case CommandNames.Transaction.Tx: var txsMsg = new TxsMsg(); txsMsg.Deserialize(state.Command.Payload, ref index); this.receivedTransactionMessage(state.IP, state.Port, txsMsg); break; case CommandNames.Transaction.NewTx: var newTxMsg = new NewTxMsg(); newTxMsg.Deserialize(state.Command.Payload, ref index); this.receivedNewTransactionMessage(state.IP, state.Port, newTxMsg); break; case CommandNames.Block.GetHeight: this.receivedGetHeight(state.IP, state.Port, state.Command.Nonce); break; case CommandNames.Block.Height: var heightMsg = new HeightMsg(); heightMsg.Deserialize(state.Command.Payload, ref index); this.receivedHeightMessage(state.IP, state.Port, heightMsg); break; case CommandNames.Block.GetHeaders: var getHeadersMsg = new GetHeadersMsg(); getHeadersMsg.Deserialize(state.Command.Payload, ref index); this.receivedGetHeaders(state.IP, state.Port, getHeadersMsg, state.Command.Nonce); break; case CommandNames.Block.Headers: var headersMsg = new HeadersMsg(); headersMsg.Deserialize(state.Command.Payload, ref index); this.receivedHeadersMessage(state.IP, state.Port, headersMsg); break; case CommandNames.Block.GetBlocks: var getBlocksMsg = new GetBlocksMsg(); getBlocksMsg.Deserialize(state.Command.Payload, ref index); this.receivedGetBlocks(state.IP, state.Port, getBlocksMsg, state.Command.Nonce); break; case CommandNames.Block.Blocks: var blocksMsg = new BlocksMsg(); blocksMsg.Deserialize(state.Command.Payload, ref index); this.receivedBlocksMessage(state.IP, state.Port, blocksMsg); break; case CommandNames.Block.NewBlock: var newBlockMsg = new NewBlockMsg(); newBlockMsg.Deserialize(state.Command.Payload, ref index); this.receivedNewBlockMessage(state.IP, state.Port, newBlockMsg, state.Command.Nonce); break; case CommandNames.Other.Reject: break; case CommandNames.Other.NotFound: break; default: break; } }