I have two laptops, both running js-ipfs nodes. On the first one I put javascript object with:
const obj = { a: 'b' }
const cid = await node.dag.put(obj)
Then I convert cid toBaseEncodedString(), send via messenger to my second laptop and trying to get content with:
const data = await node.dag.get(cidString)
console.log(data.value)
...but console.log never happens and no errors. Multiaddr of my first laptop appears in node.swarm.addrs() of the second one like that
[ <Multiaddr 04c0a86406060fa2 - /ip4/192.168.100.6/tcp/4002> ]
what I believe means both nodes see each other. Any advice on how to make it work? Thanks!
That's a strange behavior. I see you are using async/await, I assume you have wrapped the API to expose that?
Check the bitswap wantlist. node.bitswap.wantlist() to see if the cid is present.
This code I run on first laptop:
const IPFS = require('ipfs')
const DAGOptions = { format: 'dag-cbor', hashAlg: 'sha2-256' }
const node = new IPFS()
node.on('ready', async () => {
const cid = await node.dag.put({ a: 'b' }, DAGOptions)
console.log(cid.toBaseEncodedString())
const { value } = await node.dag.get(cid)
console.log(value)
let knownPeers = []
setInterval(async () => {
const addrs = await node.swarm.addrs()
const newPeers = []
addrs.forEach((addr) => {
const id = addr.id.toB58String()
if (!knownPeers.includes(id)) {
newPeers.push(id)
}
})
if (newPeers.length > 0) {
console.log(newPeers)
knownPeers = [...knownPeers, ...newPeers]
}
}, 1000)
})
console output
WARNING: Your platform does not have native WebRTC support, it won' use any WebRTC transport
Swarm listening on /ip4/127.0.0.1/tcp/4003/ws/ipfs/QmeQQdVjvKdo3Q3v2SincZhghnqUGckSF23r9ajxsq4LrJ
Swarm listening on /ip4/127.0.0.1/tcp/4002/ipfs/QmeQQdVjvKdo3Q3v2SincZhghnqUGckSF23r9ajxsq4LrJ
Swarm listening on /ip4/192.168.100.7/tcp/4002/ipfs/QmeQQdVjvKdo3Q3v2SincZhghnqUGckSF23r9ajxsq4LrJ
zdpuAw6c3ViCx5A7K4nukvmxh3ZtTHnyknmxCLQmGa6JDmDMn
{ a: 'b' }
[ 'QmaCpDMGvV2BGHeYERUEnRQAwe3N8SzbUtfsmvsqQLuvuJ',
'QmSoLnSGccFuZQJzRadHn95W2CrSFmZuTdDWP8HXaHca9z',
'QmSoLPppuBtQSGwKDZT2M73ULpjvfd3aZ6ha4oFGL1KrGM',
'QmSoLueR4xBeUbY9WZ9xGUUxunbKWcrNFTDAadQJmocnWm',
'QmSoLSafTMBsPKadTEgaXctDQVcqN88CNLHXMkTNwMKPnu',
'QmSoLV4Bbm51jM9C4gDYZQ9Cy3U6aXMJDAbzgu2fzaDs64',
'QmSoLer265NRgSp2LA3dPaeykiS1J6DifTC88f5uVQKNAd',
'QmSoLMeWqB7YGVLJN3pNLQpmmEk35v6wYtsMGLzSr5QBU3',
'QmSoLju6m7xTh3DuokvT3886QRYqxAzb1kShaanJgW36yx' ]
[ 'Qmc9bVU9yQ38C7LaeJMZ9o36tXuHVJWNY2mGZG4w8wzJBE' ]
[ 'QmeQQdVjvKdo3Q3v2SincZhghnqUGckSF23r9ajxsq4LrJ' ]
This code I run on second laptop:
const IPFS = require('ipfs')
const node = new IPFS()
node.on('ready', async () => {
node.dag.get('zdpuAw6c3ViCx5A7K4nukvmxh3ZtTHnyknmxCLQmGa6JDmDMn', (err, result) => {
if (err) {
console.log(err)
} else {
console.log(result.value)
}
})
console.log(node.bitswap.wantlist())
setTimeout(() => {
console.log(node.bitswap.wantlist())
}, 1000)
let knownPeers = []
setInterval(async () => {
const addrs = await node.swarm.addrs()
const newPeers = []
addrs.forEach((addr) => {
const id = addr.id.toB58String()
if (!knownPeers.includes(id)) {
newPeers.push(id)
}
})
if (newPeers.length > 0) {
console.log('NEW PEERS =>')
console.log(newPeers)
knownPeers = [...knownPeers, ...newPeers]
}
}, 1000)
})
console output
WARNING: Your platform does not have native WebRTC support, it won' use any WebRTC transport
Swarm listening on /ip4/127.0.0.1/tcp/4003/ws/ipfs/Qmc9bVU9yQ38C7LaeJMZ9o36tXuHVJWNY2mGZG4w8wzJBE
Swarm listening on /ip4/127.0.0.1/tcp/4002/ipfs/Qmc9bVU9yQ38C7LaeJMZ9o36tXuHVJWNY2mGZG4w8wzJBE
Swarm listening on /ip4/192.168.100.6/tcp/4002/ipfs/Qmc9bVU9yQ38C7LaeJMZ9o36tXuHVJWNY2mGZG4w8wzJBE
[]
[ WantListEntry {
_refCounter: 1,
cid:
CID {
codec: 'dag-cbor',
version: 1,
multihash: <Buffer 12 20 9e 9d 55 07 d3 29 07 ef 1f 11 23 0c 6c 37 bd f6 13 fd 0d fd b7 b6 c8 9b fe f9 64 81 23 fc b2 65> },
priority: 2147483647 } ]
NEW PEERS =>
[ 'QmaCpDMGvV2BGHeYERUEnRQAwe3N8SzbUtfsmvsqQLuvuJ',
'QmSoLnSGccFuZQJzRadHn95W2CrSFmZuTdDWP8HXaHca9z',
'QmSoLPppuBtQSGwKDZT2M73ULpjvfd3aZ6ha4oFGL1KrGM',
'QmSoLueR4xBeUbY9WZ9xGUUxunbKWcrNFTDAadQJmocnWm',
'QmSoLSafTMBsPKadTEgaXctDQVcqN88CNLHXMkTNwMKPnu',
'QmSoLV4Bbm51jM9C4gDYZQ9Cy3U6aXMJDAbzgu2fzaDs64',
'QmSoLer265NRgSp2LA3dPaeykiS1J6DifTC88f5uVQKNAd',
'QmSoLMeWqB7YGVLJN3pNLQpmmEk35v6wYtsMGLzSr5QBU3',
'QmSoLju6m7xTh3DuokvT3886QRYqxAzb1kShaanJgW36yx' ]
NEW PEERS =>
[ 'QmeQQdVjvKdo3Q3v2SincZhghnqUGckSF23r9ajxsq4LrJ',
'Qmc9bVU9yQ38C7LaeJMZ9o36tXuHVJWNY2mGZG4w8wzJBE' ]
Get request appears in wantlist not immediately, I asume it's okay? By the way, any ideas where those first 9 nodes came from?
Are you use that both of your laptops are connected? The first 9 nodes are the bootstrappers nodes.
@diasdavid Qme.. address of the first laptop's node appears in node.swarm.addrs() of the second one and vice versa. Doesn't it mean they see each other?
/ip4/127.0.0.1/tcp/4003/ws/ipfs/QmeQQdVjvKdo3Q3v2SincZhghnqUGckSF23r9ajxsq4LrJ
NEW PEERS =>
[ 'QmeQQdVjvKdo3Q3v2SincZhghnqUGckSF23r9ajxsq4LrJ',
'Qmc9bVU9yQ38C7LaeJMZ9o36tXuHVJWNY2mGZG4w8wzJBE' ]
@negamaxi any update on this issue? Still seeing an issue?
@diasdavid I'll check once I get a new laptop.
Hi @negamaxi, were you able to check this?
Hi, still not. Faced another issue #1016.
@negamaxi still an issue? Would love to make sure this is fixed if there is indeed a real problem. Could you add a failing test to our bitswap batch?
@diasdavid as for now it's not an issue for me as we moved to go-ipfs + js-ipfs-api with custom DAG implementation that works as expected. Anyway just tried with js-ipfs 0.27.7:
// pc-publisher
node.on('ready', async () => {
await node.dag.put({ a: 'b' }, dagParams)
})
// pc-receiver
node.on('ready', () => {
setInterval(async () => {
try {
const value = await node.dag.get('zdpuAw6c3ViCx5A7K4nukvmxh3ZtTHnyknmxCLQmGa6JDmDMn')
console.log(value)
} catch (e) {
console.error(e)
}
}, 1000)
})
And still no luck, although publisher id appears in receivers nodelist in about 5 seconds.
I'm not too experienced in writing tests but will be glad to take a try. Just point me which repo I should contribute to.
@diasdavid this one? https://github.com/ipfs/js-ipfs/blob/master/test/core/bitswap.spec.js
@negamaxi exactly.
@diasdavid as ipfsd-ctl relies on js-ipfs-api that currently missing dag interface I wasn't able to use IPFSFactory like other tests do. Instead I use two js-ipfs instances and transfer objects between them. Anyway those tests passed. https://github.com/negamaxi/js-ipfs/commit/7b2f5863ea1e935cd4e8d523e8c535482ab3d536
Excellent @negamaxi. Solved then :)