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]);
};
script.isPubkey = function isPubkey(s, hash) {
script.isPubkey = function isPubkey(s, key) {
if (script.lockTime(s))
s = s.slice(3);
@ -811,8 +811,8 @@ script.isPubkey = function isPubkey(s, hash) {
if (!match)
return false;
if (hash)
return utils.isEqual(s[0], hash);
if (key)
return utils.isEqual(s[0], key);
else
return s[0];
};
@ -838,13 +838,16 @@ script.isPubkeyhash = function isPubkeyhash(s, hash) {
return s[2];
};
script.isMultisig = function isMultisig(s, key) {
script.isMultisig = function isMultisig(s, pubs) {
if (script.lockTime(s))
s = s.slice(3);
if (s.length < 4)
return false;
if (pubs && !Array.isArray(pubs[0]))
pubs = [pubs];
var m = s[0];
if (typeof m === 'number' && m >= 1 && m <= 15)
m = [m];
@ -872,11 +875,13 @@ script.isMultisig = function isMultisig(s, key) {
if (!isArray)
return false;
if (!key)
if (!pubs)
return keys;
return m === keys.filter(function(k) {
return utils.isEqual(k, key);
return pubs.some(function(pub) {
return utils.isEqual(k, pub);
});
}).length;
};
@ -917,55 +922,105 @@ script.colored = function colored(s) {
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]))
return false;
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]))
return false;
return 9 <= s[0].length && s[0].length <= 73 &&
33 <= s[1].length && s[1].length <= 65;
var ret = 9 <= s[0].length && s[0].length <= 73 &&
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)
return false;
if (!Array.isArray(s[0]) || s[0].length !== 0)
return false;
if (pubs && !Array.isArray(pubs[0]))
pubs = [pubs];
var total = 0;
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)
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)
return false;
if (!Array.isArray(s[0]) || s[0].length !== 0)
return false;
if (pubs && !Array.isArray(pubs[0]))
pubs = [pubs];
var total = 0;
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)
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];
if (r[r.length - 1] !== constants.opcodes.checkmultisig)
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

View File

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