diff --git a/lib/msg-v3/validation.js b/lib/msg-v3/validation.js index 844763e..a1d0de5 100644 --- a/lib/msg-v3/validation.js +++ b/lib/msg-v3/validation.js @@ -298,18 +298,21 @@ function validateData(msg) { * @param {Msg} msg */ function validateDataSizeHash(msg) { - const [dataHash, dataSize] = representData(msg.data) - if (!Number.isSafeInteger(dataSize) || dataSize < 0) { + const { dataHash: actualHash, dataSize: actualSize } = msg.metadata + if (!Number.isSafeInteger(actualSize) || actualSize < 0) { // prettier-ignore - return `invalid msg: dataSize ${dataSize} should have been an unsigned integer\n` + JSON.stringify(msg) + return `invalid msg: dataSize ${actualSize} should have been an unsigned integer\n` + JSON.stringify(msg) } - if (dataHash !== msg.metadata.dataHash) { + + if (msg.data === null) return + const [expectedHash, expectedSize] = representData(msg.data) + if (actualHash !== expectedHash) { // prettier-ignore - return `invalid msg: data hash "${dataHash}" does not match metadata.dataHash "${msg.metadata.dataHash}"\n` + JSON.stringify(msg) + return `invalid msg: metadata.dataHash "${actualHash}" should have been "${expectedHash}"\n` + JSON.stringify(msg) } - if (dataSize !== msg.metadata.dataSize) { + if (expectedSize !== msg.metadata.dataSize) { // prettier-ignore - return `invalid msg: data size "${dataSize}" does not match metadata.dataSize "${msg.metadata.dataSize}"\n` + JSON.stringify(msg) + return `invalid msg: metadata.dataSize ${actualSize} should have been "${expectedSize}"\n` + JSON.stringify(msg) } } diff --git a/test/msg-v3/validate.test.js b/test/msg-v3/validate.test.js index c64ec9b..7d1ed3b 100644 --- a/test/msg-v3/validate.test.js +++ b/test/msg-v3/validate.test.js @@ -136,3 +136,32 @@ test('validate 2nd forked msg', (t) => { const err = MsgV3.validate(msg1B, tangle, pubkeys, msgID1B, mootID) assert.ifError(err, 'valid 2nd forked msg') }) + +test('validate erased msg', (t) => { + const keypair = Keypair.generate('ed25519', 'alice') + const account = MsgV3.getMsgID( + MsgV3.createAccount(keypair, 'person', 'alice') + ) + const pubkeys = new Set([keypair.public]) + + const moot = MsgV3.createMoot(account, 'post', keypair) + const mootID = MsgV3.getMsgID(moot) + const tangle = new MsgV3.Tangle(mootID) + tangle.add(mootID, moot) + + const msg1 = MsgV3.create({ + account, + accountTips: [account], + domain: 'post', + data: { text: 'Hello world!' }, + tangles: { + [mootID]: tangle, + }, + keypair, + }) + msg1.data = null + const msgID1 = MsgV3.getMsgID(msg1) + + const err = MsgV3.validate(msg1, tangle, pubkeys, msgID1, mootID) + assert.ifError(err, 'valid erased msg') +})