public static bool broadcastGetBlockSignatures(ulong block_num, byte[] block_checksum, RemoteEndpoint endpoint) { using (MemoryStream mw = new MemoryStream()) { using (BinaryWriter writerw = new BinaryWriter(mw)) { writerw.WriteIxiVarInt(block_num); writerw.WriteIxiVarInt(block_checksum.Length); writerw.Write(block_checksum); #if TRACE_MEMSTREAM_SIZES Logging.info(String.Format("NetworkProtocol::broadcastGetBlockSignatures: {0}", mw.Length)); #endif if (endpoint != null) { if (endpoint.isConnected()) { endpoint.sendData(ProtocolMessageCode.getBlockSignatures2, mw.ToArray()); return(true); } } return(CoreProtocolMessage.broadcastProtocolMessageToSingleRandomNode(new char[] { 'M', 'H' }, ProtocolMessageCode.getBlockSignatures2, mw.ToArray(), block_num)); } } }
public static bool broadcastGetBlock(ulong block_num, RemoteEndpoint skipEndpoint = null, RemoteEndpoint endpoint = null, byte include_transactions = 0, bool full_header = false) { using (MemoryStream mw = new MemoryStream()) { using (BinaryWriter writerw = new BinaryWriter(mw)) { writerw.WriteIxiVarInt(block_num); writerw.Write(include_transactions); writerw.Write(full_header); #if TRACE_MEMSTREAM_SIZES Logging.info(String.Format("NetworkProtocol::broadcastGetBlock: {0}", mw.Length)); #endif if (endpoint != null) { if (endpoint.isConnected()) { endpoint.sendData(ProtocolMessageCode.getBlock3, mw.ToArray()); return(true); } } return(CoreProtocolMessage.broadcastProtocolMessageToSingleRandomNode(new char[] { 'M', 'H' }, ProtocolMessageCode.getBlock3, mw.ToArray(), block_num, skipEndpoint)); } } }
private bool handleSignature(InventoryItem item, RemoteEndpoint endpoint) { InventoryItemSignature iis = (InventoryItemSignature)item; ulong last_block_height = IxianHandler.getLastBlockHeight(); byte[] address = iis.address; ulong block_num = iis.blockNum; if (block_num + 5 > last_block_height && block_num <= last_block_height + 1) { if (block_num == last_block_height + 1) { lock (Node.blockProcessor.localBlockLock) { Block local_block = Node.blockProcessor.localNewBlock; if (local_block == null || local_block.blockNum != block_num) { return(false); } if (!local_block.blockChecksum.SequenceEqual(iis.blockHash) || local_block.hasNodeSignature(address)) { return(false); } } } else { Block sf_block = Node.blockChain.getBlock(block_num); if (!sf_block.blockChecksum.SequenceEqual(iis.blockHash) || sf_block.hasNodeSignature(address)) { return(false); } } byte[] block_num_bytes = block_num.GetIxiVarIntBytes(); byte[] addr_len_bytes = ((ulong)address.Length).GetIxiVarIntBytes(); byte[] data = new byte[block_num_bytes.Length + 1 + addr_len_bytes.Length + address.Length]; Array.Copy(block_num_bytes, data, block_num_bytes.Length); data[block_num_bytes.Length] = 1; Array.Copy(addr_len_bytes, 0, data, block_num_bytes.Length + 1, addr_len_bytes.Length); Array.Copy(address, 0, data, block_num_bytes.Length + 1 + addr_len_bytes.Length, address.Length); if (endpoint == null) { CoreProtocolMessage.broadcastProtocolMessageToSingleRandomNode(new char[] { 'M', 'H' }, ProtocolMessageCode.getSignatures, data, block_num); } else { endpoint.sendData(ProtocolMessageCode.getSignatures, data, null); } return(true); } return(false); }
private void stopSyncStartBlockProcessing() { if (CoreConfig.preventNetworkOperations) { Logging.info("Data verification successfully completed."); IxianHandler.forceShutdown = true; syncDone = true; synchronizing = false; return; } // Don't finish sync if we never synchronized from network if (noNetworkSynchronization == true) { Thread.Sleep(500); return; } IxianHandler.status = NodeStatus.ready; // if we reach here, we are synchronized syncDone = true; synchronizing = false; Node.blockProcessor.firstBlockAfterSync = true; Node.blockProcessor.resumeOperation(); lock (pendingBlocks) { lock (requestedBlockTimes) { requestedBlockTimes.Clear(); } pendingBlocks.Clear(); if (missingBlocks != null) { missingBlocks.Clear(); missingBlocks = null; } } if (!Config.recoverFromFile) { CoreProtocolMessage.broadcastProtocolMessageToSingleRandomNode(new char[] { 'M' }, ProtocolMessageCode.getUnappliedTransactions, new byte[1], IxianHandler.getHighestKnownNetworkBlockHeight()); Node.miner.start(); Node.walletStorage.scanForLostAddresses(); } }
// Request transaction data private void requestTransactionData() { Logging.info("Requesting transaction data for: {0}", transaction.id); using (MemoryStream m = new MemoryStream()) { using (BinaryWriter writer = new BinaryWriter(m)) { writer.Write(transaction.id); writer.Write((ulong)0); CoreProtocolMessage.broadcastProtocolMessageToSingleRandomNode(new char[] { 'M' }, IXICore.Network.ProtocolMessageCode.getTransaction, m.ToArray(), 0, null); } } }
public static void requestAllFriendsPresences() { // TODO TODO use hidden address matcher lock (friends) { foreach (var entry in friends) { using (MemoryStream m = new MemoryStream(1280)) { using (BinaryWriter writer = new BinaryWriter(m)) { writer.Write(entry.walletAddress.Length); writer.Write(entry.walletAddress); CoreProtocolMessage.broadcastProtocolMessageToSingleRandomNode(new char[] { 'M' }, ProtocolMessageCode.getPresence, m.ToArray(), 0, null); } } } } }