Skip to content

Commit 04469e6

Browse files
committedMay 21, 2024
txscript: make OP_CODESEPARATOR non-standard in non-segwit scripts
1 parent 8b2f43e commit 04469e6

12 files changed

+172
-62
lines changed
 

‎txscript/data/tx_invalid.json

+26
Original file line numberDiff line numberDiff line change
@@ -333,6 +333,32 @@
333333
["BIP143: wrong sighash (with FindAndDelete) = 17c50ec2181ecdfdc85ca081174b248199ba81fff730794d4f69b8ec031f2dce"],
334334
[[["9628667ad48219a169b41b020800162287d2c0f713c04157e95c484a8dcb7592", 7500, "0x00 0x20 0x9b66c15b4e0b4eb49fa877982cafded24859fe5b0e2dbfbe4f0df1de7743fd52", 200000]],
335335
"010000000001019275cb8d4a485ce95741c013f7c0d28722160008021bb469a11982d47a6628964c1d000000ffffffff0101000000000000000007004830450220487fb382c4974de3f7d834c1b617fe15860828c7f96454490edd6d891556dcc9022100baf95feb48f845d5bfc9882eb6aeefa1bc3790e39f59eaa46ff7f15ae626c53e0148304502205286f726690b2e9b0207f0345711e63fa7012045b9eb0f19c2458ce1db90cf43022100e89f17f86abc5b149eba4115d4f128bcf45d77fb3ecdd34f594091340c03959601010221023cb6055f4b57a1580c5a753e19610cafaedf7e0ff377731c77837fd666eae1712102c1b1db303ac232ffa8e5e7cc2cf5f96c6e40d3e6914061204c0541cb2043a0969552af4830450220487fb382c4974de3f7d834c1b617fe15860828c7f96454490edd6d891556dcc9022100baf95feb48f845d5bfc9882eb6aeefa1bc3790e39f59eaa46ff7f15ae626c53e0148304502205286f726690b2e9b0207f0345711e63fa7012045b9eb0f19c2458ce1db90cf43022100e89f17f86abc5b149eba4115d4f128bcf45d77fb3ecdd34f594091340c039596017500000000", "P2SH,WITNESS"],
336+
[[["bc7fd132fcf817918334822ee6d9bd95c889099c96e07ca2c1eb2cc70db63224", 0, "CODESEPARATOR 0x21 0x038479a0fa998cd35259a2ef0a7a5c68662c1474f88ccb6d08a7677bbec7f22041 CHECKSIG"]],
337+
"01000000012432b60dc72cebc1a27ce0969c0989c895bdd9e62e8234839117f8fc32d17fbc000000004a493046022100a576b52051962c25e642c0fd3d77ee6c92487048e5d90818bcf5b51abaccd7900221008204f8fb121be4ec3b24483b1f92d89b1b0548513a134e345c5442e86e8617a501ffffffff010000000000000000016a00000000", "P2SH,CONST_SCRIPTCODE"],
338+
[[["83e194f90b6ef21fa2e3a365b63794fb5daa844bdc9b25de30899fcfe7b01047", 0, "CODESEPARATOR CODESEPARATOR 0x21 0x038479a0fa998cd35259a2ef0a7a5c68662c1474f88ccb6d08a7677bbec7f22041 CHECKSIG"]],
339+
"01000000014710b0e7cf9f8930de259bdc4b84aa5dfb9437b665a3e3a21ff26e0bf994e183000000004a493046022100a166121a61b4eeb19d8f922b978ff6ab58ead8a5a5552bf9be73dc9c156873ea02210092ad9bc43ee647da4f6652c320800debcf08ec20a094a0aaf085f63ecb37a17201ffffffff010000000000000000016a00000000", "P2SH,CONST_SCRIPTCODE"],
340+
[[["326882a7f22b5191f1a0cc9962ca4b878cd969cf3b3a70887aece4d801a0ba5e", 0, "0x21 0x038479a0fa998cd35259a2ef0a7a5c68662c1474f88ccb6d08a7677bbec7f22041 CODESEPARATOR CHECKSIG"]],
341+
"01000000015ebaa001d8e4ec7a88703a3bcf69d98c874bca6299cca0f191512bf2a7826832000000004948304502203bf754d1c6732fbf87c5dcd81258aefd30f2060d7bd8ac4a5696f7927091dad1022100f5bcb726c4cf5ed0ed34cc13dadeedf628ae1045b7cb34421bc60b89f4cecae701ffffffff010000000000000000016a00000000", "P2SH,CONST_SCRIPTCODE"],
342+
[[["a955032f4d6b0c9bfe8cad8f00a8933790b9c1dc28c82e0f48e75b35da0e4944", 0, "0x21 0x038479a0fa998cd35259a2ef0a7a5c68662c1474f88ccb6d08a7677bbec7f22041 CHECKSIGVERIFY CODESEPARATOR 0x21 0x038479a0fa998cd35259a2ef0a7a5c68662c1474f88ccb6d08a7677bbec7f22041 CHECKSIGVERIFY CODESEPARATOR 1"]],
343+
"010000000144490eda355be7480f2ec828dcc1b9903793a8008fad8cfe9b0c6b4d2f0355a900000000924830450221009c0a27f886a1d8cb87f6f595fbc3163d28f7a81ec3c4b252ee7f3ac77fd13ffa02203caa8dfa09713c8c4d7ef575c75ed97812072405d932bd11e6a1593a98b679370148304502201e3861ef39a526406bad1e20ecad06be7375ad40ddb582c9be42d26c3a0d7b240221009d0a3985e96522e59635d19cc4448547477396ce0ef17a58e7d74c3ef464292301ffffffff010000000000000000016a00000000", "P2SH,CONST_SCRIPTCODE"],
344+
[[["a955032f4d6b0c9bfe8cad8f00a8933790b9c1dc28c82e0f48e75b35da0e4944", 0, "IF CODESEPARATOR ENDIF 0x21 0x0378d430274f8c5ec1321338151e9f27f4c676a008bdf8638d07c0b6be9ab35c71 CHECKSIGVERIFY CODESEPARATOR 1"]],
345+
"010000000144490eda355be7480f2ec828dcc1b9903793a8008fad8cfe9b0c6b4d2f0355a9000000004a48304502207a6974a77c591fa13dff60cabbb85a0de9e025c09c65a4b2285e47ce8e22f761022100f0efaac9ff8ac36b10721e0aae1fb975c90500b50c56e8a0cc52b0403f0425dd0100ffffffff010000000000000000016a00000000", "P2SH,CONST_SCRIPTCODE"],
346+
[[["a955032f4d6b0c9bfe8cad8f00a8933790b9c1dc28c82e0f48e75b35da0e4944", 0, "IF CODESEPARATOR ENDIF 0x21 0x0378d430274f8c5ec1321338151e9f27f4c676a008bdf8638d07c0b6be9ab35c71 CHECKSIGVERIFY CODESEPARATOR 1"]],
347+
"010000000144490eda355be7480f2ec828dcc1b9903793a8008fad8cfe9b0c6b4d2f0355a9000000004a483045022100fa4a74ba9fd59c59f46c3960cf90cbe0d2b743c471d24a3d5d6db6002af5eebb02204d70ec490fd0f7055a7c45f86514336e3a7f03503dacecabb247fc23f15c83510151ffffffff010000000000000000016a00000000", "P2SH,CONST_SCRIPTCODE"],
348+
[[["ccf7f4053a02e653c36ac75c891b7496d0dc5ce5214f6c913d9cf8f1329ebee0", 0, "DUP HASH160 0x14 0xee5a6aa40facefb2655ac23c0c28c57c65c41f9b EQUALVERIFY CHECKSIG"]],
349+
"0100000001e0be9e32f1f89c3d916c4f21e55cdcd096741b895cc76ac353e6023a05f4f7cc00000000d86149304602210086e5f736a2c3622ebb62bd9d93d8e5d76508b98be922b97160edc3dcca6d8c47022100b23c312ac232a4473f19d2aeb95ab7bdf2b65518911a0d72d50e38b5dd31dc820121038479a0fa998cd35259a2ef0a7a5c68662c1474f88ccb6d08a7677bbec7f22041ac4730440220508fa761865c8abd81244a168392876ee1d94e8ed83897066b5e2df2400dad24022043f5ee7538e87e9c6aef7ef55133d3e51da7cc522830a9c4d736977a76ef755c0121038479a0fa998cd35259a2ef0a7a5c68662c1474f88ccb6d08a7677bbec7f22041ffffffff010000000000000000016a00000000", "P2SH,CONST_SCRIPTCODE"],
350+
[[["10c9f0effe83e97f80f067de2b11c6a00c3088a4bce42c5ae761519af9306f3c", 1, "DUP HASH160 0x14 0xee5a6aa40facefb2655ac23c0c28c57c65c41f9b EQUALVERIFY CHECKSIG"]],
351+
"01000000013c6f30f99a5161e75a2ce4bca488300ca0c6112bde67f0807fe983feeff0c91001000000e608646561646265656675ab61493046022100ce18d384221a731c993939015e3d1bcebafb16e8c0b5b5d14097ec8177ae6f28022100bcab227af90bab33c3fe0a9abfee03ba976ee25dc6ce542526e9b2e56e14b7f10121038479a0fa998cd35259a2ef0a7a5c68662c1474f88ccb6d08a7677bbec7f22041ac493046022100c3b93edcc0fd6250eb32f2dd8a0bba1754b0f6c3be8ed4100ed582f3db73eba2022100bf75b5bd2eff4d6bf2bda2e34a40fcc07d4aa3cf862ceaa77b47b81eff829f9a01ab21038479a0fa998cd35259a2ef0a7a5c68662c1474f88ccb6d08a7677bbec7f22041ffffffff010000000000000000016a00000000", "P2SH,CONST_SCRIPTCODE"],
352+
[[["6056ebd549003b10cbbd915cea0d82209fe40b8617104be917a26fa92cbe3d6f", 0, "DUP HASH160 0x14 0xee5a6aa40facefb2655ac23c0c28c57c65c41f9b EQUALVERIFY CHECKSIG"]],
353+
"01000000016f3dbe2ca96fa217e94b1017860be49f20820dea5c91bdcb103b0049d5eb566000000000fd1d0147304402203989ac8f9ad36b5d0919d97fa0a7f70c5272abee3b14477dc646288a8b976df5022027d19da84a066af9053ad3d1d7459d171b7e3a80bc6c4ef7a330677a6be548140147304402203989ac8f9ad36b5d0919d97fa0a7f70c5272abee3b14477dc646288a8b976df5022027d19da84a066af9053ad3d1d7459d171b7e3a80bc6c4ef7a330677a6be548140121038479a0fa998cd35259a2ef0a7a5c68662c1474f88ccb6d08a7677bbec7f22041ac47304402203757e937ba807e4a5da8534c17f9d121176056406a6465054bdd260457515c1a02200f02eccf1bec0f3a0d65df37889143c2e88ab7acec61a7b6f5aa264139141a2b0121038479a0fa998cd35259a2ef0a7a5c68662c1474f88ccb6d08a7677bbec7f22041ffffffff010000000000000000016a00000000", "P2SH,CONST_SCRIPTCODE"],
354+
[[["5a6b0021a6042a686b6b94abc36b387bef9109847774e8b1e51eb8cc55c53921", 1, "DUP HASH160 0x14 0xee5a6aa40facefb2655ac23c0c28c57c65c41f9b EQUALVERIFY CHECKSIG"]],
355+
"01000000012139c555ccb81ee5b1e87477840991ef7b386bc3ab946b6b682a04a621006b5a01000000fdb40148304502201723e692e5f409a7151db386291b63524c5eb2030df652b1f53022fd8207349f022100b90d9bbf2f3366ce176e5e780a00433da67d9e5c79312c6388312a296a5800390148304502201723e692e5f409a7151db386291b63524c5eb2030df652b1f53022fd8207349f022100b90d9bbf2f3366ce176e5e780a00433da67d9e5c79312c6388312a296a5800390121038479a0fa998cd35259a2ef0a7a5c68662c1474f88ccb6d08a7677bbec7f2204148304502201723e692e5f409a7151db386291b63524c5eb2030df652b1f53022fd8207349f022100b90d9bbf2f3366ce176e5e780a00433da67d9e5c79312c6388312a296a5800390175ac4830450220646b72c35beeec51f4d5bc1cbae01863825750d7f490864af354e6ea4f625e9c022100f04b98432df3a9641719dbced53393022e7249fb59db993af1118539830aab870148304502201723e692e5f409a7151db386291b63524c5eb2030df652b1f53022fd8207349f022100b90d9bbf2f3366ce176e5e780a00433da67d9e5c79312c6388312a296a580039017521038479a0fa998cd35259a2ef0a7a5c68662c1474f88ccb6d08a7677bbec7f22041ffffffff010000000000000000016a00000000", "P2SH,CONST_SCRIPTCODE"],
356+
[[["b5b598de91787439afd5938116654e0b16b7a0d0f82742ba37564219c5afcbf9", 0, "DUP HASH160 0x14 0xf6f365c40f0739b61de827a44751e5e99032ed8f EQUALVERIFY CHECKSIG"],
357+
["ab9805c6d57d7070d9a42c5176e47bb705023e6b67249fb6760880548298e742", 0, "HASH160 0x14 0xd8dacdadb7462ae15cd906f1878706d0da8660e6 EQUAL"]],
358+
"0100000002f9cbafc519425637ba4227f8d0a0b7160b4e65168193d5af39747891de98b5b5000000006b4830450221008dd619c563e527c47d9bd53534a770b102e40faa87f61433580e04e271ef2f960220029886434e18122b53d5decd25f1f4acb2480659fea20aabd856987ba3c3907e0121022b78b756e2258af13779c1a1f37ea6800259716ca4b7f0b87610e0bf3ab52a01ffffffff42e7988254800876b69f24676b3e0205b77be476512ca4d970707dd5c60598ab00000000fd260100483045022015bd0139bcccf990a6af6ec5c1c52ed8222e03a0d51c334df139968525d2fcd20221009f9efe325476eb64c3958e4713e9eefe49bf1d820ed58d2112721b134e2a1a53034930460221008431bdfa72bc67f9d41fe72e94c88fb8f359ffa30b33c72c121c5a877d922e1002210089ef5fc22dd8bfc6bf9ffdb01a9862d27687d424d1fefbab9e9c7176844a187a014c9052483045022015bd0139bcccf990a6af6ec5c1c52ed8222e03a0d51c334df139968525d2fcd20221009f9efe325476eb64c3958e4713e9eefe49bf1d820ed58d2112721b134e2a1a5303210378d430274f8c5ec1321338151e9f27f4c676a008bdf8638d07c0b6be9ab35c71210378d430274f8c5ec1321338151e9f27f4c676a008bdf8638d07c0b6be9ab35c7153aeffffffff01a08601000000000017a914d8dacdadb7462ae15cd906f1878706d0da8660e68700000000", "P2SH,CONST_SCRIPTCODE"],
359+
[[["ceafe58e0f6e7d67c0409fbbf673c84c166e3c5d3c24af58f7175b18df3bb3db", 0, "DUP HASH160 0x14 0xf6f365c40f0739b61de827a44751e5e99032ed8f EQUALVERIFY CHECKSIG"],
360+
["ceafe58e0f6e7d67c0409fbbf673c84c166e3c5d3c24af58f7175b18df3bb3db", 1, "2 0x48 0x3045022015bd0139bcccf990a6af6ec5c1c52ed8222e03a0d51c334df139968525d2fcd20221009f9efe325476eb64c3958e4713e9eefe49bf1d820ed58d2112721b134e2a1a5303 0x21 0x0378d430274f8c5ec1321338151e9f27f4c676a008bdf8638d07c0b6be9ab35c71 0x21 0x0378d430274f8c5ec1321338151e9f27f4c676a008bdf8638d07c0b6be9ab35c71 3 CHECKMULTISIG"]],
361+
"0100000002dbb33bdf185b17f758af243c5d3c6e164cc873f6bb9f40c0677d6e0f8ee5afce000000006b4830450221009627444320dc5ef8d7f68f35010b4c050a6ed0d96b67a84db99fda9c9de58b1e02203e4b4aaa019e012e65d69b487fdf8719df72f488fa91506a80c49a33929f1fd50121022b78b756e2258af13779c1a1f37ea6800259716ca4b7f0b87610e0bf3ab52a01ffffffffdbb33bdf185b17f758af243c5d3c6e164cc873f6bb9f40c0677d6e0f8ee5afce010000009300483045022015bd0139bcccf990a6af6ec5c1c52ed8222e03a0d51c334df139968525d2fcd20221009f9efe325476eb64c3958e4713e9eefe49bf1d820ed58d2112721b134e2a1a5303483045022015bd0139bcccf990a6af6ec5c1c52ed8222e03a0d51c334df139968525d2fcd20221009f9efe325476eb64c3958e4713e9eefe49bf1d820ed58d2112721b134e2a1a5303ffffffff01a0860100000000001976a9149bc0bbdd3024da4d0c38ed1aecf5c68dd1d3fa1288ac00000000", "P2SH,CONST_SCRIPTCODE"],
336362

