From 55d8c4156a747c5442da56a68ddbd7e4b381256e Mon Sep 17 00:00:00 2001 From: Braydon Fuller Date: Mon, 6 Jul 2015 20:24:15 -0400 Subject: [PATCH] Add tests for script.toASM() and new method script.fromASM() --- lib/script/script.js | 42 ++++++++++++++++++++++++++++++++++++++++++ test/script/script.js | 18 ++++++++++++++++++ 2 files changed, 60 insertions(+) diff --git a/lib/script/script.js b/lib/script/script.js index 13d69a7..6469255 100644 --- a/lib/script/script.js +++ b/lib/script/script.js @@ -134,6 +134,48 @@ Script.prototype.toBuffer = function() { return bw.concat(); }; +Script.fromASM = function(str) { + var script = new Script(); + script.chunks = []; + + var tokens = str.split(' '); + var i = 0; + while (i < tokens.length) { + var token = tokens[i]; + var opcode = Opcode(token); + var opcodenum = opcode.toNumber(); + + if (_.isUndefined(opcodenum)) { + var buf = new Buffer(tokens[i], 'hex'); + script.chunks.push({ + buf: buf, + len: buf.length, + opcodenum: buf.length + }); + i = i + 1; + } else if (opcodenum === Opcode.OP_PUSHDATA1 || + opcodenum === Opcode.OP_PUSHDATA2 || + opcodenum === Opcode.OP_PUSHDATA4) { + script.chunks.push({ + buf: new Buffer(tokens[i + 2], 'hex'), + len: parseInt(tokens[i + 1]), + opcodenum: opcodenum + }); + i = i + 3; + } else { + script.chunks.push({ + opcodenum: opcodenum + }); + i = i + 1; + } + } + return script; +}; + +Script.fromHex = function(str) { + return new Script(new buffer.Buffer(str, 'hex')); +}; + Script.fromString = function(str) { if (JSUtil.isHexa(str) || str.length === 0) { return new Script(new buffer.Buffer(str, 'hex')); diff --git a/test/script/script.js b/test/script/script.js index 7ecfb20..f786016 100644 --- a/test/script/script.js +++ b/test/script/script.js @@ -159,6 +159,19 @@ describe('Script', function() { }); + describe('#fromASM', function() { + it('should parse this known script in ASM', function() { + var asm = 'OP_DUP OP_HASH160 f4c03610e60ad15100929cc23da2f3a799af1725 OP_EQUALVERIFY OP_CHECKSIG'; + var script = Script.fromASM(asm); + script.chunks[0].opcodenum.should.equal(Opcode.OP_DUP); + script.chunks[1].opcodenum.should.equal(Opcode.OP_HASH160); + script.chunks[2].opcodenum.should.equal(20); + script.chunks[2].buf.toString('hex').should.equal('f4c03610e60ad15100929cc23da2f3a799af1725'); + script.chunks[3].opcodenum.should.equal(Opcode.OP_EQUALVERIFY); + script.chunks[4].opcodenum.should.equal(Opcode.OP_CHECKSIG); + }); + }); + describe('#fromString', function() { it('should parse these known scripts', function() { @@ -191,6 +204,11 @@ describe('Script', function() { script.toString().toString('hex').should.equal('OP_0 OP_PUSHDATA4 3 0x010203 OP_0'); }); + it('should output this known script as ASM', function() { + var script = Script.fromHex('76a914f4c03610e60ad15100929cc23da2f3a799af172588ac'); + script.toASM().should.equal('OP_DUP OP_HASH160 f4c03610e60ad15100929cc23da2f3a799af1725 OP_EQUALVERIFY OP_CHECKSIG'); + }); + }); describe('toHex', function() {