script: use asMinimalOP for ASM/decompile

This commit is contained in:
Daniel Cousens 2017-08-23 17:11:47 +10:00 committed by Daniel Cousens
parent 152eed57a0
commit e7c59c4b8b
3 changed files with 31 additions and 23 deletions

View file

@ -24,6 +24,13 @@ function isPushOnly (value) {
return types.Array(value) && value.every(isPushOnlyChunk)
}
function asMinimalOP (buffer) {
if (buffer.length === 0) return OPS.OP_0
if (buffer.length !== 1) return
if (buffer[0] >= 1 && buffer[0] <= 16) return OP_INT_BASE + buffer[0]
if (buffer[0] === 0x81) return OPS.OP_1NEGATE
}
function compile (chunks) {
// TODO: remove me
if (Buffer.isBuffer(chunks)) return chunks
@ -34,7 +41,7 @@ function compile (chunks) {
// data chunk
if (Buffer.isBuffer(chunk)) {
// adhere to BIP62.3, minimal push policy
if (chunk.length === 1 && (chunk[0] === 0x81 || (chunk[0] >= 1 && chunk[0] <= 16))) {
if (chunk.length === 1 && asMinimalOP(chunk) !== undefined) {
return accum + 1
}
@ -52,21 +59,14 @@ function compile (chunks) {
// data chunk
if (Buffer.isBuffer(chunk)) {
// adhere to BIP62.3, minimal push policy
if (chunk.length === 1 && chunk[0] >= 1 && chunk[0] <= 16) {
var opcode = OP_INT_BASE + chunk[0]
var opcode = asMinimalOP(chunk)
if (opcode !== undefined) {
buffer.writeUInt8(opcode, offset)
offset += 1
return
}
if (chunk.length === 1 && chunk[0] === 0x81) {
buffer.writeUInt8(OPS.OP_1NEGATE, offset)
offset += 1
return
}
offset += pushdata.encode(buffer, chunk.length, offset)
chunk.copy(buffer, offset)
offset += chunk.length
@ -107,7 +107,13 @@ function decompile (buffer) {
var data = buffer.slice(i, i + d.number)
i += d.number
chunks.push(data)
// decompile minimally
var op = asMinimalOP(data)
if (op !== undefined) {
chunks.push(op)
} else {
chunks.push(data)
}
// opcode
} else {
@ -127,7 +133,11 @@ function toASM (chunks) {
return chunks.map(function (chunk) {
// data?
if (Buffer.isBuffer(chunk)) return chunk.toString('hex')
if (Buffer.isBuffer(chunk)) {
var op = asMinimalOP(chunk)
if (op === undefined) return chunk.toString('hex')
chunk = op
}
// opcode!
return REVERSE_OPS[chunk]

View file

@ -155,7 +155,7 @@
"06"
],
"nonstandard": {
"scriptSig": "06",
"scriptSig": "OP_6",
"scriptSigHex": "0106"
}
},

View file

@ -24,7 +24,6 @@ describe('script', function () {
fixtures.valid.forEach(function (f) {
it('encodes/decodes ' + f.asm, function () {
var scriptSig = bscript.fromASM(f.asm)
assert.strictEqual(bscript.toASM(scriptSig), f.asm)
})
})
@ -52,17 +51,16 @@ describe('script', function () {
describe('toStack', function () {
fixtures.valid.forEach(function (f) {
it('returns ' + !!f.stack + ' for ' + f.asm, function () {
if (!f.stack || !f.asm) return
var script = bscript.fromASM(f.asm)
if (f.stack && f.asm) {
try {
var stack = bscript.toStack(script)
assert.deepEqual(stack.map(function (x) { return x.toString('hex') }), f.stack)
assert.equal(bscript.toASM(bscript.compile(stack)), f.asm, 'should rebuild same script from stack')
} catch (e) {
assert.strictEqual(f.stack, undefined)
}
}
var stack = bscript.toStack(script)
assert.deepEqual(stack.map(function (x) {
return x.toString('hex')
}), f.stack)
assert.equal(bscript.toASM(bscript.compile(stack)), f.asm, 'should rebuild same script from stack')
})
})
})