337363
["Make diffs cleaner by leaving a comment here without comma at the end"]
338364
]

‎txscript/data/tx_valid.json

+7-5
Original file line numberDiff line numberDiff line change
@@ -471,17 +471,17 @@
471471
["BIP143 example: P2WSH with OP_CODESEPARATOR and out-of-range SIGHASH_SINGLE."],
472472
[[["6eb316926b1c5d567cd6f5e6a84fec606fc53d7b474526d1fff3948020c93dfe", 0, "0x21 0x036d5c20fa14fb2f635474c1dc4ef5909d4568e5569b79fc94d3448486e14685f8 CHECKSIG", 156250000],
473473
["f825690aee1b3dc247da796cacb12687a5e802429fd291cfd63e010f02cf1508", 0, "0x00 0x20 0x5d1b56b63d714eebe542309525f484b7e9d6f686b3781b6f61ef925d66d6f6a0", 4900000000]],
474-
"01000000000102fe3dc9208094f3ffd12645477b3dc56f60ec4fa8e6f5d67c565d1c6b9216b36e000000004847304402200af4e47c9b9629dbecc21f73af989bdaa911f7e6f6c2e9394588a3aa68f81e9902204f3fcf6ade7e5abb1295b6774c8e0abd94ae62217367096bc02ee5e435b67da201ffffffff0815cf020f013ed6cf91d29f4202e8a58726b1ac6c79da47c23d1bee0a6925f80000000000ffffffff0100f2052a010000001976a914a30741f8145e5acadf23f751864167f32e0963f788ac000347304402200de66acf4527789bfda55fc5459e214fa6083f936b430a762c629656216805ac0220396f550692cd347171cbc1ef1f51e15282e837bb2b30860dc77c8f78bc8501e503473044022027dc95ad6b740fe5129e7e62a75dd00f291a2aeb1200b84b09d9e3789406b6c002201a9ecd315dd6a0e632ab20bbb98948bc0c6fb204f2c286963bb48517a7058e27034721026dccc749adc2a9d0d89497ac511f760f45c47dc5ed9cf352a58ac706453880aeadab210255a9626aebf5e29c0e6538428ba0d1dcf6ca98ffdf086aa8ced5e0d0215ea465ac00000000", "P2SH,WITNESS"],
474+
"01000000000102fe3dc9208094f3ffd12645477b3dc56f60ec4fa8e6f5d67c565d1c6b9216b36e000000004847304402200af4e47c9b9629dbecc21f73af989bdaa911f7e6f6c2e9394588a3aa68f81e9902204f3fcf6ade7e5abb1295b6774c8e0abd94ae62217367096bc02ee5e435b67da201ffffffff0815cf020f013ed6cf91d29f4202e8a58726b1ac6c79da47c23d1bee0a6925f80000000000ffffffff0100f2052a010000001976a914a30741f8145e5acadf23f751864167f32e0963f788ac000347304402200de66acf4527789bfda55fc5459e214fa6083f936b430a762c629656216805ac0220396f550692cd347171cbc1ef1f51e15282e837bb2b30860dc77c8f78bc8501e503473044022027dc95ad6b740fe5129e7e62a75dd00f291a2aeb1200b84b09d9e3789406b6c002201a9ecd315dd6a0e632ab20bbb98948bc0c6fb204f2c286963bb48517a7058e27034721026dccc749adc2a9d0d89497ac511f760f45c47dc5ed9cf352a58ac706453880aeadab210255a9626aebf5e29c0e6538428ba0d1dcf6ca98ffdf086aa8ced5e0d0215ea465ac00000000", "P2SH,WITNESS,CONST_SCRIPTCODE"],
475475

