public static KadNodeModel ForKadNode(KadNode kadNode) { KadNodeModel nodeState = new KadNodeModel(); nodeState.NodeIp = kadNode.EndPoint.Address.ToString(); nodeState.NodePort = kadNode.EndPoint.Port; nodeState.NodeId = kadNode.Id.Value; nodeState.StorageValues = kadNode.Storage.Values .Select((v) => new StorageValueModel() { ValueId = v.Id.Value, Value = v.Value, Timestamp = v.Timestamp, }).ToList(); nodeState.OwnerValues = kadNode.Storage.OwnerValues .Select((v) => new StorageValueModel() { ValueId = v.Id.Value, Value = v.Value, Timestamp = v.Timestamp, }).ToList(); nodeState.ContactNodes = kadNode.BucketList.Buckets .SelectMany((b) => b.GetNodes()) .Select((n) => new ContactNodeModel() { ContactId = n.Id.Value, IpAddress = n.EndPoint.Address.ToString(), Port = n.EndPoint.Port }).ToList(); return(nodeState); }
public void StoreValue() { KadNode ownerNode = new KadNode(new System.Net.IPEndPoint(IPAddress.Loopback, 55555)); KadNode node1 = new KadNode(new System.Net.IPEndPoint(IPAddress.Loopback, 55556)); KadNode node2 = new KadNode(new System.Net.IPEndPoint(IPAddress.Loopback, 55557)); KadNode node3 = new KadNode(new System.Net.IPEndPoint(IPAddress.Loopback, 55558)); KadNode node4 = new KadNode(new System.Net.IPEndPoint(IPAddress.Loopback, 55559)); node1.BucketList.Put(new KadContactNode(node2.Id, node2.EndPoint)); node1.BucketList.Put(new KadContactNode(node3.Id, node3.EndPoint)); node1.BucketList.Put(new KadContactNode(node4.Id, node4.EndPoint)); KadValue value = new KadValue(KadId.GenerateRandom(), DateTime.UtcNow, new byte[20]); KadHashTable hashTable = new KadHashTable(ownerNode, new KadContactNode(node1.Id, node1.EndPoint)); hashTable.StoreValue(value); Assert.IsTrue(ownerNode.Storage.OwnerValues.Count() == 1); Assert.IsTrue(ownerNode.Storage.OwnerValues.First().Id.GetNumericValue() == value.Id.GetNumericValue()); Assert.IsTrue(node1.Storage.Values.Count() == 1); Assert.IsTrue(node1.Storage.Values.First().Id.GetNumericValue() == value.Id.GetNumericValue()); Assert.IsTrue(node2.Storage.Values.Count() == 1); Assert.IsTrue(node2.Storage.Values.First().Id.GetNumericValue() == value.Id.GetNumericValue()); Assert.IsTrue(node3.Storage.Values.Count() == 1); Assert.IsTrue(node3.Storage.Values.First().Id.GetNumericValue() == value.Id.GetNumericValue()); Assert.IsTrue(node4.Storage.Values.Count() == 1); Assert.IsTrue(node4.Storage.Values.First().Id.GetNumericValue() == value.Id.GetNumericValue()); }
public void RetrieveValues_NoValuesInStorage() { KadNode node1 = new KadNode(new System.Net.IPEndPoint(IPAddress.Loopback, 55555)); KadNode node2 = new KadNode(new System.Net.IPEndPoint(IPAddress.Loopback, 55556)); List <KadContactNode> nodes = new List <KadContactNode>(20); 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)); nodes.Add(contact); node2.BucketList.Put(contact); Thread.Sleep(500); } nodes = nodes.OrderBy((n) => n.Id.GetNumericValue()).ToList(); node1.BucketList.Put(new KadContactNode(node2.Id, node2.EndPoint)); var foundNodes = node1.FindValue(node2.Id, KadId.GenerateRandom()).Contacts; CollectionAssert.AreEqual(foundNodes.Select((n) => n.Id.GetNumericValue()).OrderBy((n) => n).ToList(), nodes.Select((n) => n.Id.GetNumericValue()).OrderBy((n) => n).ToList()); node1.Shutdown(); node2.Shutdown(); }
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 KadNode LoadFromFile() { KadNodeModel nodeState; using (var reader = new StreamReader(_settingsPath)) { var serializer = new XmlSerializer(typeof(KadNodeModel)); nodeState = (KadNodeModel)serializer.Deserialize(reader); } KadNode node = new KadNode(new IPEndPoint(IPAddress.Parse(nodeState.NodeIp), nodeState.NodePort), new KadId(nodeState.NodeId)); foreach (var storageVal in nodeState.StorageValues) { node.Storage.Put(new KadValue(new KadId(storageVal.ValueId), storageVal.Timestamp, storageVal.Value)); } foreach (var ownerVal in nodeState.OwnerValues) { node.Storage.PutOwnerVal(new KadValue(new KadId(ownerVal.ValueId), ownerVal.Timestamp, ownerVal.Value)); } foreach (var contactNode in nodeState.ContactNodes) { node.BucketList.Put(new KadContactNode(new KadId(contactNode.ContactId), new IPEndPoint(IPAddress.Parse(contactNode.IpAddress), contactNode.Port))); } return(node); }
public void KadNodeUnit_Save() { KadNode kadNode = new KadNode(new System.Net.IPEndPoint(IPAddress.Loopback, 55555)); KadNodeUnit unit = new KadNodeUnit(kadNode); unit.SaveToFile(); unit.Stop(); }
public KadNodeUnit(KadNode node) { if (node == null) { throw new ArgumentNullException("node"); } Node = node; }
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(); }
private void InitFromFile() { try { if (File.Exists(_settingsPath)) { Node = LoadFromFile(); return; } } catch (Exception e) { throw new Exception($"Can't load settings from file {_settingsPath}", e); } throw new Exception($"No settings file in {_settingsPath}"); }
public void StoreValue() { KadNode node1 = new KadNode(new System.Net.IPEndPoint(IPAddress.Loopback, 55555)); KadNode node2 = new KadNode(new System.Net.IPEndPoint(IPAddress.Loopback, 55556)); KadValue val = new KadValue(KadId.GenerateRandom(), DateTime.Now, new byte[20]); node1.BucketList.Put(new KadContactNode(node2.Id, node2.EndPoint)); Assert.IsTrue(node1.StoreValue(node2.Id, val)); KadValue node2Val = node2.Storage.Get(val.Id); Assert.IsTrue(val.Id.GetNumericValue() == node2Val.Id.GetNumericValue()); node1.Shutdown(); node2.Shutdown(); }
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 StoreValue_CantStore() { KadNode node1 = new KadNode(new System.Net.IPEndPoint(IPAddress.Loopback, 55555)); KadNode node2 = new KadNode(new System.Net.IPEndPoint(IPAddress.Loopback, 55556)); for (int i = 0; i < 20; i++) { var value = new KadValue(kademlia_dht.Base.KadId.GenerateRandom(), DateTime.UtcNow, new byte[20]); node2.Storage.Put(value); Thread.Sleep(500); } KadValue val = new KadValue(KadId.GenerateRandom(), DateTime.UtcNow, new byte[20]); node1.BucketList.Put(new KadContactNode(node2.Id, node2.EndPoint)); Assert.IsFalse(node1.StoreValue(node2.Id, val)); node1.Shutdown(); node2.Shutdown(); }
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 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 KadNodeUnit_SaveLoadBuckets() { KadNode kadNode = new KadNode(new System.Net.IPEndPoint(IPAddress.Loopback, 55555)); KadNodeUnit unit = new KadNodeUnit(kadNode); 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)); unit.Node.BucketList.Put(contact); Thread.Sleep(1000); } string savePath = "nodewithbuckets.xml"; unit.SaveToFile(savePath); unit.Stop(); KadNodeUnit unit2 = new KadNodeUnit(savePath); Assert.IsTrue(unit2.Node.Id.GetNumericValue() == unit.Node.Id.GetNumericValue()); Assert.IsTrue(unit2.Node.EndPoint.Address.ToString() == unit.Node.EndPoint.Address.ToString()); Assert.IsTrue(unit2.Node.EndPoint.Port == unit.Node.EndPoint.Port); CollectionAssert.AreEqual(unit2.Node.BucketList .Buckets.Select((b) => b.Id).ToList(), unit.Node.BucketList.Buckets.Select((b) => b.Id).ToList()); CollectionAssert.AreEqual(unit2.Node.BucketList .Buckets .SelectMany((b) => b.GetNodes()) .Select((n) => n.Id.GetNumericValue()) .OrderBy((id) => id) .ToList(), unit.Node.BucketList .Buckets .SelectMany((b) => b.GetNodes()) .Select((n) => n.Id.GetNumericValue()) .OrderBy((id) => id) .ToList()); }
public void RetrieveValues() { KadNode node1 = new KadNode(new System.Net.IPEndPoint(IPAddress.Loopback, 55555)); KadNode node2 = new KadNode(new System.Net.IPEndPoint(IPAddress.Loopback, 55556)); List <KadValue> values = new List <KadValue>(20); for (int i = 0; i < 20; i++) { var value = new KadValue(kademlia_dht.Base.KadId.GenerateRandom(), DateTime.UtcNow, new byte[20]); values.Add(value); node2.Storage.Put(value); Thread.Sleep(500); } values = values.OrderBy((v) => v.Id.GetNumericValue()).ToList(); node1.BucketList.Put(new KadContactNode(node2.Id, node2.EndPoint)); var foundVal = node1.FindValue(node2.Id, values.First().Id); Assert.AreEqual(values.First().Id.GetNumericValue(), foundVal.Value.Id.GetNumericValue()); node1.Shutdown(); node2.Shutdown(); }
public void KadNodeUnit_SaveLoadBucketsAndValues() { KadNode kadNode = new KadNode(new System.Net.IPEndPoint(IPAddress.Loopback, 55555)); KadNodeUnit unit = new KadNodeUnit(kadNode); 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)); unit.Node.BucketList.Put(contact); Thread.Sleep(1000); } byte[] value = new byte[20]; for (int i = 0; i < 20; i++) { value[0] = (byte)(i + 1); var valId = new KadId(value); value[19] = (byte)i; var kadValue = new KadValue(valId, DateTime.UtcNow, value); if (i % 3 == 0) { byte[] ownId = new byte[20]; ownId[3] = (byte)i; unit.Node.Storage.PutOwnerVal(new KadValue(new KadId(ownId), DateTime.UtcNow, value)); } else { unit.Node.Storage.Put(kadValue); } Thread.Sleep(1000); } string savePath = "nodewithbuckets.xml"; unit.SaveToFile(savePath); unit.Stop(); KadNodeUnit unit2 = new KadNodeUnit(savePath); Assert.IsTrue(unit2.Node.Id.GetNumericValue() == unit.Node.Id.GetNumericValue()); Assert.IsTrue(unit2.Node.EndPoint.Address.ToString() == unit.Node.EndPoint.Address.ToString()); Assert.IsTrue(unit2.Node.EndPoint.Port == unit.Node.EndPoint.Port); CollectionAssert.AreEqual(unit2.Node.BucketList .Buckets.Select((b) => b.Id).ToList(), unit.Node.BucketList.Buckets.Select((b) => b.Id).ToList()); CollectionAssert.AreEqual(unit2.Node.BucketList .Buckets .SelectMany((b) => b.GetNodes()) .Select((n) => n.Id.GetNumericValue()) .OrderBy((id) => id) .ToList(), unit.Node.BucketList .Buckets .SelectMany((b) => b.GetNodes()) .Select((n) => n.Id.GetNumericValue()) .OrderBy((id) => id) .ToList()); CollectionAssert.AreEqual(unit2.Node.Storage.Values .Select((v) => v.Id.GetNumericValue()) .OrderBy((id) => id) .ToList(), unit.Node.Storage.Values .Select((v) => v.Id.GetNumericValue()) .OrderBy((id) => id) .ToList()); CollectionAssert.AreEqual(unit2.Node.Storage.OwnerValues .Select((v) => v.Id.GetNumericValue()) .OrderBy((id) => id) .ToList(), unit.Node.Storage.OwnerValues .Select((v) => v.Id.GetNumericValue()) .OrderBy((id) => id) .ToList()); CollectionAssert.AreEqual(unit2.Node.Storage.OwnerValues .Select((v) => v.Timestamp) .OrderBy((t) => t) .ToList(), unit.Node.Storage.OwnerValues .Select((v) => v.Timestamp) .OrderBy((t) => t) .ToList()); }