Skip to content

Commit d364e65

Browse files
authored
Merge pull request bitcoinjs#898 from bitcoinjs/fixes
scriptHash.check should be agnostic of classification order
2 parents 76a6b17 + 95cc837 commit d364e65

File tree

5 files changed

+63
-9
lines changed

5 files changed

+63
-9
lines changed

src/templates/scripthash/input.js

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,12 +20,23 @@ function check (script, allowIncomplete) {
2020
// is redeemScriptSig push only?
2121
if (!bscript.isPushOnly(scriptSigChunks)) return false
2222

23-
var inputType = bscript.classifyInput(scriptSigChunks, allowIncomplete)
24-
var outputType = bscript.classifyOutput(redeemScriptChunks)
23+
// is witness?
2524
if (chunks.length === 1) {
26-
return outputType === bscript.types.P2WSH || outputType === bscript.types.P2WPKH
25+
return bscript.witnessScriptHash.output.check(redeemScriptChunks) ||
26+
bscript.witnessPubKeyHash.output.check(redeemScriptChunks)
2727
}
28-
return inputType === outputType
28+
29+
// match types
30+
if (bscript.pubKeyHash.input.check(scriptSigChunks) &&
31+
bscript.pubKeyHash.output.check(redeemScriptChunks)) return true
32+
33+
if (bscript.multisig.input.check(scriptSigChunks, allowIncomplete) &&
34+
bscript.multisig.output.check(redeemScriptChunks)) return true
35+
36+
if (bscript.pubKey.input.check(scriptSigChunks) &&
37+
bscript.pubKey.output.check(redeemScriptChunks)) return true
38+
39+
return false
2940
}
3041
check.toJSON = function () { return 'scriptHash input' }
3142