476476
["BIP143 example: P2WSH with unexecuted OP_CODESEPARATOR and SINGLE|ANYONECANPAY"],
477477
[[["01c0cf7fba650638e55eb91261b183251fbb466f90dff17f10086817c542b5e9", 0, "0x00 0x20 0xba468eea561b26301e4cf69fa34bde4ad60c81e70f059f045ca9a79931004a4d", 16777215],
478478
["1b2a9a426ba603ba357ce7773cb5805cb9c7c2b386d100d1fc9263513188e680", 0, "0x00 0x20 0xd9bbfbe56af7c4b7f960a70d7ea107156913d9e5a26b0a71429df5e097ca6537", 16777215]],
479-
"01000000000102e9b542c5176808107ff1df906f46bb1f2583b16112b95ee5380665ba7fcfc0010000000000ffffffff80e68831516392fcd100d186b3c2c7b95c80b53c77e77c35ba03a66b429a2a1b0000000000ffffffff0280969800000000001976a914de4b231626ef508c9a74a8517e6783c0546d6b2888ac80969800000000001976a9146648a8cd4531e1ec47f35916de8e259237294d1e88ac02483045022100f6a10b8604e6dc910194b79ccfc93e1bc0ec7c03453caaa8987f7d6c3413566002206216229ede9b4d6ec2d325be245c5b508ff0339bf1794078e20bfe0babc7ffe683270063ab68210392972e2eb617b2388771abe27235fd5ac44af8e61693261550447a4c3e39da98ac024730440220032521802a76ad7bf74d0e2c218b72cf0cbc867066e2e53db905ba37f130397e02207709e2188ed7f08f4c952d9d13986da504502b8c3be59617e043552f506c46ff83275163ab68210392972e2eb617b2388771abe27235fd5ac44af8e61693261550447a4c3e39da98ac00000000", "P2SH,WITNESS"],
479+
"01000000000102e9b542c5176808107ff1df906f46bb1f2583b16112b95ee5380665ba7fcfc0010000000000ffffffff80e68831516392fcd100d186b3c2c7b95c80b53c77e77c35ba03a66b429a2a1b0000000000ffffffff0280969800000000001976a914de4b231626ef508c9a74a8517e6783c0546d6b2888ac80969800000000001976a9146648a8cd4531e1ec47f35916de8e259237294d1e88ac02483045022100f6a10b8604e6dc910194b79ccfc93e1bc0ec7c03453caaa8987f7d6c3413566002206216229ede9b4d6ec2d325be245c5b508ff0339bf1794078e20bfe0babc7ffe683270063ab68210392972e2eb617b2388771abe27235fd5ac44af8e61693261550447a4c3e39da98ac024730440220032521802a76ad7bf74d0e2c218b72cf0cbc867066e2e53db905ba37f130397e02207709e2188ed7f08f4c952d9d13986da504502b8c3be59617e043552f506c46ff83275163ab68210392972e2eb617b2388771abe27235fd5ac44af8e61693261550447a4c3e39da98ac00000000", "P2SH,WITNESS,CONST_SCRIPTCODE"],
480480

