示例#1
0
        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);
        }
示例#2
0
        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());
        }
示例#3
0
        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();
        }
示例#4
0
        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);
        }
示例#5
0
        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);
        }
示例#6
0
        public void KadNodeUnit_Save()
        {
            KadNode     kadNode = new KadNode(new System.Net.IPEndPoint(IPAddress.Loopback, 55555));
            KadNodeUnit unit    = new KadNodeUnit(kadNode);

            unit.SaveToFile();
            unit.Stop();
        }
示例#7
0
        public KadNodeUnit(KadNode node)
        {
            if (node == null)
            {
                throw new ArgumentNullException("node");
            }

            Node = node;
        }
示例#8
0
        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();
        }
示例#9
0
        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}");
        }
示例#10
0
        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();
        }
示例#11
0
        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);
        }
示例#12
0
        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();
        }
示例#13
0
        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();
        }
示例#14
0
        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();
        }
示例#15
0
        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());
        }
示例#16
0
        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();
        }
示例#17
0
        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());
        }