mirror of https://codeberg.org/pzp/pzp-db.git
moot can be added without sigkey validation
This commit is contained in:
parent
0c86b43d22
commit
ba6f727417
10
lib/index.js
10
lib/index.js
|
@ -438,6 +438,7 @@ function initDB(peer, config) {
|
||||||
* @returns {Error | null}
|
* @returns {Error | null}
|
||||||
*/
|
*/
|
||||||
function verifyRec(rec, tangleID) {
|
function verifyRec(rec, tangleID) {
|
||||||
|
let err
|
||||||
// TODO: optimize this. This may be slow if you're adding many msgs in a
|
// TODO: optimize this. This may be slow if you're adding many msgs in a
|
||||||
// row, because it creates a new Map() each time. Perhaps with QuickLRU
|
// row, because it creates a new Map() each time. Perhaps with QuickLRU
|
||||||
const tangle = new DBTangle(tangleID, records(), get)
|
const tangle = new DBTangle(tangleID, records(), get)
|
||||||
|
@ -445,6 +446,14 @@ function initDB(peer, config) {
|
||||||
tangle.add(rec.id, rec.msg)
|
tangle.add(rec.id, rec.msg)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (MsgV4.isMoot(rec.msg)) {
|
||||||
|
const sigkeys = new Set()
|
||||||
|
if ((err = MsgV4.validate(rec.msg, tangle, sigkeys, rec.id, tangleID))) {
|
||||||
|
return new Error('Invalid msg', { cause: err })
|
||||||
|
}
|
||||||
|
return null
|
||||||
|
}
|
||||||
|
|
||||||
// Identify the account and its sigkeys:
|
// Identify the account and its sigkeys:
|
||||||
/** @type {Tangle | null} */
|
/** @type {Tangle | null} */
|
||||||
let accountTangle
|
let accountTangle
|
||||||
|
@ -460,7 +469,6 @@ function initDB(peer, config) {
|
||||||
return new Error('Refusing a ghost msg to come back')
|
return new Error('Refusing a ghost msg to come back')
|
||||||
}
|
}
|
||||||
|
|
||||||
let err
|
|
||||||
if ((err = MsgV4.validate(rec.msg, tangle, sigkeys, rec.id, tangleID))) {
|
if ((err = MsgV4.validate(rec.msg, tangle, sigkeys, rec.id, tangleID))) {
|
||||||
return new Error('Invalid msg', { cause: err })
|
return new Error('Invalid msg', { cause: err })
|
||||||
}
|
}
|
||||||
|
|
|
@ -20,15 +20,16 @@ test('add()', async (t) => {
|
||||||
const id = MsgV4.getMsgID(accountMsg0)
|
const id = MsgV4.getMsgID(accountMsg0)
|
||||||
|
|
||||||
await t.test('basic use case', async () => {
|
await t.test('basic use case', async () => {
|
||||||
|
// Moot can be added without validating its account & sigkey
|
||||||
|
const moot = MsgV4.createMoot(id, 'post', keypair)
|
||||||
|
const mootID = MsgV4.getMsgID(moot)
|
||||||
|
const recMoot = await p(peer.db.add)(moot, mootID)
|
||||||
|
assert.equal(recMoot.msg.metadata.dataSize, 0, 'moot added')
|
||||||
|
|
||||||
await p(peer.db.add)(accountMsg0, id)
|
await p(peer.db.add)(accountMsg0, id)
|
||||||
|
|
||||||
const rootMsg = MsgV4.createMoot(id, 'post', keypair)
|
const tangle = new MsgV4.Tangle(mootID)
|
||||||
const rootID = MsgV4.getMsgID(rootMsg)
|
tangle.add(recMoot.id, recMoot.msg)
|
||||||
|
|
||||||
const recRoot = await p(peer.db.add)(rootMsg, rootID)
|
|
||||||
assert.equal(recRoot.msg.metadata.dataSize, 0, 'root msg added')
|
|
||||||
const tangle = new MsgV4.Tangle(rootID)
|
|
||||||
tangle.add(recRoot.id, recRoot.msg)
|
|
||||||
|
|
||||||
const inputMsg = MsgV4.create({
|
const inputMsg = MsgV4.create({
|
||||||
keypair,
|
keypair,
|
||||||
|
@ -37,7 +38,7 @@ test('add()', async (t) => {
|
||||||
account: id,
|
account: id,
|
||||||
accountTips: [id],
|
accountTips: [id],
|
||||||
tangles: {
|
tangles: {
|
||||||
[rootID]: tangle,
|
[mootID]: tangle,
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
|
|
||||||
|
@ -49,11 +50,11 @@ test('add()', async (t) => {
|
||||||
})
|
})
|
||||||
|
|
||||||
await t.test('concurrent add of the same msg appends just one', async () => {
|
await t.test('concurrent add of the same msg appends just one', async () => {
|
||||||
const rootMsg = MsgV4.createMoot(id, 'whatever', keypair)
|
const moot = MsgV4.createMoot(id, 'whatever', keypair)
|
||||||
const rootID = MsgV4.getMsgID(rootMsg)
|
const mootID = MsgV4.getMsgID(moot)
|
||||||
await Promise.all([
|
await Promise.all([
|
||||||
p(peer.db.add)(rootMsg, rootID),
|
p(peer.db.add)(moot, mootID),
|
||||||
p(peer.db.add)(rootMsg, rootID),
|
p(peer.db.add)(moot, mootID),
|
||||||
])
|
])
|
||||||
|
|
||||||
const stats = await p(peer.db.log.stats)()
|
const stats = await p(peer.db.log.stats)()
|
||||||
|
@ -61,12 +62,12 @@ test('add()', async (t) => {
|
||||||
})
|
})
|
||||||
|
|
||||||
await t.test('dataful msg replacing a dataless msg', async (t) => {
|
await t.test('dataful msg replacing a dataless msg', async (t) => {
|
||||||
const rootMsg = MsgV4.createMoot(id, 'something', keypair)
|
const moot = MsgV4.createMoot(id, 'something', keypair)
|
||||||
const rootID = MsgV4.getMsgID(rootMsg)
|
const mootID = MsgV4.getMsgID(moot)
|
||||||
await p(peer.db.add)(rootMsg, rootID)
|
await p(peer.db.add)(moot, mootID)
|
||||||
|
|
||||||
const tangle = new MsgV4.Tangle(rootID)
|
const tangle = new MsgV4.Tangle(mootID)
|
||||||
tangle.add(rootID, rootMsg)
|
tangle.add(mootID, moot)
|
||||||
|
|
||||||
const msg1Dataful = MsgV4.create({
|
const msg1Dataful = MsgV4.create({
|
||||||
keypair,
|
keypair,
|
||||||
|
@ -75,7 +76,7 @@ test('add()', async (t) => {
|
||||||
domain: 'something',
|
domain: 'something',
|
||||||
data: { text: 'first' },
|
data: { text: 'first' },
|
||||||
tangles: {
|
tangles: {
|
||||||
[rootID]: tangle,
|
[mootID]: tangle,
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
const msg1Dataless = { ...msg1Dataful, data: null }
|
const msg1Dataless = { ...msg1Dataful, data: null }
|
||||||
|
@ -90,15 +91,15 @@ test('add()', async (t) => {
|
||||||
domain: 'something',
|
domain: 'something',
|
||||||
data: { text: 'second' },
|
data: { text: 'second' },
|
||||||
tangles: {
|
tangles: {
|
||||||
[rootID]: tangle,
|
[mootID]: tangle,
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
const msg2ID = MsgV4.getMsgID(msg2)
|
const msg2ID = MsgV4.getMsgID(msg2)
|
||||||
|
|
||||||
await p(peer.db.add)(msg1Dataless, rootID)
|
await p(peer.db.add)(msg1Dataless, mootID)
|
||||||
await p(peer.db.add)(msg2, rootID)
|
await p(peer.db.add)(msg2, mootID)
|
||||||
|
|
||||||
// We expect there to be 3 msgs: root, dataless msg1, dataful msg2
|
// We expect there to be 3 msgs: moot, dataless msg1, dataful msg2
|
||||||
{
|
{
|
||||||
const ids = []
|
const ids = []
|
||||||
const texts = []
|
const texts = []
|
||||||
|
@ -108,15 +109,15 @@ test('add()', async (t) => {
|
||||||
texts.push(rec.msg.data?.text)
|
texts.push(rec.msg.data?.text)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
assert.deepEqual(ids, [rootID, msg1ID, msg2ID])
|
assert.deepEqual(ids, [mootID, msg1ID, msg2ID])
|
||||||
assert.deepEqual(texts, [undefined, undefined, 'second'])
|
assert.deepEqual(texts, [undefined, undefined, 'second'])
|
||||||
const stats = await p(peer.db.log.stats)()
|
const stats = await p(peer.db.log.stats)()
|
||||||
assert.deepEqual(stats, { totalBytes: 3718, deletedBytes: 0 })
|
assert.deepEqual(stats, { totalBytes: 3718, deletedBytes: 0 })
|
||||||
}
|
}
|
||||||
|
|
||||||
await p(peer.db.add)(msg1Dataful, rootID)
|
await p(peer.db.add)(msg1Dataful, mootID)
|
||||||
|
|
||||||
// We expect there to be 3 msgs: root, (deleted) dataless msg1, dataful msg2
|
// We expect there to be 3 msgs: moot, (deleted) dataless msg1, dataful msg2
|
||||||
// and dataful msg1 appended at the end
|
// and dataful msg1 appended at the end
|
||||||
{
|
{
|
||||||
const ids = []
|
const ids = []
|
||||||
|
@ -127,7 +128,7 @@ test('add()', async (t) => {
|
||||||
texts.push(rec.msg.data?.text)
|
texts.push(rec.msg.data?.text)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
assert.deepEqual(ids, [rootID, msg2ID, msg1ID])
|
assert.deepEqual(ids, [mootID, msg2ID, msg1ID])
|
||||||
assert.deepEqual(texts, [undefined, 'second', 'first'])
|
assert.deepEqual(texts, [undefined, 'second', 'first'])
|
||||||
const stats = await p(peer.db.log.stats)()
|
const stats = await p(peer.db.log.stats)()
|
||||||
assert.deepEqual(stats, { totalBytes: 4340, deletedBytes: 610 })
|
assert.deepEqual(stats, { totalBytes: 4340, deletedBytes: 610 })
|
||||||
|
|
Loading…
Reference in New Issue