diff --git a/src/main/java/org/peergos/EmbeddedIpfs.java b/src/main/java/org/peergos/EmbeddedIpfs.java index c9af94e5..276b8232 100644 --- a/src/main/java/org/peergos/EmbeddedIpfs.java +++ b/src/main/java/org/peergos/EmbeddedIpfs.java @@ -113,9 +113,9 @@ public CompletableFuture publishPresignedRecord(Multihash pub, byte[] pres return dht.publishValue(pub, presignedRecord, node); } - public CompletableFuture resolveValue(PubKey pub) { + public CompletableFuture resolveValue(PubKey pub, int minResults) { Multihash publisher = Multihash.deserialize(PeerId.fromPubKey(pub).getBytes()); - List candidates = dht.resolveValue(publisher, 1, node); + List candidates = dht.resolveValue(publisher, minResults, node); List records = candidates.stream().sorted().collect(Collectors.toList()); if (records.isEmpty()) return CompletableFuture.failedFuture(new IllegalStateException("Couldn't resolve IPNS value for " + pub)); diff --git a/src/main/java/org/peergos/protocol/dht/Kademlia.java b/src/main/java/org/peergos/protocol/dht/Kademlia.java index 528ae9fe..6c48e221 100644 --- a/src/main/java/org/peergos/protocol/dht/Kademlia.java +++ b/src/main/java/org/peergos/protocol/dht/Kademlia.java @@ -432,6 +432,9 @@ private Optional getValueFromPeer(PeerAddresses peer, Multihash publi public List resolveValue(Multihash publisher, int minResults, Host us) { byte[] key = IPNS.getKey(publisher); List candidates = new ArrayList<>(); + Optional local = engine.getRecord(publisher); + local.ifPresent(candidates::add); + Id keyId = Id.create(Hash.sha256(key), 256); SortedSet toQuery = Collections.synchronizedSortedSet(new TreeSet<>((a, b) -> compareKeys(a, b, keyId))); List localClosest = engine.getKClosestPeers(key); diff --git a/src/test/java/org/peergos/EmbeddedIpfsTest.java b/src/test/java/org/peergos/EmbeddedIpfsTest.java index 5bf9e5aa..dab8a67d 100644 --- a/src/test/java/org/peergos/EmbeddedIpfsTest.java +++ b/src/test/java/org/peergos/EmbeddedIpfsTest.java @@ -51,7 +51,7 @@ public void publishValue() throws Exception { PrivKey publisher = Ed25519Kt.generateEd25519KeyPair().getFirst(); byte[] value = "This is a test".getBytes(); node1.publishValue(publisher, value, 1, 24).join(); - byte[] res = node1.resolveValue(publisher.publicKey()).join(); + byte[] res = node1.resolveValue(publisher.publicKey(), 5).join(); Assert.assertTrue(Arrays.equals(res, value)); node1.stop(); @@ -73,7 +73,7 @@ public void publishPresignedValue() throws Exception { node1.publishPresignedRecord(pub, signedRecord).join(); node1.publishPresignedRecord(pub, signedRecord).join(); - byte[] res = node1.resolveValue(publisher.publicKey()).join(); + byte[] res = node1.resolveValue(publisher.publicKey(), 5).join(); Assert.assertTrue(Arrays.equals(res, value)); // publish an updated value with same expiry @@ -83,7 +83,7 @@ public void publishPresignedValue() throws Exception { node1.publishPresignedRecord(pub, signedRecord2).join(); node1.publishPresignedRecord(pub, signedRecord2).join(); - byte[] res2 = node1.resolveValue(publisher.publicKey()).join(); + byte[] res2 = node1.resolveValue(publisher.publicKey(), 5).join(); Assert.assertTrue(Arrays.equals(res2, value2)); // publish an updated value with earlier expiry @@ -93,7 +93,7 @@ public void publishPresignedValue() throws Exception { node1.publishPresignedRecord(pub, signedRecord3).join(); node1.publishPresignedRecord(pub, signedRecord3).join(); - byte[] res3 = node1.resolveValue(publisher.publicKey()).join(); + byte[] res3 = node1.resolveValue(publisher.publicKey(), 5).join(); Assert.assertTrue(Arrays.equals(res3, value3)); node1.stop();