Merge pull request #470 nodar-chkuaselidze/fix/reject-cache
fix malleability check in mempool
This commit is contained in:
commit
f585d8616d
@ -1021,7 +1021,7 @@ class Mempool extends EventEmitter {
|
|||||||
|
|
||||||
// If it succeeded, segwit may be causing the
|
// If it succeeded, segwit may be causing the
|
||||||
// failure. Try with segwit but without cleanstack.
|
// failure. Try with segwit but without cleanstack.
|
||||||
flags |= Script.flags.VERIFY_CLEANSTACK;
|
flags |= Script.flags.VERIFY_WITNESS;
|
||||||
|
|
||||||
// Cleanstack was causing the failure.
|
// Cleanstack was causing the failure.
|
||||||
if (await this.verifyResult(tx, view, flags))
|
if (await this.verifyResult(tx, view, flags))
|
||||||
|
|||||||
@ -15,6 +15,7 @@ const KeyRing = require('../lib/primitives/keyring');
|
|||||||
const Address = require('../lib/primitives/address');
|
const Address = require('../lib/primitives/address');
|
||||||
const Outpoint = require('../lib/primitives/outpoint');
|
const Outpoint = require('../lib/primitives/outpoint');
|
||||||
const Script = require('../lib/script/script');
|
const Script = require('../lib/script/script');
|
||||||
|
const opcodes = Script.opcodes;
|
||||||
const Witness = require('../lib/script/witness');
|
const Witness = require('../lib/script/witness');
|
||||||
const MemWallet = require('./util/memwallet');
|
const MemWallet = require('./util/memwallet');
|
||||||
const ALL = Script.hashType.ALL;
|
const ALL = Script.hashType.ALL;
|
||||||
@ -337,6 +338,54 @@ describe('Mempool', function() {
|
|||||||
assert(!mempool.hasReject(tx.hash()));
|
assert(!mempool.hasReject(tx.hash()));
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('should cache a non-malleated tx with non-empty stack', async () => {
|
||||||
|
// Wrap in P2SH, so we pass standardness checks.
|
||||||
|
const key = KeyRing.generate();
|
||||||
|
|
||||||
|
{
|
||||||
|
const script = new Script();
|
||||||
|
script.pushOp(opcodes.OP_1);
|
||||||
|
script.compile();
|
||||||
|
key.script = script;
|
||||||
|
}
|
||||||
|
|
||||||
|
const wallet = new MemWallet();
|
||||||
|
const script = Script.fromAddress(wallet.getAddress());
|
||||||
|
const dummyCoin = dummyInput(script, random.randomBytes(32));
|
||||||
|
|
||||||
|
// spend first output
|
||||||
|
const t1 = new MTX();
|
||||||
|
t1.addOutput(key.getAddress(), 50000);
|
||||||
|
t1.addCoin(dummyCoin);
|
||||||
|
wallet.sign(t1);
|
||||||
|
|
||||||
|
const t2 = new MTX();
|
||||||
|
t2.addCoin(Coin.fromTX(t1, 0, 0));
|
||||||
|
t2.addOutput(wallet.getAddress(), 40000);
|
||||||
|
|
||||||
|
{
|
||||||
|
const script = new Script();
|
||||||
|
script.pushOp(opcodes.OP_1);
|
||||||
|
script.pushData(key.script.toRaw());
|
||||||
|
script.compile();
|
||||||
|
|
||||||
|
t2.inputs[0].script = script;
|
||||||
|
}
|
||||||
|
|
||||||
|
await mempool.addTX(t1.toTX());
|
||||||
|
|
||||||
|
let err;
|
||||||
|
try {
|
||||||
|
await mempool.addTX(t2.toTX());
|
||||||
|
} catch (e) {
|
||||||
|
err = e;
|
||||||
|
}
|
||||||
|
|
||||||
|
assert(err);
|
||||||
|
assert(!err.malleated);
|
||||||
|
assert(mempool.hasReject(t2.hash()));
|
||||||
|
});
|
||||||
|
|
||||||
it('should not cache a malleated wtx with wit removed', async () => {
|
it('should not cache a malleated wtx with wit removed', async () => {
|
||||||
const key = KeyRing.generate();
|
const key = KeyRing.generate();
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user