Skip to content

Commit

Permalink
separate getStringContent and getHumanReadable
Browse files Browse the repository at this point in the history
  • Loading branch information
maraoz committed Mar 7, 2014
1 parent dc56cb8 commit 1d72154
Show file tree
Hide file tree
Showing 4 changed files with 86 additions and 47 deletions.
118 changes: 75 additions & 43 deletions Script.js
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ function spec(b) {
}
this.chunks = [];
this.parse();
};
}
this.class = Script;

Script.TX_UNKNOWN = TX_UNKNOWN;
Expand Down Expand Up @@ -265,47 +265,6 @@ function spec(b) {
return this.buffer;
};

Script.fromStringContent = function(s) {
var chunks = [];
var split = s.split(' ');
for (var i = 0; i < split.length; i++) {
var word = split[i];
if (word === '') continue;
if (word.length > 2 && word.substring(0, 2) === '0x') {
// raw hex value
//console.log('hex value');
chunks.push(new Buffer(word.substring(2, word.length), 'hex'));
} else {
var opcode = Opcode.map['OP_' + word];
if (typeof opcode !== 'undefined') {
// op code in string form
//console.log('opcode');
chunks.push(opcode);
} else {
var integer = parseInt(word);
if (!isNaN(integer)) {
// integer
//console.log('integer');
var data = util.intToBuffer(integer);
chunks.push(data);
} else if (word[0] === '\'' && word[word.length-1] === '\'') {
// string
//console.log('string');
word = word.substring(1,word.length-1);
var hex = '';
for(var c=0;c<word.length;c++) {
hex += ''+word.charCodeAt(c).toString(16);
}
chunks.push(new Buffer(hex,'hex'));
} else {
throw new Error('Could not parse word "' +word+'" from script "'+s+'"');
}
}
}
}
return Script.fromChunks(chunks);
};

Script.prototype.getStringContent = function(truncate, maxEl) {
if (truncate === null) {
truncate = true;
Expand All @@ -325,7 +284,7 @@ function spec(b) {

if (Buffer.isBuffer(chunk)) {
if (chunk.length === 0) {
s += '\'\''
s += '\'\'';
} else {
s += '0x' + util.formatBuffer(chunk, truncate ? null : 0);
}
Expand Down Expand Up @@ -504,6 +463,79 @@ function spec(b) {
script.updateBuffer();
return script;
};

Script.fromHumanReadable = function(s) {
return new Script(Script.stringToBuffer(s));
};

Script.prototype.toHumanReadable = function() {
var s = '';
for (var i = 0, l = this.chunks.length; i < l; i++) {
var chunk = this.chunks[i];

if (i > 0) {
s += ' ';
}

if (Buffer.isBuffer(chunk)) {
if (chunk.length === 0) {
s += '0';
} else {
s += '0x' + util.formatBuffer(encodeLen(chunk.length), 0) + ' ';
s += '0x' + util.formatBuffer(chunk, 0);
}
} else {
var opcode = Opcode.reverseMap[chunk];
if (typeof opcode === 'undefined') {
opcode = '0x'+chunk.toString(16);
}
s += opcode;
}
}
return s;

};

Script.stringToBuffer = function(s) {
var buf = new Put();
var split = s.split(' ');
for (var i = 0; i < split.length; i++) {
var word = split[i];
if (word === '') continue;
if (word.length > 2 && word.substring(0, 2) === '0x') {
// raw hex value
//console.log('hex value');
buf.put(new Buffer(word.substring(2, word.length), 'hex'));
} else {
var opcode = Opcode.map['OP_' + word];
if (typeof opcode !== 'undefined') {
// op code in string form
//console.log('opcode');
buf.word8(opcode);
} else {
var integer = parseInt(word);
if (!isNaN(integer)) {
// integer
//console.log('integer');
var data = util.intToBuffer(integer);
buf.put(Script.chunksToBuffer([data]));
} else if (word[0] === '\'' && word[word.length-1] === '\'') {
// string
//console.log('string');
word = word.substring(1,word.length-1);
var hexString = '';
for(var c=0;c<word.length;c++) {
hexString += ''+word.charCodeAt(c).toString(16);
}
buf.put(Script.chunksToBuffer([new Buffer(word)]));
} else {
throw new Error('Could not parse word "' +word+'" from script "'+s+'"');
}
}
}
}
return buf.buffer();
};

Script.chunksToBuffer = function(chunks) {
var buf = new Put();
Expand Down
2 changes: 2 additions & 0 deletions ScriptInterpreter.js
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,8 @@ function spec(b) {
throw new Error("ScriptInterpreter.eval() requires a callback");
}

console.log(script);

var pc = 0;

var execStack = [];
Expand Down
9 changes: 7 additions & 2 deletions test/test.Script.js
Original file line number Diff line number Diff line change
Expand Up @@ -88,8 +88,13 @@ describe('Script', function() {
if (datum.length < 2) throw new Error('Invalid test data');
var human = datum[0] + ' ' + datum[1];
it('should parse script from human readable ' + human, function() {
var h2 = Script.fromStringContent(human).getStringContent(false, null);
Script.fromStringContent(h2).getStringContent(false, null).should.equal(h2);
//console.log('********');
//console.log(human);
var script = Script.fromHumanReadable(human);
//console.log(script);
var h2 = script.toHumanReadable();
//console.log(h2);
Script.fromHumanReadable(h2).toHumanReadable().should.equal(h2);
});
});

Expand Down
4 changes: 2 additions & 2 deletions test/test.ScriptInterpreter.js
Original file line number Diff line number Diff line change
Expand Up @@ -31,8 +31,8 @@ describe('ScriptInterpreter', function() {
it('should validate script ' + human, function(done) {
i++;
console.log(i + ' ' + human);
ScriptInterpreter.verify(Script.fromStringContent(scriptSig),
Script.fromStringContent(scriptPubKey),
ScriptInterpreter.verify(Script.fromHumanReadable(scriptSig),
Script.fromHumanReadable(scriptPubKey),
null, 0, 0, // tx, output index, and hashtype
function (err, result) {
should.not.exist(err);
Expand Down

0 comments on commit 1d72154

Please sign in to comment.