Esempio n. 1
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();
        }
Esempio n. 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());
        }
Esempio n. 3
0
 public BucketList(KadId nodeId, int nodeCountInBucket)
 {
     currentNodeId       = nodeId;
     k                   = nodeCountInBucket;
     _buckets            = new ConcurrentDictionary <int, Bucket>();
     _bucket2RefreshDate = new ConcurrentDictionary <int, DateTime>();
 }
Esempio n. 4
0
 public KadValue(KadId id, DateTime timestamp, byte[] value)
 {
     Id        = id;
     Timestamp = timestamp;
     byte[] valueCopy = new byte[value.Length];
     Buffer.BlockCopy(value, 0, valueCopy, 0, value.Length);
     Value = valueCopy;
 }
Esempio n. 5
0
        public override bool Contains(KadId id)
        {
            if (id == null)
            {
                throw new ArgumentNullException("id");
            }

            return(_data.ContainsKey(id));
        }
Esempio n. 6
0
        public override KadValue Get(KadId id)
        {
            if (Contains(id))
            {
                return(_data[id]);
            }

            throw new Exception($"No value with id {id}");
        }
Esempio n. 7
0
        public void Bucket_Contains()
        {
            Bucket bucket = new Bucket(1, 20);

            KadContactNode node = new kademlia_dht.Base.KadContactNode(kademlia_dht.Base.KadId.GenerateRandom(), new System.Net.IPEndPoint(IPAddress.Loopback, 20000));

            bucket.Put(node);
            Assert.IsTrue(bucket.Contains(node.Id));
            Assert.IsFalse(bucket.Contains(KadId.GenerateRandom()));
        }
Esempio n. 8
0
        private KadValue ReadKadValue()
        {
            int      offset    = 0;
            KadId    valId     = ReadId(Payload, ref offset, 20);
            DateTime timestamp = ReadDateTime(Payload, ref offset);

            byte[] value = new byte[Payload.Length - offset];
            Buffer.BlockCopy(Payload, offset, value, 0, value.Length);

            return(new KadValue(valId, timestamp, value));
        }
Esempio n. 9
0
        public Bucket GetBucket(KadId forId)
        {
            int bucketId = GetBucketIdForKadId(forId);

            if (_buckets.ContainsKey(bucketId))
            {
                return(_buckets[bucketId]);
            }

            return(CreateNewBucket(bucketId));
        }
Esempio n. 10
0
        public override bool Remove(KadId id)
        {
            lock ( _ownerValIds ) {
                if (_ownerValIds.Contains(id))
                {
                    _ownerValIds.Remove(id);
                }
            }

            KadValue removed;

            return(_data.TryRemove(id, out removed));
        }
Esempio n. 11
0
        public void BucketList_Put()
        {
            BucketList bucketList = new BucketList(KadId.GenerateRandom(), 20);

            byte[] kadId = new byte[20];

            for (int i = 0; i < 20; i++)
            {
                kadId[19] = (byte)(i + 1);
                var contact = new kademlia_dht.Base.KadContactNode(new KadId(kadId), new System.Net.IPEndPoint(IPAddress.Loopback, 20000));
                bucketList.Put(contact);
                Thread.Sleep(1000);
            }
            kadId[19] = 20;
            Assert.IsTrue(bucketList.Put(new KadContactNode(new KadId(kadId), new IPEndPoint(IPAddress.Loopback, 20000))) == BucketList.BucketPutResult.BucketIsFull);
        }
Esempio n. 12
0
        public void MessageParseTest()
        {
            KadId       id  = KadId.GenerateRandom();
            NodeMessage msg = new NodeMessage.Builder()
                              .SetType(MessageType.Ping)
                              .SetOriginator(id)
                              .Build();

            NodeMessage msgParsed = new NodeMessage.Builder(msg.ToBytes()).Build();

            Assert.AreEqual(id.GetNumericValue(), new KadId(id.Value).GetNumericValue());

            Assert.AreEqual(msg.Type, msgParsed.Type);
            Assert.AreEqual(msg.Seq, msgParsed.Seq);
            Assert.AreEqual(msg.OriginatorId.GetNumericValue(), msgParsed.OriginatorId.GetNumericValue());
        }
Esempio n. 13
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());
        }
Esempio n. 14
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();
        }
Esempio n. 15
0
        private IEnumerable <KadContactNode> ReadContactNodes()
        {
            int offset = 0;

            byte[] ipv4AddrBytes = new byte[4];
            while (offset != Payload.Length)
            {
                KadId contactId = ReadId(Payload, ref offset, 20);
                Buffer.BlockCopy(Payload, offset, ipv4AddrBytes, 0, 4);
                IPAddress address = new IPAddress(ipv4AddrBytes);
                offset += ipv4AddrBytes.Length;

                int port = BitConverter.ToInt32(Payload, offset);
                offset += 4;

                yield return(new KadContactNode(contactId, new IPEndPoint(new IPAddress(ipv4AddrBytes), port)));
            }
        }
Esempio n. 16
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();
        }
Esempio n. 17
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();
        }
Esempio n. 18
0
        public IEnumerable <KadContactNode> GetClosestNodes(KadId closeTo, int count)
        {
            int bucketId    = GetBucketIdForKadId(closeTo);
            var orderedKeys = _buckets.Keys.OrderBy((t) => Math.Abs(t - bucketId)).ToList();
            List <KadContactNode> closests = new List <KadContactNode>();

            foreach (var bucketKey in orderedKeys)
            {
                foreach (var node in _buckets[bucketKey].GetNodes(count - closests.Count))
                {
                    closests.Add(node);
                }

                if (closests.Count == count)
                {
                    break;
                }
            }

            return(closests);
        }
Esempio n. 19
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;
            }
        }
Esempio n. 20
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();
        }
Esempio n. 21
0
 public abstract KadValue Get(KadId id);
Esempio n. 22
0
 public abstract bool Contains(KadId id);
Esempio n. 23
0
 public Builder SetOriginator(KadId id)
 {
     _nodeMessage.OriginatorId = id;
     return(this);
 }
Esempio n. 24
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());
        }
Esempio n. 25
0
        private int GetBucketIdForKadId(KadId id)
        {
            BigInteger distance = (id ^ currentNodeId).GetNumericValue();

            return((int)BigInteger.Log(distance, 2));
        }
Esempio n. 26
0
 public bool Contains(KadId id)
 {
     lock ( __rwlock ) {
         return(_nodesMap.ContainsKey(id));
     }
 }
Esempio n. 27
0
 public KadContactNode GetNode(KadId id)
 {
     return(_nodesMap[id].Node);
 }
Esempio n. 28
0
 public abstract bool Remove(KadId id);
Esempio n. 29
0
 public abstract bool IsOwnerVal(KadId valId);
Esempio n. 30
0
 public override bool IsOwnerVal(KadId valId)
 {
     lock ( _ownerValIds ) {
         return(_ownerValIds.Contains(valId));
     }
 }