Script().writeXX convenience methods

Script().writeOp('OP_CHECKMULTISIG'), or...
Script().writeOp(174), or...
Script().writeBuffer([push data buffer]), or...
Script().write([op string, number, or push data buffer])

These convenience methods let you easily write a script.
This commit is contained in:
Ryan X. Charles 2014-09-23 21:28:03 -07:00
parent 54818c0bd8
commit b37e39abca
2 changed files with 82 additions and 0 deletions

View File

@ -234,4 +234,46 @@ Script.prototype.isScripthashIn = function() {
}
};
Script.prototype.write = function(obj) {
if (typeof obj === 'string')
this.writeOp(obj);
else if (typeof obj === 'number')
this.writeOp(obj);
else if (Buffer.isBuffer(obj))
this.writeBuffer(obj);
else if (typeof obj === 'object')
this.chunks.push(obj);
else
throw new Error('Invalid script chunk');
return this;
};
Script.prototype.writeOp = function(str) {
if (typeof str === 'number')
this.chunks.push(str);
else
this.chunks.push(Opcode(str).toNumber());
return this;
};
Script.prototype.writeBuffer = function(buf) {
var opcodenum;
var len = buf.length;
if (buf.length > 0 && buf.length < Opcode.map.OP_PUSHDATA1) {
opcodenum = buf.length;
} else if (buf.length < Math.pow(2, 8)) {
opcodenum = Opcode.map.OP_PUSHDATA1;
} else if (buf.length < Math.pow(2, 16)) {
opcodenum = Opcode.map.OP_PUSHDATA2;
} else if (buf.length < Math.pow(2, 32)) {
opcodenum = Opcode.map.OP_PUSHDATA4;
}
this.chunks.push({
buf: buf,
len: len,
opcodenum: opcodenum
});
return this;
};
module.exports = Script;

View File

@ -265,4 +265,44 @@ describe('Script', function() {
});
describe('#writeOp', function() {
it('should write these ops', function() {
Script().writeOp('OP_CHECKMULTISIG').toString().should.equal('OP_CHECKMULTISIG');
Script().writeOp(Opcode.map.OP_CHECKMULTISIG).toString().should.equal('OP_CHECKMULTISIG');
});
});
describe('#writeBuffer', function() {
it('should write these push data', function() {
var buf = new Buffer(1);
buf.fill(0);
Script().writeBuffer(buf).toString().should.equal('1 0x00');
buf = new Buffer(255);
buf.fill(0);
Script().writeBuffer(buf).toString().should.equal('OP_PUSHDATA1 255 0x' + buf.toString('hex'));
buf = new Buffer(256);
buf.fill(0);
Script().writeBuffer(buf).toString().should.equal('OP_PUSHDATA2 256 0x' + buf.toString('hex'));
buf = new Buffer(Math.pow(2, 16));
buf.fill(0);
Script().writeBuffer(buf).toString().should.equal('OP_PUSHDATA4 ' + Math.pow(2, 16) + ' 0x' + buf.toString('hex'));
});
});
describe('#write', function() {
it('should write both pushdata and non-pushdata chunks', function() {
Script().write('OP_CHECKMULTISIG').toString().should.equal('OP_CHECKMULTISIG');
Script().write(Opcode.map.OP_CHECKMULTISIG).toString().should.equal('OP_CHECKMULTISIG');
var buf = new Buffer(1);
buf.fill(0);
Script().write(buf).toString().should.equal('1 0x00');
});
});
});