@@ -27,29 +27,29 @@ def decodescript_script_sig(self):
2727
2828 # below are test cases for all of the standard transaction types
2929
30- # 1) P2PK scriptSig
30+ self . log . info ( "- P2PK" )
3131 # the scriptSig of a public key scriptPubKey simply pushes a signature onto the stack
3232 rpc_result = self .nodes [0 ].decodescript (push_signature )
3333 assert_equal (signature , rpc_result ['asm' ])
3434
35- # 2) P2PKH scriptSig
35+ self . log . info ( "- P2PKH" )
3636 rpc_result = self .nodes [0 ].decodescript (push_signature + push_public_key )
3737 assert_equal (signature + ' ' + public_key , rpc_result ['asm' ])
3838
39- # 3) multisig scriptSig
39+ self . log . info ( "- multisig" )
4040 # this also tests the leading portion of a P2SH multisig scriptSig
4141 # OP_0 <A sig> <B sig>
4242 rpc_result = self .nodes [0 ].decodescript ('00' + push_signature + push_signature )
4343 assert_equal ('0 ' + signature + ' ' + signature , rpc_result ['asm' ])
4444
45- # 4) P2SH scriptSig
45+ self . log . info ( "- P2SH" )
4646 # an empty P2SH redeemScript is valid and makes for a very simple test case.
4747 # thus, such a spending scriptSig would just need to pass the outer redeemScript
4848 # hash test and leave true on the top of the stack.
4949 rpc_result = self .nodes [0 ].decodescript ('5100' )
5050 assert_equal ('1 0' , rpc_result ['asm' ])
5151
52- # 5) null data scriptSig - no such thing because null data scripts can not be spent.
52+ # null data scriptSig - no such thing because null data scripts can not be spent.
5353 # thus, no test case for that standard transaction type is here.
5454
5555 def decodescript_script_pub_key (self ):
@@ -63,21 +63,21 @@ def decodescript_script_pub_key(self):
6363
6464 # below are test cases for all of the standard transaction types
6565
66- # 1) P2PK scriptPubKey
66+ self . log . info ( "- P2PK" )
6767 # <pubkey> OP_CHECKSIG
6868 rpc_result = self .nodes [0 ].decodescript (push_public_key + 'ac' )
6969 assert_equal (public_key + ' OP_CHECKSIG' , rpc_result ['asm' ])
7070 # P2PK is translated to P2WPKH
7171 assert_equal ('0 ' + public_key_hash , rpc_result ['segwit' ]['asm' ])
7272
73- # 2) P2PKH scriptPubKey
73+ self . log . info ( "- P2PKH" )
7474 # OP_DUP OP_HASH160 <PubKeyHash> OP_EQUALVERIFY OP_CHECKSIG
7575 rpc_result = self .nodes [0 ].decodescript ('76a9' + push_public_key_hash + '88ac' )
7676 assert_equal ('OP_DUP OP_HASH160 ' + public_key_hash + ' OP_EQUALVERIFY OP_CHECKSIG' , rpc_result ['asm' ])
7777 # P2PKH is translated to P2WPKH
7878 assert_equal ('0 ' + public_key_hash , rpc_result ['segwit' ]['asm' ])
7979
80- # 3) multisig scriptPubKey
80+ self . log . info ( "- multisig" )
8181 # <m> <A pubkey> <B pubkey> <C pubkey> <n> OP_CHECKMULTISIG
8282 # just imagine that the pub keys used below are different.
8383 # for our purposes here it does not matter that they are the same even though it is unrealistic.
@@ -88,7 +88,7 @@ def decodescript_script_pub_key(self):
8888 multisig_script_hash = sha256 (bytes .fromhex (multisig_script )).hex ()
8989 assert_equal ('0 ' + multisig_script_hash , rpc_result ['segwit' ]['asm' ])
9090
91- # 4) P2SH scriptPubKey
91+ self . log . info ( "- P2SH" )
9292 # OP_HASH160 <Hash160(redeemScript)> OP_EQUAL.
9393 # push_public_key_hash here should actually be the hash of a redeem script.
9494 # but this works the same for purposes of this test.
@@ -97,7 +97,7 @@ def decodescript_script_pub_key(self):
9797 # P2SH does not work in segwit secripts. decodescript should not return a result for it.
9898 assert 'segwit' not in rpc_result
9999
100- # 5) null data scriptPubKey
100+ self . log . info ( "- null data" )
101101 # use a signature look-alike here to make sure that we do not decode random data as a signature.
102102 # this matters if/when signature sighash decoding comes along.
103103 # would want to make sure that no such decoding takes place in this case.
@@ -106,7 +106,8 @@ def decodescript_script_pub_key(self):
106106 rpc_result = self .nodes [0 ].decodescript ('6a' + signature_imposter )
107107 assert_equal ('OP_RETURN ' + signature_imposter [2 :], rpc_result ['asm' ])
108108
109- # 6) a CLTV redeem script. redeem scripts are in-effect scriptPubKey scripts, so adding a test here.
109+ self .log .info ("- CLTV redeem script" )
110+ # redeem scripts are in-effect scriptPubKey scripts, so adding a test here.
110111 # OP_NOP2 is also known as OP_CHECKLOCKTIMEVERIFY.
111112 # just imagine that the pub keys used below are different.
112113 # for our purposes here it does not matter that they are the same even though it is unrealistic.
@@ -126,15 +127,15 @@ def decodescript_script_pub_key(self):
126127 cltv_script_hash = sha256 (bytes .fromhex (cltv_script )).hex ()
127128 assert_equal ('0 ' + cltv_script_hash , rpc_result ['segwit' ]['asm' ])
128129
129- # 7) P2PK scriptPubKey
130+ self . log . info ( "- P2PK with uncompressed pubkey" )
130131 # <pubkey> OP_CHECKSIG
131132 rpc_result = self .nodes [0 ].decodescript (push_uncompressed_public_key + 'ac' )
132133 assert_equal (uncompressed_public_key + ' OP_CHECKSIG' , rpc_result ['asm' ])
133134 # uncompressed pubkeys are invalid for checksigs in segwit scripts.
134135 # decodescript should not return a P2WPKH equivalent.
135136 assert 'segwit' not in rpc_result
136137
137- # 8) multisig scriptPubKey with an uncompressed pubkey
138+ self . log . info ( "- multisig with uncompressed pubkey" )
138139 # <m> <A pubkey> <B pubkey> <n> OP_CHECKMULTISIG
139140 # just imagine that the pub keys used below are different.
140141 # the purpose of this test is to check that a segwit script is not returned for bare multisig scripts
@@ -145,15 +146,15 @@ def decodescript_script_pub_key(self):
145146 # decodescript should not return a P2WPKH equivalent.
146147 assert 'segwit' not in rpc_result
147148
148- # 9) P2WPKH scriptpubkey
149+ self . log . info ( "- P2WPKH" )
149150 # 0 <PubKeyHash>
150151 rpc_result = self .nodes [0 ].decodescript ('00' + push_public_key_hash )
151152 assert_equal ('0 ' + public_key_hash , rpc_result ['asm' ])
152153 # segwit scripts do not work nested into each other.
153154 # a nested segwit script should not be returned in the results.
154155 assert 'segwit' not in rpc_result
155156
156- # 10) P2WSH scriptpubkey
157+ self . log . info ( "- P2WSH" )
157158 # 0 <ScriptHash>
158159 # even though this hash is of a P2PK script which is better used as bare P2WPKH, it should not matter
159160 # for the purpose of this test.
@@ -169,7 +170,8 @@ def decoderawtransaction_asm_sighashtype(self):
169170 This test is in with the "decodescript" tests because they are testing the same "asm" script decodes.
170171 """
171172
172- # this test case uses a random plain vanilla mainnet transaction with a single P2PKH input and output
173+ self .log .info ("- various mainnet txs" )
174+ # this test case uses a mainnet transaction that has a P2SH input and both P2PKH and P2SH outputs.
173175 tx = '0100000001696a20784a2c70143f634e95227dbdfdf0ecd51647052e70854512235f5986ca010000008a47304402207174775824bec6c2700023309a168231ec80b82c6069282f5133e6f11cbb04460220570edc55c7c5da2ca687ebd0372d3546ebc3f810516a002350cac72dfe192dfb014104d3f898e6487787910a690410b7a917ef198905c27fb9d3b0a42da12aceae0544fc7088d239d9a48f2828a15a09e84043001f27cc80d162cb95404e1210161536ffffffff0100e1f505000000001976a914eb6c6e0cdb2d256a32d97b8df1fc75d1920d9bca88ac00000000'
174176 rpc_result = self .nodes [0 ].decoderawtransaction (tx )
175177 assert_equal ('304402207174775824bec6c2700023309a168231ec80b82c6069282f5133e6f11cbb04460220570edc55c7c5da2ca687ebd0372d3546ebc3f810516a002350cac72dfe192dfb[ALL] 04d3f898e6487787910a690410b7a917ef198905c27fb9d3b0a42da12aceae0544fc7088d239d9a48f2828a15a09e84043001f27cc80d162cb95404e1210161536' , rpc_result ['vin' ][0 ]['scriptSig' ]['asm' ])
@@ -185,11 +187,13 @@ def decoderawtransaction_asm_sighashtype(self):
185187 assert_equal ('OP_HASH160 2a5edea39971049a540474c6a99edf0aa4074c58 OP_EQUAL' , rpc_result ['vout' ][1 ]['scriptPubKey' ]['asm' ])
186188 txSave = tx_from_hex (tx )
187189
190+ self .log .info ("- tx not passing DER signature checks" )
188191 # make sure that a specifically crafted op_return value will not pass all the IsDERSignature checks and then get decoded as a sighash type
189192 tx = '01000000015ded05872fdbda629c7d3d02b194763ce3b9b1535ea884e3c8e765d42e316724020000006b48304502204c10d4064885c42638cbff3585915b322de33762598321145ba033fc796971e2022100bb153ad3baa8b757e30a2175bd32852d2e1cb9080f84d7e32fcdfd667934ef1b012103163c0ff73511ea1743fb5b98384a2ff09dd06949488028fd819f4d83f56264efffffffff0200000000000000000b6a0930060201000201000180380100000000001976a9141cabd296e753837c086da7a45a6c2fe0d49d7b7b88ac00000000'
190193 rpc_result = self .nodes [0 ].decoderawtransaction (tx )
191194 assert_equal ('OP_RETURN 300602010002010001' , rpc_result ['vout' ][0 ]['scriptPubKey' ]['asm' ])
192195
196+ self .log .info ("- tx passing DER signature checks" )
193197 # verify that we have not altered scriptPubKey processing even of a specially crafted P2PKH pubkeyhash and P2SH redeem script hash that is made to pass the der signature checks
194198 tx = '01000000018d1f5635abd06e2c7e2ddf58dc85b3de111e4ad6e0ab51bb0dcf5e84126d927300000000fdfe0000483045022100ae3b4e589dfc9d48cb82d41008dc5fa6a86f94d5c54f9935531924602730ab8002202f88cf464414c4ed9fa11b773c5ee944f66e9b05cc1e51d97abc22ce098937ea01483045022100b44883be035600e9328a01b66c7d8439b74db64187e76b99a68f7893b701d5380220225bf286493e4c4adcf928c40f785422572eb232f84a0b83b0dea823c3a19c75014c695221020743d44be989540d27b1b4bbbcfd17721c337cb6bc9af20eb8a32520b393532f2102c0120a1dda9e51a938d39ddd9fe0ebc45ea97e1d27a7cbd671d5431416d3dd87210213820eb3d5f509d7438c9eeecb4157b2f595105e7cd564b3cdbb9ead3da41eed53aeffffffff02611e0000000000001976a914301102070101010101010102060101010101010188acee2a02000000000017a91430110207010101010101010206010101010101018700000000'
195199 rpc_result = self .nodes [0 ].decoderawtransaction (tx )
@@ -207,7 +211,7 @@ def decoderawtransaction_asm_sighashtype(self):
207211 push_signature_2 = '48' + signature_2
208212 signature_2_sighash_decoded = der_signature + '[NONE|ANYONECANPAY]'
209213
210- # 1) P2PK scriptSig
214+ self . log . info ( "- P2PK scriptSig" )
211215 txSave .vin [0 ].scriptSig = bytes .fromhex (push_signature )
212216 rpc_result = self .nodes [0 ].decoderawtransaction (txSave .serialize ().hex ())
213217 assert_equal (signature_sighash_decoded , rpc_result ['vin' ][0 ]['scriptSig' ]['asm' ])
@@ -217,20 +221,23 @@ def decoderawtransaction_asm_sighashtype(self):
217221 rpc_result = self .nodes [0 ].decoderawtransaction (txSave .serialize ().hex ())
218222 assert_equal (signature_2_sighash_decoded , rpc_result ['vin' ][0 ]['scriptSig' ]['asm' ])
219223
220- # 2) multisig scriptSig
224+ self . log . info ( "- multisig scriptSig" )
221225 txSave .vin [0 ].scriptSig = bytes .fromhex ('00' + push_signature + push_signature_2 )
222226 rpc_result = self .nodes [0 ].decoderawtransaction (txSave .serialize ().hex ())
223227 assert_equal ('0 ' + signature_sighash_decoded + ' ' + signature_2_sighash_decoded , rpc_result ['vin' ][0 ]['scriptSig' ]['asm' ])
224228
225- # 3) test a scriptSig that contains more than push operations.
229+ self . log . info ( "- scriptSig that contains more than push operations" )
226230 # in fact, it contains an OP_RETURN with data specially crafted to cause improper decode if the code does not catch it.
227231 txSave .vin [0 ].scriptSig = bytes .fromhex ('6a143011020701010101010101020601010101010101' )
228232 rpc_result = self .nodes [0 ].decoderawtransaction (txSave .serialize ().hex ())
229233 assert_equal ('OP_RETURN 3011020701010101010101020601010101010101' , rpc_result ['vin' ][0 ]['scriptSig' ]['asm' ])
230234
231235 def run_test (self ):
236+ self .log .info ("Test decoding of standard input scripts [scriptSig]" )
232237 self .decodescript_script_sig ()
238+ self .log .info ("Test decoding of standard output scripts [scriptPubKey]" )
233239 self .decodescript_script_pub_key ()
240+ self .log .info ("Test 'asm' script decoding of transactions" )
234241 self .decoderawtransaction_asm_sighashtype ()
235242
236243if __name__ == '__main__' :
0 commit comments