Hello everyone, glad to be here. 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?
As it happens, go-libp2p-pubsub-router’s fetch implementation accepts datastore keys as identifier - internally the go implementation of IPNS stores records in the datastore with the key "/ipns/" + peer-id-multihash-bytes, so that’s what we need to send.
This is easy to do in golang because it can cast strings to byte[] and back again. JavaScript is not so lucky as it’s strings are UTF-16, so round tripping Uint8Arrays usually results in garbage when byte sequences can be interpreted as either multi-byte or non-printable characters.