From 03578e2ba54aa271a49557b3e980115d2d9220bd Mon Sep 17 00:00:00 2001 From: "Ryan X. Charles" Date: Fri, 29 Aug 2014 19:24:51 -0700 Subject: [PATCH] Opcode ...code from bitcore --- lib/opcode.js | 168 +++++++++++++++++++++++++++++++++++++++++++++++++ test/opcode.js | 37 +++++++++++ 2 files changed, 205 insertions(+) create mode 100644 lib/opcode.js create mode 100644 test/opcode.js diff --git a/lib/opcode.js b/lib/opcode.js new file mode 100644 index 0000000..6091c7b --- /dev/null +++ b/lib/opcode.js @@ -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; diff --git a/test/opcode.js b/test/opcode.js new file mode 100644 index 0000000..843b6f4 --- /dev/null +++ b/test/opcode.js @@ -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'); + }); + + }); + +});