481481
["BIP143 example: Same as the previous example with input-output pairs swapped"],
482482
[[["1b2a9a426ba603ba357ce7773cb5805cb9c7c2b386d100d1fc9263513188e680", 0, "0x00 0x20 0xd9bbfbe56af7c4b7f960a70d7ea107156913d9e5a26b0a71429df5e097ca6537", 16777215],
483483
["01c0cf7fba650638e55eb91261b183251fbb466f90dff17f10086817c542b5e9", 0, "0x00 0x20 0xba468eea561b26301e4cf69fa34bde4ad60c81e70f059f045ca9a79931004a4d", 16777215]],
484-
"0100000000010280e68831516392fcd100d186b3c2c7b95c80b53c77e77c35ba03a66b429a2a1b0000000000ffffffffe9b542c5176808107ff1df906f46bb1f2583b16112b95ee5380665ba7fcfc0010000000000ffffffff0280969800000000001976a9146648a8cd4531e1ec47f35916de8e259237294d1e88ac80969800000000001976a914de4b231626ef508c9a74a8517e6783c0546d6b2888ac024730440220032521802a76ad7bf74d0e2c218b72cf0cbc867066e2e53db905ba37f130397e02207709e2188ed7f08f4c952d9d13986da504502b8c3be59617e043552f506c46ff83275163ab68210392972e2eb617b2388771abe27235fd5ac44af8e61693261550447a4c3e39da98ac02483045022100f6a10b8604e6dc910194b79ccfc93e1bc0ec7c03453caaa8987f7d6c3413566002206216229ede9b4d6ec2d325be245c5b508ff0339bf1794078e20bfe0babc7ffe683270063ab68210392972e2eb617b2388771abe27235fd5ac44af8e61693261550447a4c3e39da98ac00000000", "P2SH,WITNESS"],
484+
"0100000000010280e68831516392fcd100d186b3c2c7b95c80b53c77e77c35ba03a66b429a2a1b0000000000ffffffffe9b542c5176808107ff1df906f46bb1f2583b16112b95ee5380665ba7fcfc0010000000000ffffffff0280969800000000001976a9146648a8cd4531e1ec47f35916de8e259237294d1e88ac80969800000000001976a914de4b231626ef508c9a74a8517e6783c0546d6b2888ac024730440220032521802a76ad7bf74d0e2c218b72cf0cbc867066e2e53db905ba37f130397e02207709e2188ed7f08f4c952d9d13986da504502b8c3be59617e043552f506c46ff83275163ab68210392972e2eb617b2388771abe27235fd5ac44af8e61693261550447a4c3e39da98ac02483045022100f6a10b8604e6dc910194b79ccfc93e1bc0ec7c03453caaa8987f7d6c3413566002206216229ede9b4d6ec2d325be245c5b508ff0339bf1794078e20bfe0babc7ffe683270063ab68210392972e2eb617b2388771abe27235fd5ac44af8e61693261550447a4c3e39da98ac00000000", "P2SH,WITNESS,CONST_SCRIPTCODE"],
485485

