separate getStringContent and getHumanReadable
This commit is contained in:
parent
dc56cb8d45
commit
1d72154c54
118
Script.js
118
Script.js
|
@ -38,7 +38,7 @@ function spec(b) {
|
|||
}
|
||||
this.chunks = [];
|
||||
this.parse();
|
||||
};
|
||||
}
|
||||
this.class = Script;
|
||||
|
||||
Script.TX_UNKNOWN = TX_UNKNOWN;
|
||||
|
@ -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;
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -505,6 +464,79 @@ function spec(b) {
|
|||
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();
|
||||
|
||||
|
|
|
@ -27,6 +27,8 @@ function spec(b) {
|
|||
throw new Error("ScriptInterpreter.eval() requires a callback");
|
||||
}
|
||||
|
||||
console.log(script);
|
||||
|
||||
var pc = 0;
|
||||
|
||||
var execStack = [];
|
||||
|
|
|
@ -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);
|
||||
});
|
||||
});
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue