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 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 BucketList(KadId nodeId, int nodeCountInBucket) { currentNodeId = nodeId; k = nodeCountInBucket; _buckets = new ConcurrentDictionary <int, Bucket>(); _bucket2RefreshDate = new ConcurrentDictionary <int, DateTime>(); }
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; }
public override bool Contains(KadId id) { if (id == null) { throw new ArgumentNullException("id"); } return(_data.ContainsKey(id)); }
public override KadValue Get(KadId id) { if (Contains(id)) { return(_data[id]); } throw new Exception($"No value with id {id}"); }
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())); }
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)); }
public Bucket GetBucket(KadId forId) { int bucketId = GetBucketIdForKadId(forId); if (_buckets.ContainsKey(bucketId)) { return(_buckets[bucketId]); } return(CreateNewBucket(bucketId)); }
public override bool Remove(KadId id) { lock ( _ownerValIds ) { if (_ownerValIds.Contains(id)) { _ownerValIds.Remove(id); } } KadValue removed; return(_data.TryRemove(id, out removed)); }
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); }
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()); }
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 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(); }
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))); } }
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 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); }
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 abstract KadValue Get(KadId id);
public abstract bool Contains(KadId id);
public Builder SetOriginator(KadId id) { _nodeMessage.OriginatorId = id; return(this); }
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()); }
private int GetBucketIdForKadId(KadId id) { BigInteger distance = (id ^ currentNodeId).GetNumericValue(); return((int)BigInteger.Log(distance, 2)); }
public bool Contains(KadId id) { lock ( __rwlock ) { return(_nodesMap.ContainsKey(id)); } }
public KadContactNode GetNode(KadId id) { return(_nodesMap[id].Node); }
public abstract bool Remove(KadId id);
public abstract bool IsOwnerVal(KadId valId);
public override bool IsOwnerVal(KadId valId) { lock ( _ownerValIds ) { return(_ownerValIds.Contains(valId)); } }