improve input testing.

This commit is contained in:
Christopher Jeffrey 2015-12-17 15:45:40 -08:00
parent 0c8168c697
commit 5e89aedf0b
2 changed files with 78 additions and 21 deletions

View File

@ -800,7 +800,7 @@ script.lockTime = function lockTime(s) {
&& new bn(s[0]); && new bn(s[0]);
}; };
script.isPubkey = function isPubkey(s, hash) { script.isPubkey = function isPubkey(s, key) {
if (script.lockTime(s)) if (script.lockTime(s))
s = s.slice(3); s = s.slice(3);
@ -811,8 +811,8 @@ script.isPubkey = function isPubkey(s, hash) {
if (!match) if (!match)
return false; return false;
if (hash) if (key)
return utils.isEqual(s[0], hash); return utils.isEqual(s[0], key);
else else
return s[0]; return s[0];
}; };
@ -838,13 +838,16 @@ script.isPubkeyhash = function isPubkeyhash(s, hash) {
return s[2]; return s[2];
}; };
script.isMultisig = function isMultisig(s, key) { script.isMultisig = function isMultisig(s, pubs) {
if (script.lockTime(s)) if (script.lockTime(s))
s = s.slice(3); s = s.slice(3);
if (s.length < 4) if (s.length < 4)
return false; return false;
if (pubs && !Array.isArray(pubs[0]))
pubs = [pubs];
var m = s[0]; var m = s[0];
if (typeof m === 'number' && m >= 1 && m <= 15) if (typeof m === 'number' && m >= 1 && m <= 15)
m = [m]; m = [m];
@ -872,11 +875,13 @@ script.isMultisig = function isMultisig(s, key) {
if (!isArray) if (!isArray)
return false; return false;
if (!key) if (!pubs)
return keys; return keys;
return m === keys.filter(function(k) { return m === keys.filter(function(k) {
return utils.isEqual(k, key); return pubs.some(function(pub) {
return utils.isEqual(k, pub);
});
}).length; }).length;
}; };
@ -917,55 +922,105 @@ script.colored = function colored(s) {
return s[1]; return s[1];
}; };
script.isPubkeyInput = function isPubkeyInput(s) { script.standardInput = function standardInput(s) {
return (script.isPubkeyInput(s) && 'pubkey')
|| (script.isPubkeyhashInput(s) && 'pubkeyhash')
|| (script.isScripthashInput(s) && 'scripthash')
|| (script.isMultisigInput(s) && 'multisig')
|| 'nonstandard';
};
script.isPubkeyInput = function isPubkeyInput(s, key) {
if (key)
throw new Error('Cannot check for pubkey in p2pk input.');
if (s.length !== 1 || !Array.isArray(s[0])) if (s.length !== 1 || !Array.isArray(s[0]))
return false; return false;
return 9 <= s[0].length && s[0].length <= 73; return 9 <= s[0].length && s[0].length <= 73;
}; };
script.isPubkeyhashInput = function isPubkeyhashInput(s) { script.isPubkeyhashInput = function isPubkeyhashInput(s, key) {
if (s.length !== 2 || !Array.isArray(s[0]) || !Array.isArray(s[1])) if (s.length !== 2 || !Array.isArray(s[0]) || !Array.isArray(s[1]))
return false; return false;
return 9 <= s[0].length && s[0].length <= 73 && var ret = 9 <= s[0].length && s[0].length <= 73 &&
33 <= s[1].length && s[1].length <= 65; 33 <= s[1].length && s[1].length <= 65;
if (!ret)
return false;
if (key)
return utils.isEqual(s[1], key);
return true;
}; };
script.isMultisigInput = function isMultisigInput(s) { script.isMultisigInput = function isMultisigInput(s, pubs) {
if (s.length < 3) if (s.length < 3)
return false; return false;
if (!Array.isArray(s[0]) || s[0].length !== 0) if (!Array.isArray(s[0]) || s[0].length !== 0)
return false; return false;
if (pubs && !Array.isArray(pubs[0]))
pubs = [pubs];
var total = 0;
for (var i = 1; i < s.length; i++) { for (var i = 1; i < s.length; i++) {
var ret = 9 <= s[i].length && s[i].length <= 73; var ret = Array.isArray(s[i]) && 33 <= s[i].length && s[i].length <= 65;
if (!ret) if (!ret)
return false; return false;
if (pubs) {
var has = pubs.some(function(pub) {
return utils.isEqual(s[i], pub);
});
if (has)
total++;
}
} }
return true; if (!pubs)
return true;
return total;
}; };
script.isScripthashInput = function isScripthashInput(s) { script.isScripthashInput = function isScripthashInput(s, pubs) {
if (s.length < 4) if (s.length < 4)
return false; return false;
if (!Array.isArray(s[0]) || s[0].length !== 0) if (!Array.isArray(s[0]) || s[0].length !== 0)
return false; return false;
if (pubs && !Array.isArray(pubs[0]))
pubs = [pubs];
var total = 0;
for (var i = 1; i < s.length - 1; i++) { for (var i = 1; i < s.length - 1; i++) {
var ret = Array.isArray(s[i]) && 9 <= s[i].length && s[i].length <= 73; var ret = Array.isArray(s[i]) && 33 <= s[i].length && s[i].length <= 65;
if (!ret) if (!ret)
return false; return false;
if (pubs) {
var has = pubs.some(function(pub) {
return utils.isEqual(s[i], pub);
});
if (has)
total++;
}
} }
var r = Array.isArray(s[s.length - 1]) && s[s.length - 1]; var r = Array.isArray(s[s.length - 1]) && s[s.length - 1];
if (r[r.length - 1] !== constants.opcodes.checkmultisig) if (r[r.length - 1] !== constants.opcodes.checkmultisig)
return false; return false;
return true; if (!pubs)
return true;
// var m = r[0];
// return m === total;
return total;
}; };
// https://github.com/bitcoin/bips/blob/master/bip-0066.mediawiki // https://github.com/bitcoin/bips/blob/master/bip-0066.mediawiki

View File

@ -357,7 +357,7 @@ Wallet.validateAddress = Wallet.prototype.validateAddress;
Wallet.prototype.ownOutput = function ownOutput(tx, index) { Wallet.prototype.ownOutput = function ownOutput(tx, index) {
var scriptHash = this.getFullHash(); var scriptHash = this.getFullHash();
var hash = this.getOwnHash(); var hash = this.getOwnHash();
var key = this.getOwnPublicKey(); var keys = this.getPublicKeys();
var outputs = tx.outputs.filter(function(output, i) { var outputs = tx.outputs.filter(function(output, i) {
if (index !== undefined && index !== i) if (index !== undefined && index !== i)
@ -371,7 +371,7 @@ Wallet.prototype.ownOutput = function ownOutput(tx, index) {
if (bcoin.script.isPubkeyhash(s, hash)) if (bcoin.script.isPubkeyhash(s, hash))
return true; return true;
if (bcoin.script.isMultisig(s, key)) if (bcoin.script.isMultisig(s, keys))
return true; return true;
if (bcoin.script.isScripthash(s, scriptHash)) if (bcoin.script.isScripthash(s, scriptHash))
@ -379,6 +379,7 @@ Wallet.prototype.ownOutput = function ownOutput(tx, index) {
return false; return false;
}, this); }, this);
if (outputs.length === 0) if (outputs.length === 0)
return false; return false;
@ -389,13 +390,13 @@ Wallet.prototype.ownInput = function ownInput(tx, index) {
var scriptHash = this.getFullHash(); var scriptHash = this.getFullHash();
var hash = this.getOwnHash(); var hash = this.getOwnHash();
var key = this.getOwnPublicKey(); var key = this.getOwnPublicKey();
var keys = this.getPublicKeys();
var inputs = tx.inputs.filter(function(input, i) { var inputs = tx.inputs.filter(function(input, i) {
if (index !== undefined && index !== i) if (index !== undefined && index !== i)
return false; return false;
if (bcoin.script.isPubkeyhashInput(input.script) && if (bcoin.script.isPubkeyhashInput(input.script, key))
utils.isEqual(input.script[1], key))
return true; return true;
if (!input.out.tx) if (!input.out.tx)
@ -405,7 +406,7 @@ Wallet.prototype.ownInput = function ownInput(tx, index) {
if (bcoin.script.isPubkeyhash(s, hash)) if (bcoin.script.isPubkeyhash(s, hash))
return true; return true;
if (bcoin.script.isMultisig(s, key)) if (bcoin.script.isMultisig(s, keys))
return true; return true;
if (bcoin.script.isScripthash(s, scriptHash)) if (bcoin.script.isScripthash(s, scriptHash))
@ -413,6 +414,7 @@ Wallet.prototype.ownInput = function ownInput(tx, index) {
return false; return false;
}, this); }, this);
if (inputs.length === 0) if (inputs.length === 0)
return false; return false;