private async Task OnInvMessageReceivedAsync(InvPayload payload) { InventoryVector[] vectors = payload.Inventories.Distinct().Where(p => Enum.IsDefined(typeof(InventoryType), p.Type)).ToArray(); lock (KnownHashes) { vectors = vectors.Where(p => !KnownHashes.Contains(p.Hash)).ToArray(); } if (vectors.Length == 0) return; lock (missions_global) { if (localNode.GlobalMissionsEnabled) vectors = vectors.Where(p => !missions_global.Contains(p.Hash)).ToArray(); foreach (InventoryVector vector in vectors) { missions_global.Add(vector.Hash); missions.Add(vector.Hash); } } if (vectors.Length == 0) return; await SendMessageAsync("getdata", GetDataPayload.Create(vectors)); }
private void OnInvMessageReceived(InvPayload payload) { IEnumerable<InventoryVector> vectors = payload.Inventories.Distinct().Where(p => Enum.IsDefined(typeof(InventoryType), p.Type)); lock (LocalNode.KnownHashes) { vectors = vectors.Where(p => !LocalNode.KnownHashes.Contains(p.Hash)).ToArray(); } vectors = vectors.Where(p => p.Type != InventoryType.TX || !Blockchain.Default.ContainsTransaction(p.Hash)); vectors = vectors.Where(p => p.Type != InventoryType.Block || !Blockchain.Default.ContainsBlock(p.Hash)); InventoryVector[] vectors_list = vectors.ToArray(); if (vectors_list.Length == 0) return; lock (missions_global) { foreach (InventoryVector vector in vectors_list) { if (!missions_global.ContainsKey(vector.Hash)) { missions_global.Add(vector.Hash, new Mission { Hash = vector.Hash, Type = vector.Type, LaunchTimes = 0 }); } if (!missions.ContainsKey(vector.Hash)) { missions.Add(vector.Hash, missions_global[vector.Hash]); } } } }
private void OnGetDataMessageReceived(InvPayload payload) { foreach (InventoryVector vector in payload.Inventories.Distinct()) { Inventory inventory; if (!localNode.RelayCache.TryGet(vector.Hash, out inventory) && !localNode.ServiceEnabled) continue; switch (vector.Type) { case InventoryType.TX: if (inventory == null && Blockchain.Default != null) inventory = Blockchain.Default.GetTransaction(vector.Hash); if (inventory != null) EnqueueMessage("tx", inventory); break; case InventoryType.Block: if (inventory == null && Blockchain.Default != null) inventory = Blockchain.Default.GetBlock(vector.Hash); if (inventory != null) EnqueueMessage("block", inventory); break; } } }