script: use asMinimalOP for ASM/decompile
This commit is contained in:
parent
152eed57a0
commit
e7c59c4b8b
3 changed files with 31 additions and 23 deletions
src
|
@ -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]
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue