Ryan X. Charles
11 years ago
2 changed files with 205 additions and 0 deletions
@ -0,0 +1,168 @@ |
|||||
|
function Opcode(num) { |
||||
|
if (!(this instanceof Opcode)) |
||||
|
return new Opcode(num); |
||||
|
if (typeof num === 'number') { |
||||
|
this.num = num; |
||||
|
} else if (num) { |
||||
|
var obj = num; |
||||
|
this.set(obj); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
Opcode.prototype.set = function(obj) { |
||||
|
this.num = typeof obj.num !== 'undefined' ? obj.num : this.num; |
||||
|
return this; |
||||
|
}; |
||||
|
|
||||
|
Opcode.prototype.toString = function() { |
||||
|
return Opcode.reverseMap[this.num]; |
||||
|
}; |
||||
|
|
||||
|
Opcode.map = { |
||||
|
// push value
|
||||
|
OP_FALSE: 0, |
||||
|
OP_0: 0, |
||||
|
OP_PUSHDATA1: 76, |
||||
|
OP_PUSHDATA2: 77, |
||||
|
OP_PUSHDATA4: 78, |
||||
|
OP_1NEGATE: 79, |
||||
|
OP_RESERVED: 80, |
||||
|
OP_TRUE: 81, |
||||
|
OP_1: 81, |
||||
|
OP_2: 82, |
||||
|
OP_3: 83, |
||||
|
OP_4: 84, |
||||
|
OP_5: 85, |
||||
|
OP_6: 86, |
||||
|
OP_7: 87, |
||||
|
OP_8: 88, |
||||
|
OP_9: 89, |
||||
|
OP_10: 90, |
||||
|
OP_11: 91, |
||||
|
OP_12: 92, |
||||
|
OP_13: 93, |
||||
|
OP_14: 94, |
||||
|
OP_15: 95, |
||||
|
OP_16: 96, |
||||
|
|
||||
|
// control
|
||||
|
OP_NOP: 97, |
||||
|
OP_VER: 98, |
||||
|
OP_IF: 99, |
||||
|
OP_NOTIF: 100, |
||||
|
OP_VERIF: 101, |
||||
|
OP_VERNOTIF: 102, |
||||
|
OP_ELSE: 103, |
||||
|
OP_ENDIF: 104, |
||||
|
OP_VERIFY: 105, |
||||
|
OP_RETURN: 106, |
||||
|
|
||||
|
// stack ops
|
||||
|
OP_TOALTSTACK: 107, |
||||
|
OP_FROMALTSTACK: 108, |
||||
|
OP_2DROP: 109, |
||||
|
OP_2DUP: 110, |
||||
|
OP_3DUP: 111, |
||||
|
OP_2OVER: 112, |
||||
|
OP_2ROT: 113, |
||||
|
OP_2SWAP: 114, |
||||
|
OP_IFDUP: 115, |
||||
|
OP_DEPTH: 116, |
||||
|
OP_DROP: 117, |
||||
|
OP_DUP: 118, |
||||
|
OP_NIP: 119, |
||||
|
OP_OVER: 120, |
||||
|
OP_PICK: 121, |
||||
|
OP_ROLL: 122, |
||||
|
OP_ROT: 123, |
||||
|
OP_SWAP: 124, |
||||
|
OP_TUCK: 125, |
||||
|
|
||||
|
// splice ops
|
||||
|
OP_CAT: 126, |
||||
|
OP_SUBSTR: 127, |
||||
|
OP_LEFT: 128, |
||||
|
OP_RIGHT: 129, |
||||
|
OP_SIZE: 130, |
||||
|
|
||||
|
// bit logic
|
||||
|
OP_INVERT: 131, |
||||
|
OP_AND: 132, |
||||
|
OP_OR: 133, |
||||
|
OP_XOR: 134, |
||||
|
OP_EQUAL: 135, |
||||
|
OP_EQUALVERIFY: 136, |
||||
|
OP_RESERVED1: 137, |
||||
|
OP_RESERVED2: 138, |
||||
|
|
||||
|
// numeric
|
||||
|
OP_1ADD: 139, |
||||
|
OP_1SUB: 140, |
||||
|
OP_2MUL: 141, |
||||
|
OP_2DIV: 142, |
||||
|
OP_NEGATE: 143, |
||||
|
OP_ABS: 144, |
||||
|
OP_NOT: 145, |
||||
|
OP_0NOTEQUAL: 146, |
||||
|
|
||||
|
OP_ADD: 147, |
||||
|
OP_SUB: 148, |
||||
|
OP_MUL: 149, |
||||
|
OP_DIV: 150, |
||||
|
OP_MOD: 151, |
||||
|
OP_LSHIFT: 152, |
||||
|
OP_RSHIFT: 153, |
||||
|
|
||||
|
OP_BOOLAND: 154, |
||||
|
OP_BOOLOR: 155, |
||||
|
OP_NUMEQUAL: 156, |
||||
|
OP_NUMEQUALVERIFY: 157, |
||||
|
OP_NUMNOTEQUAL: 158, |
||||
|
OP_LESSTHAN: 159, |
||||
|
OP_GREATERTHAN: 160, |
||||
|
OP_LESSTHANOREQUAL: 161, |
||||
|
OP_GREATERTHANOREQUAL: 162, |
||||
|
OP_MIN: 163, |
||||
|
OP_MAX: 164, |
||||
|
|
||||
|
OP_WITHIN: 165, |
||||
|
|
||||
|
// crypto
|
||||
|
OP_RIPEMD160: 166, |
||||
|
OP_SHA1: 167, |
||||
|
OP_SHA256: 168, |
||||
|
OP_HASH160: 169, |
||||
|
OP_HASH256: 170, |
||||
|
OP_CODESEPARATOR: 171, |
||||
|
OP_CHECKSIG: 172, |
||||
|
OP_CHECKSIGVERIFY: 173, |
||||
|
OP_CHECKMULTISIG: 174, |
||||
|
OP_CHECKMULTISIGVERIFY: 175, |
||||
|
|
||||
|
// expansion
|
||||
|
OP_NOP1: 176, |
||||
|
OP_NOP2: 177, |
||||
|
OP_NOP3: 178, |
||||
|
OP_NOP4: 179, |
||||
|
OP_NOP5: 180, |
||||
|
OP_NOP6: 181, |
||||
|
OP_NOP7: 182, |
||||
|
OP_NOP8: 183, |
||||
|
OP_NOP9: 184, |
||||
|
OP_NOP10: 185, |
||||
|
|
||||
|
// template matching params
|
||||
|
OP_PUBKEYHASH: 253, |
||||
|
OP_PUBKEY: 254, |
||||
|
OP_INVALIDOPCODE: 255 |
||||
|
}; |
||||
|
|
||||
|
Opcode.reverseMap = []; |
||||
|
|
||||
|
for (var k in Opcode.map) { |
||||
|
if (Opcode.map.hasOwnProperty(k)) { |
||||
|
Opcode.reverseMap[Opcode.map[k]] = k; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
module.exports = Opcode; |
@ -0,0 +1,37 @@ |
|||||
|
var should = require('chai').should(); |
||||
|
var Opcode = require('../lib/opcode'); |
||||
|
|
||||
|
describe('Opcode', function() { |
||||
|
|
||||
|
it('should create a new Opcode', function() { |
||||
|
var opcode = new Opcode(5); |
||||
|
}); |
||||
|
|
||||
|
it('should convert to a string with this handy syntax', function() { |
||||
|
Opcode(0).toString().should.equal('OP_0'); |
||||
|
Opcode(97).toString().should.equal('OP_NOP'); |
||||
|
Opcode(96).toString().should.equal('OP_16'); |
||||
|
}); |
||||
|
|
||||
|
describe('@map', function() { |
||||
|
|
||||
|
it('should have a map containing 116 elements', function() { |
||||
|
var i = 0; |
||||
|
for (var key in Opcode.map) { |
||||
|
i++; |
||||
|
} |
||||
|
i.should.equal(116); |
||||
|
}); |
||||
|
|
||||
|
}); |
||||
|
|
||||
|
describe('@reverseMap', function() { |
||||
|
|
||||
|
it('should exist and have op 185', function() { |
||||
|
should.exist(Opcode.reverseMap); |
||||
|
Opcode.reverseMap[185].should.equal('OP_NOP10'); |
||||
|
}); |
||||
|
|
||||
|
}); |
||||
|
|
||||
|
}); |
Loading…
Reference in new issue