orbitdb-archive / ipfs-log

Append-only log CRDT on IPFS
https://orbitdb.github.io/ipfs-log/
MIT License
398 stars 55 forks source link

issue appending to loaded Log #274

Open sdelvalle57 opened 5 years ago

sdelvalle57 commented 5 years ago

Hey Guys

I have an issue trying to append new data to a log loaded. What Im doing so far is:

  1. Creating a new entry

    const uid = 12345;
    const identity = await IdentityProvider.createIdentity({ id: dbName });
    const log = new Log(ipfs, identity, { logId: uid });
    await log.append({uid});
    const hash = await log.toMultihash();
    console.log(log.toSnapshot().values.length) //1
    return hash;
  2. With the hash returned load the Log and append new object

    const newObj = {timestamp: 12345454555};
    const identity = await IdentityProvider.createIdentity({ id: dbName });
    const log = await Log.fromMultihash(ipfs, identity, hash, {});
    await log.append(dbObject)
    console.log(log.toSnapshot().values.length) //2

    At this point everything seems ok, but when I reload to fetch the new data, Is like if I didnt append the last object:

    const identity = await IdentityProvider.createIdentity({ id: dbName });
    const log = await Log.fromMultihash(ipfs, identity, hash, {});
    console.log(log.toSnapshot().values.length) //1, and only shows the object created in step 1

    I dont really know what Im missing to keep the new object I created in step 2

Thanks

shamb0t commented 5 years ago

Hey @sdelvalle57 :wave:

toMultihash will return a different hash after each append. You are using the hash which corresponds to the log with one entry. To retrieve subsequent entries you will need to call toMultihash again after the appends to get the correct hash:

    const newObj = {timestamp: 12345454555};
    const identity = await IdentityProvider.createIdentity({ id: dbName });
    const log = await Log.fromMultihash(ipfs, identity, hash, {});
    await log.append(newObject)
    console.log(log.toSnapshot().values.length) //2
    const newHash = await log.toMultihash() // Hash of log which includes `newObj`
...
    const identity = await IdentityProvider.createIdentity({ id: dbName });
    const log = await Log.fromMultihash(ipfs, identity, newHash, { logId: uid });
    console.log(log.toSnapshot().values.length) // should be 2

Does that fix your issue?