diff --git a/lib/bcoin/script.js b/lib/bcoin/script.js index cda6da43..4604ecfc 100644 --- a/lib/bcoin/script.js +++ b/lib/bcoin/script.js @@ -788,7 +788,7 @@ script.standard = function standard(s) { || (script.isPubkeyhash(s) && 'pubkeyhash') || (script.isMultisig(s) && 'multisig') || (script.isScripthash(s) && 'scripthash') - || (script.isNullData(s) && 'colored') + || (script.isColored(s) && 'colored') || 'nonstandard'; }; @@ -800,6 +800,23 @@ script.lockTime = function lockTime(s) { && new bn(s[0]); }; +script.isPubkey = function isPubkey(s, hash) { + if (script.lockTime(s)) + s = s.slice(3); + + if (s.length !== 2) + return false; + + var match = Array.isArray(s[0]) && s[1] === 'checksig'; + if (!match) + return false; + + if (hash) + return utils.isEqual(s[0], hash); + else + return s[0]; +}; + script.isPubkeyhash = function isPubkeyhash(s, hash) { if (script.lockTime(s)) s = s.slice(3); @@ -821,23 +838,6 @@ script.isPubkeyhash = function isPubkeyhash(s, hash) { return s[2]; }; -script.isPubkey = function isPubkey(s, hash) { - if (script.lockTime(s)) - s = s.slice(3); - - if (s.length !== 2) - return false; - - var match = Array.isArray(s[0]) && s[1] === 'checksig'; - if (!match) - return false; - - if (hash) - return utils.isEqual(s[0], hash); - else - return s[0]; -}; - script.isMultisig = function isMultisig(s, key) { if (script.lockTime(s)) s = s.slice(3); @@ -880,14 +880,6 @@ script.isMultisig = function isMultisig(s, key) { }).length; }; -script.isPubkeyhashInput = function isPubkeyhashInput(s) { - if (s.length !== 2) - return false; - - return 9 <= s[0].length && s[0].length <= 73 && - 33 <= s[1].length && s[1].length <= 65; -}; - script.isScripthash = function isScripthash(s, hash) { if (script.lockTime(s)) s = s.slice(3); @@ -909,7 +901,7 @@ script.isScripthash = function isScripthash(s, hash) { return true; }; -script.isNullData = function isNullData(s) { +script.isColored = function isColored(s) { if (s.length !== 2) return false; @@ -918,6 +910,64 @@ script.isNullData = function isNullData(s) { s[1].length <= 40; }; +script.colored = function colored(s) { + if (!script.isColored(s)) + return false; + + return s[1]; +}; + +script.isPubkeyInput = function isPubkeyInput(s) { + if (s.length !== 1 || !Array.isArray(s[0])) + return false; + + return 9 <= s[0].length && s[0].length <= 73; +}; + +script.isPubkeyhashInput = function isPubkeyhashInput(s) { + 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; +}; + +script.isMultisigInput = function isMultisigInput(s) { + if (s.length < 3) + return false; + + if (!Array.isArray(s[0]) || s[0].length !== 0) + return false; + + for (var i = 1; i < s.length; i++) { + var ret = 9 <= s[i].length && s[i].length <= 73; + if (!ret) + return false; + } + + return true; +}; + +script.isScripthashInput = function isScripthashInput(s) { + if (s.length < 4) + return false; + + if (!Array.isArray(s[0]) || s[0].length !== 0) + return false; + + for (var i = 1; i < s.length - 1; i++) { + var ret = Array.isArray(s[i]) && 9 <= s[i].length && s[i].length <= 73; + if (!ret) + return false; + } + + var r = Array.isArray(s[s.length - 1]) && s[s.length - 1]; + if (r[r.length - 1] !== constants.opcodes.checkmultisig) + return false; + + return true; +}; + // https://github.com/bitcoin/bips/blob/master/bip-0066.mediawiki /** * A canonical signature exists of: <30> <02> <02> diff --git a/test/script-test.js b/test/script-test.js index e3a91f8e..cb036ce5 100644 --- a/test/script-test.js +++ b/test/script-test.js @@ -42,7 +42,7 @@ describe('Script', function() { var hex = '6a28590c080112220a1b353930632e6f7267282a5f5e294f7665726c6179404f7261636c65103b1a010c' var encoded = bcoin.utils.toArray(hex, 'hex') var decoded = bcoin.script.decode(encoded); - assert(bcoin.script.isNullData(decoded)) + assert(bcoin.script.isColored(decoded)) }) it('should handle if statements correctly', function () {