match bitcore style standards, rename arg, set default to true

This commit is contained in:
Gregg Zigler 2015-06-24 14:18:55 -04:00
parent a4b8c06a2d
commit 183ffab02b
2 changed files with 41 additions and 25 deletions

View File

@ -841,15 +841,16 @@ Script.prototype.checkMinimalPush = function(i) {
/** /**
* Comes from bitcoind's script DecodOP_N function * Comes from bitcoind's script DecodOP_N function
* @param {number} opcode * @param {number} opcode
* @returns {number} numeric value in range of -1 to 16 * @returns {number} numeric value in range of 0 to 16
*/ */
Script.prototype._decodeOP_N = function(opcode) { Script.prototype._decodeOP_N = function(opcode) {
if (opcode === Opcode.OP_0) if (opcode === Opcode.OP_0) {
return 0; return 0;
else if (opcode >= Opcode.OP_1 && opcode <= Opcode.OP_16) } else if (opcode >= Opcode.OP_1 && opcode <= Opcode.OP_16) {
return opcode - (Opcode.OP_1 - 1); return opcode - (Opcode.OP_1 - 1);
else } else {
throw new Error('Invalid opcode: ' + JSON.stringify(opcode)); throw new Error('Invalid opcode: ' + JSON.stringify(opcode));
}
}; };
/** /**
@ -857,20 +858,21 @@ Script.prototype._decodeOP_N = function(opcode) {
* @param {boolean} use current (true) or pre-version-0.6 (false) logic * @param {boolean} use current (true) or pre-version-0.6 (false) logic
* @returns {number} number of signature operations required by this script * @returns {number} number of signature operations required by this script
*/ */
Script.prototype.getSignatureOperationsCount = function(fAccurate) { Script.prototype.getSignatureOperationsCount = function(accurate) {
var self = this; var self = this;
accurate = (typeof accurate == 'undefined') ? true : accurate;
var n = 0; var n = 0;
var lastOpcode = Opcode.OP_INVALIDOPCODE; var lastOpcode = Opcode.OP_INVALIDOPCODE;
_.each(self.chunks, function getChunkOther(chunk) { _.each(self.chunks, function getChunkOther(chunk) {
var opcode = chunk.opcodenum; var opcode = chunk.opcodenum;
if (opcode == Opcode.OP_CHECKSIG || opcode == Opcode.OP_CHECKSIGVERIFY) if (opcode == Opcode.OP_CHECKSIG || opcode == Opcode.OP_CHECKSIGVERIFY) {
n++; n++;
else if (opcode == Opcode.OP_CHECKMULTISIG || } else if (opcode == Opcode.OP_CHECKMULTISIG || opcode == Opcode.OP_CHECKMULTISIGVERIFY) {
opcode == Opcode.OP_CHECKMULTISIGVERIFY) { if (accurate && lastOpcode >= Opcode.OP_1 && lastOpcode <= Opcode.OP_16) {
if (fAccurate && lastOpcode >= Opcode.OP_1 && lastOpcode <= Opcode.OP_16)
n += self._decodeOP_N(lastOpcode); n += self._decodeOP_N(lastOpcode);
else } else {
n += 20; n += 20;
}
} }
lastOpcode = opcode; lastOpcode = opcode;
}); });

View File

@ -778,35 +778,49 @@ describe('Script', function() {
describe('#getSignatureOperationsCount', function() { describe('#getSignatureOperationsCount', function() {
// comes from bitcoind src/test/sigopcount_tests // comes from bitcoind src/test/sigopcount_tests
// only test calls to function with boolean param, not signature ref param // only test calls to function with boolean param, not signature ref param
it('should match bitcoind behavior', function() { var pubkey_hexs = [
'022df8750480ad5b26950b25c7ba79d3e37d75f640f8e5d9bcd5b150a0f85014da',
'03e3818b65bcc73a7d64064106a859cc1a5a728c4345ff0b641209fba0d90de6e9',
'021f2f6e1e50cb6a953935c3601284925decd3fd21bc445712576873fb8c6ebc18',
];
it('should return zero for empty scripts', function() {
Script().getSignatureOperationsCount(false).should.equal(0); Script().getSignatureOperationsCount(false).should.equal(0);
Script().getSignatureOperationsCount(true).should.equal(0); Script().getSignatureOperationsCount(true).should.equal(0);
});
it('should handle multi-sig multisig scripts from string', function() {
var s1 = 'OP_1 01 FF OP_2 OP_CHECKMULTISIG'; var s1 = 'OP_1 01 FF OP_2 OP_CHECKMULTISIG';
Script(s1).getSignatureOperationsCount(true).should.equal(2); Script(s1).getSignatureOperationsCount(true).should.equal(2);
s1 += ' OP_IF OP_CHECKSIG OP_ENDIF'; s1 += ' OP_IF OP_CHECKSIG OP_ENDIF';
Script(s1).getSignatureOperationsCount(true).should.equal(3); Script(s1).getSignatureOperationsCount(true).should.equal(3);
Script(s1).getSignatureOperationsCount(false).should.equal(21); Script(s1).getSignatureOperationsCount(false).should.equal(21);
});
// do not test BOOST_CHECK_EQUAL(p2sh.GetSigOpCount(scriptSig), 3U); it.skip('should handle script arg from p2sh object from string', function() {
// BOOST_CHECK_EQUAL(p2sh.GetSigOpCount(scriptSig), 3U);
var pubkey_hexs = [ });
'022df8750480ad5b26950b25c7ba79d3e37d75f640f8e5d9bcd5b150a0f85014da', it('should handle multi-sig-out scripts from utility function', function() {
'03e3818b65bcc73a7d64064106a859cc1a5a728c4345ff0b641209fba0d90de6e9', var sortKeys = pubkey_hexs.slice(0, 3).map(PublicKey);
'021f2f6e1e50cb6a953935c3601284925decd3fd21bc445712576873fb8c6ebc18', var s2 = Script.buildMultisigOut(sortKeys, 1);
];
var sortkeys = pubkey_hexs.slice(0, 3).map(PublicKey);
var s2 = Script.buildMultisigOut(sortkeys, 1);
Script(s2).getSignatureOperationsCount(true).should.equal(3); Script(s2).getSignatureOperationsCount(true).should.equal(3);
Script(s2).getSignatureOperationsCount(false).should.equal(20); Script(s2).getSignatureOperationsCount(false).should.equal(20);
});
// create a bogus, well-formed signature it('should handle P2SH-multisig-in scripts from utility', function() {
// create a well-formed signature, does not need to match pubkeys
var signature = bitcore.crypto.Signature.fromString('30060201FF0201FF'); var signature = bitcore.crypto.Signature.fromString('30060201FF0201FF');
var signatures = [ signature.toBuffer() ]; var signatures = [ signature.toBuffer() ];
var p2sh = Script.buildP2SHMultisigIn(pubkey_hexs, 1, signatures, {}); var p2sh = Script.buildP2SHMultisigIn(pubkey_hexs, 1, signatures, {});
p2sh.getSignatureOperationsCount(true).should.equal(0); p2sh.getSignatureOperationsCount(true).should.equal(0);
p2sh.getSignatureOperationsCount(false).should.equal(0); p2sh.getSignatureOperationsCount(false).should.equal(0);
});
// do not test BOOST_CHECK_EQUAL(p2sh.GetSigOpCount(scriptSig2), 3U); it.skip('should handle script arg from p2sh object from utility', function() {
// BOOST_CHECK_EQUAL(p2sh.GetSigOpCount(scriptSig2), 3U);
});
it('should default the one and only argument to true', function() {
var s1 = 'OP_1 01 FF OP_2 OP_CHECKMULTISIG';
var trueCount = Script(s1).getSignatureOperationsCount(true);
var falseCount = Script(s1).getSignatureOperationsCount(false);
var defaultCount = Script(s1).getSignatureOperationsCount();
trueCount.should.not.equal(falseCount);
trueCount.should.equal(defaultCount);
}); });
}); });
}); });