486486
["BIP143 example: P2SH-P2WSH 6-of-6 multisig signed with 6 different SIGHASH types"],
487487
[[["6eb98797a21c6c10aa74edf29d618be109f48a8e94c694f3701e08ca69186436", 1, "HASH160 0x14 0x9993a429037b5d912407a71c252019287b8d27a5 EQUAL", 987654321]],
@@ -498,7 +498,7 @@
498498
"010000000169c12106097dc2e0526493ef67f21269fe888ef05c7a3a5dacab38e1ac8387f1581b0000b64830450220487fb382c4974de3f7d834c1b617fe15860828c7f96454490edd6d891556dcc9022100baf95feb48f845d5bfc9882eb6aeefa1bc3790e39f59eaa46ff7f15ae626c53e0121037a3fb04bcdb09eba90f69961ba1692a3528e45e67c85b200df820212d7594d334aad4830450220487fb382c4974de3f7d834c1b617fe15860828c7f96454490edd6d891556dcc9022100baf95feb48f845d5bfc9882eb6aeefa1bc3790e39f59eaa46ff7f15ae626c53e01ffffffff0101000000000000000000000000", "P2SH,WITNESS"],
499499
["BIP143: correct sighash (without FindAndDelete) = 71c9cd9b2869b9c70b01b1f0360c148f42dee72297db312638df136f43311f23"],
500500
[[["f18783ace138abac5d3a7a5cf08e88fe6912f267ef936452e0c27d090621c169", 7500, "0x00 0x20 0x9e1be07558ea5cc8e02ed1d80c0911048afad949affa36d5c3951e3159dbea19", 200000]],
501-
"0100000000010169c12106097dc2e0526493ef67f21269fe888ef05c7a3a5dacab38e1ac8387f14c1d000000ffffffff01010000000000000000034830450220487fb382c4974de3f7d834c1b617fe15860828c7f96454490edd6d891556dcc9022100baf95feb48f845d5bfc9882eb6aeefa1bc3790e39f59eaa46ff7f15ae626c53e012102a9781d66b61fb5a7ef00ac5ad5bc6ffc78be7b44a566e3c87870e1079368df4c4aad4830450220487fb382c4974de3f7d834c1b617fe15860828c7f96454490edd6d891556dcc9022100baf95feb48f845d5bfc9882eb6aeefa1bc3790e39f59eaa46ff7f15ae626c53e0100000000", "P2SH,WITNESS"],
501+
"0100000000010169c12106097dc2e0526493ef67f21269fe888ef05c7a3a5dacab38e1ac8387f14c1d000000ffffffff01010000000000000000034830450220487fb382c4974de3f7d834c1b617fe15860828c7f96454490edd6d891556dcc9022100baf95feb48f845d5bfc9882eb6aeefa1bc3790e39f59eaa46ff7f15ae626c53e012102a9781d66b61fb5a7ef00ac5ad5bc6ffc78be7b44a566e3c87870e1079368df4c4aad4830450220487fb382c4974de3f7d834c1b617fe15860828c7f96454490edd6d891556dcc9022100baf95feb48f845d5bfc9882eb6aeefa1bc3790e39f59eaa46ff7f15ae626c53e0100000000", "P2SH,WITNESS,CONST_SCRIPTCODE"],
502502
["This is multisig version of the FindAndDelete tests"],
503503
["Script is 2 CHECKMULTISIGVERIFY <sig1> <sig2> DROP"],
504504
["52af4830450220487fb382c4974de3f7d834c1b617fe15860828c7f96454490edd6d891556dcc9022100baf95feb48f845d5bfc9882eb6aeefa1bc3790e39f59eaa46ff7f15ae626c53e0148304502205286f726690b2e9b0207f0345711e63fa7012045b9eb0f19c2458ce1db90cf43022100e89f17f86abc5b149eba4115d4f128bcf45d77fb3ecdd34f594091340c0395960175"],
@@ -508,7 +508,9 @@
508508
"01000000019275cb8d4a485ce95741c013f7c0d28722160008021bb469a11982d47a662896581b0000fd6f01004830450220487fb382c4974de3f7d834c1b617fe15860828c7f96454490edd6d891556dcc9022100baf95feb48f845d5bfc9882eb6aeefa1bc3790e39f59eaa46ff7f15ae626c53e0148304502205286f726690b2e9b0207f0345711e63fa7012045b9eb0f19c2458ce1db90cf43022100e89f17f86abc5b149eba4115d4f128bcf45d77fb3ecdd34f594091340c03959601522102cd74a2809ffeeed0092bc124fd79836706e41f048db3f6ae9df8708cefb83a1c2102e615999372426e46fd107b76eaf007156a507584aa2cc21de9eee3bdbd26d36c4c9552af4830450220487fb382c4974de3f7d834c1b617fe15860828c7f96454490edd6d891556dcc9022100baf95feb48f845d5bfc9882eb6aeefa1bc3790e39f59eaa46ff7f15ae626c53e0148304502205286f726690b2e9b0207f0345711e63fa7012045b9eb0f19c2458ce1db90cf43022100e89f17f86abc5b149eba4115d4f128bcf45d77fb3ecdd34f594091340c0395960175ffffffff0101000000000000000000000000", "P2SH,WITNESS"],
509509
["BIP143: correct sighash (without FindAndDelete) = c1628a1e7c67f14ca0c27c06e4fdeec2e6d1a73c7a91d7c046ff83e835aebb72"],
510510
[[["9628667ad48219a169b41b020800162287d2c0f713c04157e95c484a8dcb7592", 7500, "0x00 0x20 0x9b66c15b4e0b4eb49fa877982cafded24859fe5b0e2dbfbe4f0df1de7743fd52", 200000]],
511-
"010000000001019275cb8d4a485ce95741c013f7c0d28722160008021bb469a11982d47a6628964c1d000000ffffffff0101000000000000000007004830450220487fb382c4974de3f7d834c1b617fe15860828c7f96454490edd6d891556dcc9022100baf95feb48f845d5bfc9882eb6aeefa1bc3790e39f59eaa46ff7f15ae626c53e0148304502205286f726690b2e9b0207f0345711e63fa7012045b9eb0f19c2458ce1db90cf43022100e89f17f86abc5b149eba4115d4f128bcf45d77fb3ecdd34f594091340c0395960101022102966f109c54e85d3aee8321301136cedeb9fc710fdef58a9de8a73942f8e567c021034ffc99dd9a79dd3cb31e2ab3e0b09e0e67db41ac068c625cd1f491576016c84e9552af4830450220487fb382c4974de3f7d834c1b617fe15860828c7f96454490edd6d891556dcc9022100baf95feb48f845d5bfc9882eb6aeefa1bc3790e39f59eaa46ff7f15ae626c53e0148304502205286f726690b2e9b0207f0345711e63fa7012045b9eb0f19c2458ce1db90cf43022100e89f17f86abc5b149eba4115d4f128bcf45d77fb3ecdd34f594091340c039596017500000000", "P2SH,WITNESS"],
511+
"010000000001019275cb8d4a485ce95741c013f7c0d28722160008021bb469a11982d47a6628964c1d000000ffffffff0101000000000000000007004830450220487fb382c4974de3f7d834c1b617fe15860828c7f96454490edd6d891556dcc9022100baf95feb48f845d5bfc9882eb6aeefa1bc3790e39f59eaa46ff7f15ae626c53e0148304502205286f726690b2e9b0207f0345711e63fa7012045b9eb0f19c2458ce1db90cf43022100e89f17f86abc5b149eba4115d4f128bcf45d77fb3ecdd34f594091340c0395960101022102966f109c54e85d3aee8321301136cedeb9fc710fdef58a9de8a73942f8e567c021034ffc99dd9a79dd3cb31e2ab3e0b09e0e67db41ac068c625cd1f491576016c84e9552af4830450220487fb382c4974de3f7d834c1b617fe15860828c7f96454490edd6d891556dcc9022100baf95feb48f845d5bfc9882eb6aeefa1bc3790e39f59eaa46ff7f15ae626c53e0148304502205286f726690b2e9b0207f0345711e63fa7012045b9eb0f19c2458ce1db90cf43022100e89f17f86abc5b149eba4115d4f128bcf45d77fb3ecdd34f594091340c039596017500000000", "P2SH,WITNESS,CONST_SCRIPTCODE"],
512+
[[["7a554c397846f025738965683b8448d79458c54b869f6391ece95145c962e65f", 0, "OP_HASH160 0x149512447916448e4193c321f2d599dff2538973f3 OP_EQUAL", 0]],
513+
"02000000015fe662c94551e9ec91639f864bc55894d748843b6865897325f04678394c557a0000000039093006020101020101012103f0665be3ccc59a592608790e84bcf117349fc76c77d06cd3fb323548c310ff340cad0a09300602010102010101ffffffff010000000000000000015100000000", "CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,CLEANSTACK,DERSIG,DISCOURAGE_UPGRADABLE_NOPS,LOW_S,MINIMALDATA,NULLDUMMY,NULLFAIL,P2SH,SIGPUSHONLY,STRICTENC,WITNESS,DISCOURAGE_UPGRADABLE_WITNESS_PROGRAM,MINIMALIF,WITNESS_PUBKEYTYPE,TAPROOT"],
512514