test/fixtures/templates.json

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -153,6 +153,15 @@
153153
""
154154
]
155155
},
156+
{
157+
"type": "scripthash",
158+
"redeemScript": "OP_2 0327e023a353d111808f61d554c2e1934721eaf87f33b7a771e807006908a49372 03251670bb6a179a0d43b75476c7e580c0ba274378a18077e8de0832c870e5381f 02cca7f9a64425a0466d26d5c7e9eb3ad6b64cd48ea89edb38bc08f58a792dde47 OP_3 OP_CHECKMULTISIG",
159+
"redeemScriptSig": "OP_0 304502210093efc26facedc5f51e304aa270a7b4f1a911b2d912c3674e5c6e2ad4ac7a410402201cf0b62c240461902f9f16d8a0bc3a210b7bfcd2c06523dd4b4b63be22e8525201",
160+
"input": "OP_0 304502210093efc26facedc5f51e304aa270a7b4f1a911b2d912c3674e5c6e2ad4ac7a410402201cf0b62c240461902f9f16d8a0bc3a210b7bfcd2c06523dd4b4b63be22e8525201 52210327e023a353d111808f61d554c2e1934721eaf87f33b7a771e807006908a493722103251670bb6a179a0d43b75476c7e580c0ba274378a18077e8de0832c870e5381f2102cca7f9a64425a0466d26d5c7e9eb3ad6b64cd48ea89edb38bc08f58a792dde4753ae",
161+
"inputHex": "0048304502210093efc26facedc5f51e304aa270a7b4f1a911b2d912c3674e5c6e2ad4ac7a410402201cf0b62c240461902f9f16d8a0bc3a210b7bfcd2c06523dd4b4b63be22e85252014c6952210327e023a353d111808f61d554c2e1934721eaf87f33b7a771e807006908a493722103251670bb6a179a0d43b75476c7e580c0ba274378a18077e8de0832c870e5381f2102cca7f9a64425a0466d26d5c7e9eb3ad6b64cd48ea89edb38bc08f58a792dde4753ae",
162+
"output": "OP_HASH160 fcc42dd4aa770d75cb6796bbd7853a325e746659 OP_EQUAL",
163+
"outputHex": "a914fcc42dd4aa770d75cb6796bbd7853a325e74665987"
164+
},
156165
{
157166
"type": "nonstandard",
158167
"typeIncomplete": "scripthash",
@@ -191,9 +200,7 @@
191200
"outputHex": "00"
192201
},
193202
{
194-
"type": "scripthash",
195-
"redeemScript": "OP_0",
196-
"redeemScriptSig": "OP_0",
203+
"type": "nonstandard",
197204
"input": "OP_0 00",
198205
"inputHex": "000100",
199206
"inputStack": [

test/fixtures/transaction_builder.json

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1446,6 +1446,9 @@
14461446
]
14471447
}
14481448
],
1449+
"classification": {
1450+
"hex": "01000000059c06fb641a8cd69be81ca91e68d8a115cb698396876ecd77120ec1e4ab9002279f000000b500483045022100d58f828ab39cfac592f89fe372fb520992975218698c683a893f29e39cf0080302207cc0485dab5ce621089bdd15e1f15db0ecbde8dd4bb661bcf0e3af6ecab075e6014c6952210327e023a353d111808f61d554c2e1934721eaf87f33b7a771e807006908a493722103251670bb6a179a0d43b75476c7e580c0ba274378a18077e8de0832c870e5381f2102cca7f9a64425a0466d26d5c7e9eb3ad6b64cd48ea89edb38bc08f58a792dde4753aeffffffff0821dc00213d2b7993f8f2a1553800c6f2f31106da176505d0ade467b68401d795000000b400473044022028e937a7bba888fe3428f442f6e22d92ce2ddba01548c38780d40890fa6cc305022043204d0bcfb1150b045d54cf9b13462e44e2ef47fee03d3cea08e84a8060fc30014c6952210327e023a353d111808f61d554c2e1934721eaf87f33b7a771e807006908a493722103251670bb6a179a0d43b75476c7e580c0ba274378a18077e8de0832c870e5381f2102cca7f9a64425a0466d26d5c7e9eb3ad6b64cd48ea89edb38bc08f58a792dde4753aeffffffffaa997ac385dc666af1f5947ef615431024eb314cac2308d5e1b903e28ca466f499000000b50048304502210093efc26facedc5f51e304aa270a7b4f1a911b2d912c3674e5c6e2ad4ac7a410402201cf0b62c240461902f9f16d8a0bc3a210b7bfcd2c06523dd4b4b63be22e85252014c6952210327e023a353d111808f61d554c2e1934721eaf87f33b7a771e807006908a493722103251670bb6a179a0d43b75476c7e580c0ba274378a18077e8de0832c870e5381f2102cca7f9a64425a0466d26d5c7e9eb3ad6b64cd48ea89edb38bc08f58a792dde4753aeffffffffd9f61bf98a021ee144f33ba5a6b04274de8fcb5c05f1ff7c12367fb7a608b2dd9e000000b4004730440220456e1201c1fa727288cba7fa0054dc02d8dd6c7418cae1e97006ef0652891c9202201192d0fbf3a9c00afb99a415f2bf515509e1150805acd8de95c496c27cb6570f014c6952210327e023a353d111808f61d554c2e1934721eaf87f33b7a771e807006908a493722103251670bb6a179a0d43b75476c7e580c0ba274378a18077e8de0832c870e5381f2102cca7f9a64425a0466d26d5c7e9eb3ad6b64cd48ea89edb38bc08f58a792dde4753aeffffffff1f8119e3bc7c2f451feaa79f42ec5a63502afb425c253c935e43d217d5c29bdea1000000b500483045022100f669004f770490093eba4ac4903cb7581f7d18ea9245c538585ef5367e520e4702205485fafe0be178563a599d41e0cc172bb01314ed65d0e48df19a5258f17bdbc4014c6952210327e023a353d111808f61d554c2e1934721eaf87f33b7a771e807006908a493722103251670bb6a179a0d43b75476c7e580c0ba274378a18077e8de0832c870e5381f2102cca7f9a64425a0466d26d5c7e9eb3ad6b64cd48ea89edb38bc08f58a792dde4753aeffffffff0380f0fa02000000001976a91439692085cf9d27e8c1cf63e76bd32d9bd15cab8b88ac50c300000000000017a9147204bb26950ce1595255897f63d205779f033f3e875b5409000000000017a9142538893d984a4b5695e4bfde1a90a9f02fabf8e38700000000"
1451+
},
14491452
"multisig": [
14501453
{
14511454
"description": "P2SH 2-of-2 multisig, signed in correct order",

test/script.js

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ var bscript = require('../src/script')
55
var minimalData = require('minimaldata')
66

77
var fixtures = require('./fixtures/script.json')
8+
var fixtures2 = require('./fixtures/templates.json')
89

910
describe('script', function () {
1011
// TODO
@@ -23,8 +24,8 @@ describe('script', function () {
2324
describe('fromASM/toASM', function () {
2425
fixtures.valid.forEach(function (f) {
2526
it('encodes/decodes ' + f.asm, function () {
26-
var scriptSig = bscript.fromASM(f.asm)
27-
assert.strictEqual(bscript.toASM(scriptSig), f.asm)
27+
var script = bscript.fromASM(f.asm)
28+
assert.strictEqual(bscript.toASM(script), f.asm)
2829
})
2930
})
3031

@@ -37,6 +38,28 @@ describe('script', function () {
3738
})
3839
})
3940

41+
describe('fromASM/toASM (templates)', function () {
42+
fixtures2.valid.forEach(function (f) {
43+
if (f.inputHex) {
44+
var ih = bscript.toASM(Buffer.from(f.inputHex, 'hex'))
45+
46+
it('encodes/decodes ' + ih, function () {
47+
var script = bscript.fromASM(f.input)
48+
assert.strictEqual(script.toString('hex'), f.inputHex)
49+
assert.strictEqual(bscript.toASM(script), f.input)
50+
})
51+
}
52+
53+
if (f.outputHex) {
54+
it('encodes/decodes ' + f.output, function () {
55+
var script = bscript.fromASM(f.output)
56+
assert.strictEqual(script.toString('hex'), f.outputHex)
57+
assert.strictEqual(bscript.toASM(script), f.output)
58+
})
59+
}
60+
})
61+
})
62+
4063
describe('isPushOnly', function () {
4164
fixtures.valid.forEach(function (f) {
4265
it('returns ' + !!f.stack + ' for ' + f.asm, function () {

test/transaction_builder.js

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,16 @@ describe('TransactionBuilder', function () {
125125
})
126126
})
127127

128+
it('correctly classifies transaction inputs', function () {
129+
var tx = Transaction.fromHex(fixtures.valid.classification.hex)
130+
var txb = TransactionBuilder.fromTransaction(tx)
131+
txb.inputs.forEach(function (i) {
132+
assert.strictEqual(i.prevOutType, 'scripthash')
133+
assert.strictEqual(i.redeemScriptType, 'multisig')
134+
assert.strictEqual(i.signType, 'multisig')
135+
})
136+
})
137+
128138
fixtures.invalid.fromTransaction.forEach(function (f) {
129139
it('throws ' + f.exception, function () {
130140
var tx = Transaction.fromHex(f.txHex)

0 commit comments

Comments
 (0)