public void InitialBootstrap() { KadNode ownerNode = new KadNode(new System.Net.IPEndPoint(IPAddress.Loopback, 55555)); KadNode otherNode = new KadNode(new System.Net.IPEndPoint(IPAddress.Loopback, 55556)); byte[] baseId = new byte[20]; baseId[0] = 255; for (int i = 0; i < 2; i++) //fill up random bucket { baseId[19] = (byte)i; KadContactNode contact = new KadContactNode(new KadId(baseId), new IPEndPoint(IPAddress.Loopback, 20000)); otherNode.BucketList.Put(contact); } KadHashTable hashTable = new KadHashTable(ownerNode, new KadContactNode(otherNode.Id, otherNode.EndPoint)); var contactsWithoutOther = ownerNode.BucketList.Buckets .SelectMany((b) => b.GetNodes()) .Where((n) => n.Id.GetNumericValue() != otherNode.Id.GetNumericValue()) .OrderBy((n) => n.Id.GetNumericValue()) .Select((n) => n.Id.GetNumericValue()) .ToList(); var otherNodeContacts = otherNode.BucketList.Buckets .SelectMany((b) => b.GetNodes()) .OrderBy((n) => n.Id.GetNumericValue()) .Select((n) => n.Id.GetNumericValue()) .ToList(); CollectionAssert.AreEqual(contactsWithoutOther, otherNodeContacts); }
private static void WriteContactNode(MemoryStream ms, KadContactNode contact) { ms.Write(contact.Id.Value, 0, contact.Id.Value.Length); byte[] ipBytes = contact.EndPoint.Address.GetAddressBytes(); ms.Write(ipBytes, 0, ipBytes.Length); byte[] portBytes = BitConverter.GetBytes(contact.EndPoint.Port); ms.Write(portBytes, 0, portBytes.Length); }
public void PingPong() { KadNode node1 = new KadNode(new System.Net.IPEndPoint(IPAddress.Loopback, 55555)); KadNode node2 = new KadNode(new System.Net.IPEndPoint(IPAddress.Loopback, 55556)); KadContactNode contact1 = new KadContactNode(node2.Id, new IPEndPoint(IPAddress.Loopback, 55556)); node1.BucketList.Put(contact1); node1.Ping(contact1); node1.Shutdown(); node2.Shutdown(); }
public void Bucket_GetLeastSeen_Reversed() { Bucket bucket = new Bucket(1, 20); KadContactNode leastSeen = null; for (int i = 0; i < 20; i++) { var contact = new kademlia_dht.Base.KadContactNode(kademlia_dht.Base.KadId.GenerateRandom(), new System.Net.IPEndPoint(IPAddress.Loopback, 20000)); leastSeen = contact; bucket.Put(contact); Thread.Sleep(1000); } Assert.IsTrue(bucket.IsFull()); Assert.IsFalse(leastSeen.Id.GetNumericValue() == bucket.GetLeastSeen().Id.GetNumericValue()); }
public void Bucket_SeenNow() { Bucket bucket = new Bucket(1, 20); KadContactNode node1 = new KadContactNode(KadId.GenerateRandom(), new System.Net.IPEndPoint(IPAddress.Loopback, 20000)); Thread.Sleep(1000); KadContactNode node2 = new KadContactNode(KadId.GenerateRandom(), new System.Net.IPEndPoint(IPAddress.Loopback, 20000)); bucket.Put(node1); bucket.Put(node2); bucket.SeenNow(node1); Assert.IsTrue(bucket.NodesCount == 2); Assert.IsTrue(bucket.GetLeastSeen().Id.GetNumericValue() == node2.Id.GetNumericValue()); }
public void ReplaceLeastSeen() { KadNode ownerNode = new KadNode(new System.Net.IPEndPoint(IPAddress.Loopback, 55555)); KadNode otherNode = new KadNode(new System.Net.IPEndPoint(IPAddress.Loopback, 55556)); KadContactNode irresponsiveContactWithSameId = new KadContactNode(otherNode.Id, new IPEndPoint(IPAddress.Loopback, 33333)); ownerNode.BucketList.Put(irresponsiveContactWithSameId); KadHashTable hashTable = new KadHashTable(ownerNode); Assert.IsTrue(hashTable.TryReplaceLeastSeenContactFromBucket(new KadContactNode(otherNode.Id, otherNode.EndPoint))); KadContactNode otherNodeContact = ownerNode.BucketList.GetClosestNodes(otherNode.Id, 1).First(); Assert.IsTrue(otherNodeContact.Id.GetNumericValue() == otherNode.Id.GetNumericValue()); Assert.IsTrue(otherNodeContact.EndPoint.Port == otherNode.EndPoint.Port); }
public void Put(KadContactNode node) { lock (__rwlock) { if (IsFull()) { throw new Exception("Bucket is full"); } var newNode = new BucketContactNode(node) { LastUsed = DateTime.UtcNow }; LastUpdated = DateTime.UtcNow; _sortedNodes.Add(newNode); _nodesMap.Add(node.Id, newNode); } }
public BucketPutResult Put(KadContactNode node) { var bucket = GetBucket(node.Id); if (bucket.IsFull()) { return(BucketPutResult.BucketIsFull); } if (bucket.Contains(node.Id)) { bucket.SeenNow(node); return(BucketPutResult.Updated); } bucket.Put(node); return(BucketPutResult.Success); }
public void IsValueExpired_Exp() { KadId ownerNodeId = KadId.GenerateRandom(); for (int i = 2; i < ownerNodeId.Value.Length; i++) { ownerNodeId.Value[i] = 255; } ownerNodeId.Value[0] = 0; ownerNodeId.Value[1] = 0; KadNode node1 = new KadNode(new System.Net.IPEndPoint(IPAddress.Loopback, 55555), ownerNodeId); byte[] baseId = new byte[20]; for (int i = 1; i < 21; i++) //fill up random bucket { baseId[19] = (byte)i; KadContactNode contact = new KadContactNode(new KadId(baseId), new IPEndPoint(IPAddress.Loopback, 20000)); node1.BucketList.Put(contact); } //baseId[0] = 255; //baseId[1] = 255; //baseId[19] = 0; //for(int i = 1; i < 20; i++) { // baseId[3] = (byte)i; // ContactNode contact = new ContactNode(new KadId(baseId), new IPEndPoint(IPAddress.Loopback, 20000)); // node1.BucketList.Put(contact); //} KadValue nonExpiredVal = new KadValue(node1.BucketList.Buckets.Aggregate((o, n) => o.Id < n.Id ? n : o).GetNodes() .Aggregate((o, n) => o.Id > n.Id ? n : o).Id, DateTime.UtcNow.AddSeconds(-(node1.ValueExpirationInSec + 1)), new byte[20]); Assert.IsFalse(node1.IsValueExpired(nonExpiredVal)); KadValue expiredVal = new KadValue(nonExpiredVal.Id, DateTime.UtcNow.AddSeconds(-(((node1.ValueExpirationInSec + 1) * Math.Exp(20 / 19)))), new byte[20]); Assert.IsTrue(node1.IsValueExpired(expiredVal)); node1.Shutdown(); }
public void Replace(KadId oldId, KadContactNode newNode) { var added = new BucketContactNode(newNode) { LastUsed = DateTime.UtcNow }; lock ( __rwlock ) { if (!_nodesMap.ContainsKey(oldId)) { throw new Exception($"Node {oldId} not found"); } var replaced = _nodesMap[oldId]; _sortedNodes.Remove(replaced); _nodesMap.Remove(oldId); _sortedNodes.Add(added); _nodesMap[added.Node.Id] = added; } }
public void IsValueExpired_GoodAmountOfCloseContacts() { KadId ownerNodeId = KadId.GenerateRandom(); for (int i = 2; i < ownerNodeId.Value.Length; i++) { ownerNodeId.Value[i] = 255; } ownerNodeId.Value[0] = 0; ownerNodeId.Value[1] = 0; KadNode node1 = new KadNode(new System.Net.IPEndPoint(IPAddress.Loopback, 55555), ownerNodeId); byte[] baseId = new byte[20]; baseId[0] = 255; for (int i = 0; i < 20; i++) //fill up random bucket { baseId[19] = (byte)i; KadContactNode contact = new KadContactNode(new KadId(baseId), new IPEndPoint(IPAddress.Loopback, 20000)); node1.BucketList.Put(contact); } baseId[1] = 255; for (int i = 0; i < 20; i++) { baseId[19] = (byte)i; KadContactNode contact = new KadContactNode(new KadId(baseId), new IPEndPoint(IPAddress.Loopback, 20000)); node1.BucketList.Put(contact); } KadValue value = new KadValue(node1.BucketList.Buckets.Aggregate((o, n) => o.Id < n.Id ? n : o).GetNodes().Aggregate((o, n) => o.Id > n.Id ? n : o).Id, DateTime.UtcNow, new byte[20]); Assert.IsFalse(node1.IsValueExpired(value)); KadValue expiredVal = new KadValue(value.Id, value.Timestamp.AddSeconds(-(node1.ValueExpirationInSec + 1)), new byte[20]); Assert.IsTrue(node1.IsValueExpired(expiredVal)); node1.Shutdown(); }
public void SeenNow(KadContactNode node) { Replace(node.Id, node); }
public BucketContactNode(KadContactNode node) { Node = node; }