diff --git a/lib/script/common.js b/lib/script/common.js index 0fb0186c..33e30562 100644 --- a/lib/script/common.js +++ b/lib/script/common.js @@ -557,9 +557,17 @@ exports.formatCode = function formatCode(code) { const out = []; for (const op of code) { + // Bad push + if (op.value === -1) { + out.push('OP_INVALIDOPCODE'); + break; + } + if (op.data) { + const symbol = exports.opcodesByVal[op.value]; + // Direct push - if (!exports.opcodesByVal[op.value]) { + if (!symbol) { let size = op.value.toString(16); if (size.length < 2) size = '0' + size; @@ -568,8 +576,6 @@ exports.formatCode = function formatCode(code) { } // Pushdatas - const symbol = exports.opcodesByVal[op.value]; - let size = op.data.length.toString(16); while (size.length % 2 !== 0) @@ -581,20 +587,14 @@ exports.formatCode = function formatCode(code) { } // Opcodes - if (exports.opcodesByVal[op.value]) { - const symbol = exports.opcodesByVal[op.value]; + let symbol = exports.opcodesByVal[op.value]; + if (symbol) { out.push(symbol); continue; } - // Bad push - if (op.value === -1) { - out.push('OP_INVALIDOPCODE'); - break; - } - // Unknown opcodes - let symbol = op.value.toString(16); + symbol = op.value.toString(16); if (symbol.length < 2) symbol = '0' + symbol; diff --git a/lib/script/script.js b/lib/script/script.js index e00d09ba..9eff54bf 100644 --- a/lib/script/script.js +++ b/lib/script/script.js @@ -2692,7 +2692,7 @@ Script.prototype.fromString = function fromString(code) { if (value == null) { if (item[0] === '\'') { - assert(item[item.length - 1] === '\'', 'Unknown opcode.'); + assert(item[item.length - 1] === '\'', 'Invalid string.'); const str = item.slice(1, -1); const op = Opcode.fromString(str); bw.writeBytes(op.toRaw()); @@ -2708,10 +2708,10 @@ Script.prototype.fromString = function fromString(code) { assert(item.indexOf('0x') === 0, 'Unknown opcode.'); - const str = item.substring(2); - const data = Buffer.from(str, 'hex'); + const hex = item.substring(2); + const data = Buffer.from(hex, 'hex'); - assert(data.length === str.length / 2, 'Unknown opcode.'); + assert(data.length === hex.length / 2, 'Invalid hex string.'); bw.writeBytes(data); diff --git a/test/script-test.js b/test/script-test.js index 16484579..636664f8 100644 --- a/test/script-test.js +++ b/test/script-test.js @@ -26,11 +26,11 @@ function isSuccess(stack) { function parseScriptTest(data) { const witArr = Array.isArray(data[0]) ? data.shift() : []; - const inpHex = data[0] ? data[0].trim() : data[0] || ''; - const outHex = data[1] ? data[1].trim() : data[1] || ''; - const names = data[2] ? data[2].trim().split(/,\s*/) : []; - const expected = data[3] || ''; - let comments = Array.isArray(data[4]) ? data[4].join('. ') : data[4] || ''; + const inpHex = data[0]; + const outHex = data[1]; + const names = data[2] || 'NONE'; + const expected = data[3]; + let comments = data[4]; if (!comments) comments = outHex.slice(0, 60); @@ -46,10 +46,13 @@ function parseScriptTest(data) { const output = Script.fromString(outHex); let flags = 0; - for (const name of names) { - const flag = `VERIFY_${name}`; - assert(Script.flags[flag] != null, 'Unknown flag.'); - flags |= Script.flags[flag]; + for (const name of names.split(',')) { + const flag = Script.flags[`VERIFY_${name}`]; + + if (flag == null) + throw new Error(`Unknown flag: ${name}.`); + + flags |= flag; } return { diff --git a/test/tx-test.js b/test/tx-test.js index 40ebe0e9..7cf89a3b 100644 --- a/test/tx-test.js +++ b/test/tx-test.js @@ -9,7 +9,6 @@ const encoding = require('../lib/utils/encoding'); const random = require('../lib/crypto/random'); const consensus = require('../lib/protocol/consensus'); const TX = require('../lib/primitives/tx'); -const Coin = require('../lib/primitives/coin'); const Output = require('../lib/primitives/output'); const Outpoint = require('../lib/primitives/outpoint'); const Script = require('../lib/script/script'); @@ -36,24 +35,30 @@ const MAX_SAFE_INTEGER = Number.MAX_SAFE_INTEGER; const MAX_SAFE_ADDITION = 0xfffffffffffff; function clearCache(tx, noCache) { - if (!noCache) { - const copy = tx.clone(); - assert.strictEqual(tx.txid(), copy.txid()); - assert.strictEqual(tx.wtxid(), copy.wtxid()); + if (noCache) { + tx.refresh(); return; } - tx.refresh(); + + const copy = tx.clone(); + assert.strictEqual(tx.txid(), copy.txid()); + assert.strictEqual(tx.wtxid(), copy.wtxid()); } function parseTXTest(data) { - const [coins, hex, names] = data; + const coins = data[0]; + const hex = data[1]; + const names = data[2] || 'NONE'; let flags = 0; - for (const name of (names || '').trim().split(/,\s*/)) { - const flag = `VERIFY_${name}`; - assert(Script.flags[flag] != null, 'Unknown flag.'); - flags |= Script.flags[flag]; + for (const name of names.split(',')) { + const flag = Script.flags[`VERIFY_${name}`]; + + if (flag == null) + throw new Error(`Unknown flag: ${name}.`); + + flags |= flag; } const view = new CoinView();