513515
["Make diffs cleaner by leaving a comment here without comma at the end"]
514516
]

‎txscript/engine.go

+4
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,10 @@ const (
114114
// ScriptVerifyDiscourageUpgradeablePubkeyType defines if unknown
115115
// public key versions (during tapscript execution) is non-standard.
116116
ScriptVerifyDiscourageUpgradeablePubkeyType
117+
118+
// ScriptVerifyConstScriptCode fails non-segwit scripts if a signature
119+
// match is found in the script code or if OP_CODESEPARATOR is used.
120+
ScriptVerifyConstScriptCode
117121
)
118122

119123
const (

‎txscript/error.go

+10
Original file line numberDiff line numberDiff line change
@@ -408,6 +408,14 @@ const (
408408
// is exceeded during taproot execution.
409409
ErrTaprootMaxSigOps
410410

411+
// ErrNonConstScriptCode is returned when a signature match is found when
412+
// calling removeOpcodeByData in a non-segwit script.
413+
ErrNonConstScriptCode
414+
415+
// ErrCodeSeparator is returned when OP_CODESEPARATOR is used in a
416+
// non-segwit script.
417+
ErrCodeSeparator
418+
411419
// numErrorCodes is the maximum error code number used in tests. This
412420
// entry MUST be the last entry in the enum.
413421
numErrorCodes
@@ -494,6 +502,8 @@ var errorCodeStrings = map[ErrorCode]string{
494502
ErrInvalidTaprootSigLen: "ErrInvalidTaprootSigLen",
495503
ErrTaprootPubkeyIsEmpty: "ErrTaprootPubkeyIsEmpty",
496504
ErrTaprootMaxSigOps: "ErrTaprootMaxSigOps",
505+
ErrNonConstScriptCode: "ErrNonConstScriptCode",
506+
ErrCodeSeparator: "ErrCodeSeparator",
497507
}
498508

499509
// String returns the ErrorCode as a human-readable name.

‎txscript/error_test.go

+2
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,8 @@ func TestErrorCodeStringer(t *testing.T) {
9696
{ErrInvalidTaprootSigLen, "ErrInvalidTaprootSigLen"},
9797
{ErrTaprootPubkeyIsEmpty, "ErrTaprootPubkeyIsEmpty"},
9898
{ErrTaprootMaxSigOps, "ErrTaprootMaxSigOps"},
99+
{ErrNonConstScriptCode, "ErrNonConstScriptCode"},
100+
{ErrCodeSeparator, "ErrCodeSeparator"},
99101
{0xffff, "Unknown ErrorCode (65535)"},
100102
}
101103

‎txscript/opcode.go

+22-4
Original file line numberDiff line numberDiff line change
@@ -1953,6 +1953,12 @@ func opcodeCodeSeparator(op *opcode, data []byte, vm *Engine) error {
19531953

19541954
if vm.taprootCtx != nil {
19551955
vm.taprootCtx.codeSepPos = uint32(vm.tokenizer.OpcodePosition())
1956+
} else if vm.witnessProgram == nil &&
1957+
vm.hasFlag(ScriptVerifyConstScriptCode) {
1958+
1959+
// Disable OP_CODESEPARATOR for non-segwit scripts.
1960+
str := "OP_CODESEPARATOR used in non-segwit script"
1961+
return scriptError(ErrCodeSeparator, str)
19561962
}
19571963

19581964
return nil
@@ -2073,7 +2079,13 @@ func opcodeCheckSig(op *opcode, data []byte, vm *Engine) error {
20732079
// TODO(roasbeef): return an error?
20742080
}
20752081

2076-
valid := sigVerifier.Verify()
2082+
result := sigVerifier.Verify()
2083+
valid := result.sigValid
2084+
2085+
if vm.hasFlag(ScriptVerifyConstScriptCode) && result.sigMatch {
2086+
str := "non-const script code"
2087+
return scriptError(ErrNonConstScriptCode, str)
2088+
}
20772089

20782090
switch {
20792091
// For tapscript, and prior execution with null fail active, if the
@@ -2166,11 +2178,11 @@ func opcodeCheckSigAdd(op *opcode, data []byte, vm *Engine) error {
21662178
return err
21672179
}
21682180

2169-
valid := sigVerifier.Verify()
2181+
result := sigVerifier.Verify()
21702182

21712183
// If the signature is invalid, this we fail execution, as it should
21722184
// have been an empty signature.
2173-
if !valid {
2185+
if !result.sigValid {
21742186
str := "signature not empty on failed checksig"
21752187
return scriptError(ErrNullFail, str)
21762188
}
@@ -2303,7 +2315,13 @@ func opcodeCheckMultiSig(op *opcode, data []byte, vm *Engine) error {
23032315
// no way for a signature to sign itself.
23042316
if !vm.isWitnessVersionActive(0) {
23052317
for _, sigInfo := range signatures {
2306-
script = removeOpcodeByData(script, sigInfo.signature)
2318+
var match bool
2319+
script, match = removeOpcodeByData(script, sigInfo.signature)
2320+
if vm.hasFlag(ScriptVerifyConstScriptCode) && match {
2321+
str := fmt.Sprintf("got match of %v in %v", sigInfo.signature,
2322+
script)
2323+
return scriptError(ErrNonConstScriptCode, str)
2324+
}
23072325
}
23082326
}
23092327

‎txscript/reference_test.go

+2
Original file line numberDiff line numberDiff line change
@@ -196,6 +196,8 @@ func parseScriptFlags(flagStr string) (ScriptFlags, error) {
196196
flags |= ScriptVerifyWitnessPubKeyType
197197
case "TAPROOT":
198198
flags |= ScriptVerifyTaproot
199+
case "CONST_SCRIPTCODE":
200+
flags |= ScriptVerifyConstScriptCode
199201
default:
200202
return flags, fmt.Errorf("invalid flag: %s", flag)
201203
}

‎txscript/script.go

+37-21
Original file line numberDiff line numberDiff line change
@@ -255,43 +255,59 @@ func isCanonicalPush(opcode byte, data []byte) bool {
255255
// NOTE: This function is only valid for version 0 scripts. Since the function
256256
// does not accept a script version, the results are undefined for other script
257257
// versions.
258-
func removeOpcodeByData(script []byte, dataToRemove []byte) []byte {
258+
func removeOpcodeByData(script []byte, dataToRemove []byte) ([]byte, bool) {
259259
// Avoid work when possible.
260260
if len(script) == 0 || len(dataToRemove) == 0 {
261-
return script
261+
return script, false
262262
}
263263

264264
// Parse through the script looking for a canonical data push that contains
265265
// the data to remove.
266266
const scriptVersion = 0
267267
var result []byte
268268
var prevOffset int32
269+
var match bool
269270
tokenizer := MakeScriptTokenizer(scriptVersion, script)
270271
for tokenizer.Next() {
271-
// In practice, the script will basically never actually contain the
272-
// data since this function is only used during signature verification
273-
// to remove the signature itself which would require some incredibly
274-
// non-standard code to create.
275-
//
276-
// Thus, as an optimization, avoid allocating a new script unless there
277-
// is actually a match that needs to be removed.
278-
op, data := tokenizer.Opcode(), tokenizer.Data()
279-
if isCanonicalPush(op, data) && bytes.Contains(data, dataToRemove) {
280-
if result == nil {
281-
fullPushLen := tokenizer.ByteIndex() - prevOffset
282-
result = make([]byte, 0, int32(len(script))-fullPushLen)
283-
result = append(result, script[0:prevOffset]...)
284-
}
285-
} else if result != nil {
286-
result = append(result, script[prevOffset:tokenizer.ByteIndex()]...)
272+
var found bool
273+
result, prevOffset, found = removeOpcodeCanonical(
274+
&tokenizer, script, dataToRemove, prevOffset, result,
275+
)
276+
if found {
277+
match = true
287278
}
288-
289-
prevOffset = tokenizer.ByteIndex()
290279
}
291280
if result == nil {
292281
result = script
293282
}
294-
return result
283+
return result, match
284+
}
285+
286+
func removeOpcodeCanonical(t *ScriptTokenizer, script, dataToRemove []byte,
287+
prevOffset int32, result []byte) ([]byte, int32, bool) {
288+
289+
var found bool
290+
291+
// In practice, the script will basically never actually contain the
292+
// data since this function is only used during signature verification
293+
// to remove the signature itself which would require some incredibly
294+
// non-standard code to create.
295+
//
296+
// Thus, as an optimization, avoid allocating a new script unless there
297+
// is actually a match that needs to be removed.
298+
op, data := t.Opcode(), t.Data()
299+
if isCanonicalPush(op, data) && bytes.Equal(data, dataToRemove) {
300+
if result == nil {
301+
fullPushLen := t.ByteIndex() - prevOffset
302+
result = make([]byte, 0, int32(len(script))-fullPushLen)
303+
result = append(result, script[0:prevOffset]...)
304+
}
305+
found = true
306+
} else if result != nil {
307+
result = append(result, script[prevOffset:t.ByteIndex()]...)
308+
}
309+
310+
return result, t.ByteIndex(), found
295311
}
296312

297313
// AsSmallInt returns the passed opcode, which must be true according to

‎txscript/script_test.go

+20-7
Original file line numberDiff line numberDiff line change
@@ -357,6 +357,12 @@ func TestRemoveOpcodeByData(t *testing.T) {
357357
remove: []byte{1, 2, 3, 4},
358358
after: []byte{OP_NOP},
359359
},
360+
{
361+
name: "",
362+
before: []byte{OP_NOP, OP_DATA_8, 1, 2, 3, 4, 5, 6, 7, 8, OP_DATA_4, 1, 2, 3, 4},
363+
remove: []byte{1, 2, 3, 4},
364+
after: []byte{OP_NOP, OP_DATA_8, 1, 2, 3, 4, 5, 6, 7, 8},
365+
},
360366
{
361367
name: "simple case",
362368
before: []byte{OP_DATA_4, 1, 2, 3, 4},
@@ -376,7 +382,9 @@ func TestRemoveOpcodeByData(t *testing.T) {
376382
bytes.Repeat([]byte{0}, 72)...),
377383
[]byte{1, 2, 3, 4}...),
378384
remove: []byte{1, 2, 3, 4},
379-
after: nil,
385+
after: append(append([]byte{OP_PUSHDATA1, 76},
386+
bytes.Repeat([]byte{0}, 72)...),
387+
[]byte{1, 2, 3, 4}...),
380388
},
381389
{
382390
name: "simple case (pushdata1 miss)",
@@ -400,7 +408,9 @@ func TestRemoveOpcodeByData(t *testing.T) {
400408
bytes.Repeat([]byte{0}, 252)...),
401409
[]byte{1, 2, 3, 4}...),
402410
remove: []byte{1, 2, 3, 4},
403-
after: nil,
411+
after: append(append([]byte{OP_PUSHDATA2, 0, 1},
412+
bytes.Repeat([]byte{0}, 252)...),
413+
[]byte{1, 2, 3, 4}...),
404414
},
405415
{
406416
name: "simple case (pushdata2 miss)",
@@ -425,7 +435,9 @@ func TestRemoveOpcodeByData(t *testing.T) {
425435
bytes.Repeat([]byte{0}, 65532)...),
426436
[]byte{1, 2, 3, 4}...),
427437
remove: []byte{1, 2, 3, 4},
428-
after: nil,
438+
after: append(append([]byte{OP_PUSHDATA4, 0, 0, 1, 0},
439+
bytes.Repeat([]byte{0}, 65532)...),
440+
[]byte{1, 2, 3, 4}...),
429441
},
430442
{
431443
name: "simple case (pushdata4 miss noncanonical)",
@@ -465,16 +477,17 @@ func TestRemoveOpcodeByData(t *testing.T) {
465477
// tstRemoveOpcodeByData is a convenience function to ensure the provided
466478
// script parses before attempting to remove the passed data.
467479
const scriptVersion = 0
468-
tstRemoveOpcodeByData := func(script []byte, data []byte) ([]byte, error) {
480+
tstRemoveOpcodeByData := func(script []byte, data []byte) ([]byte, bool, error) {
469481
if err := checkScriptParses(scriptVersion, script); err != nil {
470-
return nil, err
482+
return nil, false, err
471483
}
472484

473-
return removeOpcodeByData(script, data), nil
485+
result, match := removeOpcodeByData(script, data)
486+
return result, match, nil
474487
}
475488

476489
for _, test := range tests {
477-
result, err := tstRemoveOpcodeByData(test.before, test.remove)
490+
result, _, err := tstRemoveOpcodeByData(test.before, test.remove)
478491
if e := tstCheckScriptError(err, test.err); e != nil {
479492
t.Errorf("%s: %v", test.name, e)
480493
continue

‎txscript/sigvalidate.go

+38-22
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,14 @@ import (
2020
// pre-segwit, segwit v0, segwit v1 (taproot key spend validation), and the
2121
// base tapscript verification.
2222
type signatureVerifier interface {
23-
// Verify returns true if the signature verifier context deems the
23+
// Verify returns whether or not the signature verifier context deems the
2424
// signature to be valid for the given context.
25-
Verify() bool
25+
Verify() verifyResult
26+
}
27+
28+
type verifyResult struct {
29+
sigValid bool
30+
sigMatch bool
2631
}
2732

2833
// baseSigVerifier is used to verify signatures for the _base_ system, meaning
@@ -147,20 +152,23 @@ func (b *baseSigVerifier) verifySig(sigHash []byte) bool {
147152
return valid
148153
}
149154

150-
// Verify returns true if the signature verifier context deems the signature to
151-
// be valid for the given context.
155+
// Verify returns whether or not the signature verifier context deems the
156+
// signature to be valid for the given context.
152157
//
153158
// NOTE: This is part of the baseSigVerifier interface.
154-
func (b *baseSigVerifier) Verify() bool {
159+
func (b *baseSigVerifier) Verify() verifyResult {
155160
// Remove the signature since there is no way for a signature
156161
// to sign itself.
157-
subScript := removeOpcodeByData(b.subScript, b.fullSigBytes)
162+
subScript, match := removeOpcodeByData(b.subScript, b.fullSigBytes)
158163

159164
sigHash := calcSignatureHash(
160165
subScript, b.hashType, &b.vm.tx, b.vm.txIdx,
161166
)
162167

163-
return b.verifySig(sigHash)
168+
return verifyResult{
169+
sigValid: b.verifySig(sigHash),
170+
sigMatch: match,
171+
}
164172
}
165173

166174
// A compile-time assertion to ensure baseSigVerifier implements the
@@ -192,7 +200,7 @@ func newBaseSegwitSigVerifier(pkBytes, fullSigBytes []byte,
192200
// be valid for the given context.
193201
//
194202
// NOTE: This is part of the baseSigVerifier interface.
195-
func (s *baseSegwitSigVerifier) Verify() bool {
203+
func (s *baseSegwitSigVerifier) Verify() verifyResult {
196204
var sigHashes *TxSigHashes
197205
if s.vm.hashCache != nil {
198206
sigHashes = s.vm.hashCache
@@ -208,10 +216,12 @@ func (s *baseSegwitSigVerifier) Verify() bool {
208216
// TODO(roasbeef): this doesn't need to return an error, should
209217
// instead be further up the stack? this only returns an error
210218
// if the input index is greater than the number of inputs
211-
return false
219+
return verifyResult{}
212220
}
213221

214-
return s.verifySig(sigHash)
222+
return verifyResult{
223+
sigValid: s.verifySig(sigHash),
224+
}
215225
}
216226

217227
// A compile-time assertion to ensure baseSegwitSigVerifier implements the
@@ -356,11 +366,11 @@ func (t *taprootSigVerifier) verifySig(sigHash []byte) bool {
356366
return false
357367
}
358368

359-
// Verify returns true if the signature verifier context deems the signature to
360-
// be valid for the given context.
369+
// Verify returns whether or not the signature verifier context deems the
370+
// signature to be valid for the given context.
361371
//
362372
// NOTE: This is part of the baseSigVerifier interface.
363-
func (t *taprootSigVerifier) Verify() bool {
373+
func (t *taprootSigVerifier) Verify() verifyResult {
364374
var opts []TaprootSigHashOption
365375
if t.annex != nil {
366376
opts = append(opts, WithAnnex(t.annex))
@@ -374,10 +384,12 @@ func (t *taprootSigVerifier) Verify() bool {
374384
)
375385
if err != nil {
376386
// TODO(roasbeef): propagate the error here?
377-
return false
387+
return verifyResult{}
378388
}
379389

380-
return t.verifySig(sigHash)
390+
return verifyResult{
391+
sigValid: t.verifySig(sigHash),
392+
}
381393
}
382394

383395
// A compile-time assertion to ensure taprootSigVerifier implements the
@@ -439,16 +451,18 @@ func newBaseTapscriptSigVerifier(pkBytes, rawSig []byte,
439451
}
440452
}
441453

442-
// Verify returns true if the signature verifier context deems the signature to
443-
// be valid for the given context.
454+
// Verify returns whether or not the signature verifier context deems the
455+
// signature to be valid for the given context.
444456
//
445457
// NOTE: This is part of the baseSigVerifier interface.
446-
func (b *baseTapscriptSigVerifier) Verify() bool {
458+
func (b *baseTapscriptSigVerifier) Verify() verifyResult {
447459
// If the public key is blank, then that means it wasn't 0 or 32 bytes,
448460
// so we'll treat this as an unknown public key version and return
449-
// true.
461+
// that it's valid.
450462
if b.pubKey == nil {
451-
return true
463+
return verifyResult{
464+
sigValid: true,
465+
}
452466
}
453467

454468
var opts []TaprootSigHashOption
@@ -468,10 +482,12 @@ func (b *baseTapscriptSigVerifier) Verify() bool {
468482
)
469483
if err != nil {
470484
// TODO(roasbeef): propagate the error here?
471-
return false
485+
return verifyResult{}
472486
}
473487

474-
return b.verifySig(sigHash)
488+
return verifyResult{
489+
sigValid: b.verifySig(sigHash),
490+
}
475491
}
476492

477493
// A compile-time assertion to ensure baseTapscriptSigVerifier implements the

‎txscript/standard.go

+2-1
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,8 @@ const (
4646
ScriptVerifyTaproot |
4747
ScriptVerifyDiscourageUpgradeableTaprootVersion |
4848
ScriptVerifyDiscourageOpSuccess |
49-
ScriptVerifyDiscourageUpgradeablePubkeyType
49+
ScriptVerifyDiscourageUpgradeablePubkeyType |
50+
ScriptVerifyConstScriptCode
5051
)
5152

5253
// ScriptClass is an enumeration for the list of standard types of script.

‎txscript/taproot.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -84,8 +84,8 @@ func VerifyTaprootKeySpend(witnessProgram []byte, rawSig []byte, tx *wire.MsgTx,
8484
return err
8585
}
8686

87-
valid := keySpendVerifier.Verify()
88-
if valid {
87+
result := keySpendVerifier.Verify()
88+
if result.sigValid {
8989
return nil
9090
}
9191

0 commit comments

Comments
 (0)
Please sign in to comment.