Beispiel #1
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);
        }
Beispiel #2
0
 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);
 }
Beispiel #3
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();
        }
Beispiel #4
0
        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());
        }
Beispiel #5
0
        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());
        }
Beispiel #6
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);
        }
Beispiel #7
0
        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);
            }
        }
Beispiel #8
0
        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);
        }
Beispiel #9
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();
        }
Beispiel #10
0
        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;
            }
        }
Beispiel #11
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();
        }
Beispiel #12
0
 public void SeenNow(KadContactNode node)
 {
     Replace(node.Id, node);
 }
Beispiel #13
0
 public BucketContactNode(KadContactNode node)
 {
     Node = node;
 }