Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Resolving IPNS immedietly with Libp2p-Fetch #713

Open
Rinse12 opened this issue Jan 1, 2025 · 1 comment
Open

Resolving IPNS immedietly with Libp2p-Fetch #713

Rinse12 opened this issue Jan 1, 2025 · 1 comment

Comments

@Rinse12
Copy link

Rinse12 commented Jan 1, 2025

We’re trying to set up IPNS and IPNS-Over-Pubsub in helia. The default behavior of IPNS-Over-Pubsub router in helia is to wait to receive the the IPNS update from its gossipsub subscription. But that takes too long, and in Kubo there’s a way for asking a connected peer directly for the latest IPNS record. The difference in terms of latency is huge, helia takes ~30s to resovle an IPNS, while kubo ~2s.

We would like the helia node to fetch the latest IPNS record immediately instead of waiting for IPNS updates in the pubsub topic. The IPNS-Over-Pubsub protocol suggests using Libp2p-Fetch for this, which is what Kubo is using. But we’re hitting a roadblock because no matter how we construct the fetch identifier or key, kubo nodes always respond with NOT_FOUND.

This is how we’re constructing fetch key at the moment. Please let me know how to correct it:

const subplebbitIpnsName = "12D3KooWJ7mvJFaWHK43MYd1Au4W4mkbY7L8dQaiMBqH5bZkSsFn";
const subplebbitIpnsAsPeerId = PeerId.parse(subplebbitIpnsName);
const fetchKey = "/ipns/" + uint8ArrayToString(subplebbitIpnsAsPeerId.toBytes(), "binary");
const res = await helia.libp2p.services.fetch.fetch(peer.id, fetchKey); // always gives undefined because kubo responds with NOT_FOUND

Moreover, is implementing libp2p-fetch for IPNS on the roadmap for helia?

References:
IPNS PubSub Router

@estebanabaroa
Copy link

estebanabaroa commented Jan 6, 2025

Something weird is happening, after dialing a kubo node with IPNS over pubsub and doing:

libp2p.services.fetch.registerLookupFunction(
  '/ipns/',
   (key) => console.log('fetch received with key:', [key])
)
await name.resolve(CID.parse('k51qzi5uqu5dkhvs75chetwlvhwyvhwj8c2qq71tx62z3fekwkms32ubp6k08g').multihash)

Logs:

  libp2p:fetch look up data with identifier /ipns/ 퓶U)ǂfzӗఄ筗{;𠴇Rv.ॱ80 +0ms
fetch received with key: [ '/ipns/\x00$\b\x01\x12 퓶U)ǂfzӗఄ筗{;𠴇R\x14v.ॱ80' ]
  libp2p:fetch sending status for /ipns/ 퓶U)ǂfzӗఄ筗{;𠴇Rv.ॱ80 not found +1ms

So I assume the key is '/ipns/\x00$\b\x01\x12 퓶U)ǂfzӗఄ筗{;𠴇R\x14v.ॱ80' but when I do:

const libp2pFetchKey = '/ipns/\x00$\b\x01\x12 퓶U)ǂfzӗఄ筗{;𠴇R\x14v.ॱ80'
const value = await libp2p.services.fetch.fetch(kuboPeerId, libp2pFetchKey)

I get the log:

  libp2p:fetch dialing /libp2p/fetch/0.0.1 to 12D3KooWL49bEXmXyp2zVc5HUCjKZjVdavK7mP97Md6qi6HidSUq +0ms
  libp2p:fetch using default timeout of 10000 ms +1ms
  libp2p:fetch fetch /ipns/ 퓶U)ǂfzӗఄ筗{;𠴇Rv.ॱ80 +36ms
  libp2p:fetch received status for /ipns/ 퓶U)ǂfzӗఄ筗{;𠴇Rv.ॱ80 not found +12ms

Using the exact key copy pasted that kubo is sending doesn't work?

Also how does 'k51qzi5uqu5dkhvs75chetwlvhwyvhwj8c2qq71tx62z3fekwkms32ubp6k08g' become '/ipns/\x00$\b\x01\x12 퓶U)ǂfzӗఄ筗{;𠴇R\x14v.ॱ80'?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants