test: refactor: deduplicate legacy ECDSA signing for tx inputs
There are several instances in functional tests and the framework
(MiniWallet, feature_block.py, p2p_segwit.py) where we create a legacy
ECDSA signature for a certain transaction's input by doing the following
steps:
1) calculate the `LegacySignatureHash` with the desired sighash type
2) create the actual digital signature by calling `ECKey.sign_ecdsa`
on the signature message hash calculated above
3) put the DER-encoded result as CScript data push into
tx input's scriptSig
Create a new helper `sign_input_legacy` which hides those details and
takes only the necessary parameters (tx, input index, relevant
scriptPubKey, private key, sighash type [SIGHASH_ALL by default]). For
further convenience, the signature is prepended to already existing
data-pushes in scriptSig, in order to avoid rehashing the transaction
after calling the new signing function.
This commit is contained in:
1 parent
61d59fed74
commit
5cf44275c8
4 files changed
+24
-25
No files matched your search
@@ -71,8 +71,8 @@ from test_framework.script import (
|
||||
SIGHASH_NONE,
|
||||
SIGHASH_SINGLE,
|
||||
SegwitV0SignatureHash,
|
||||
LegacySignatureHash,
|
||||
hash160,
|
||||
sign_input_legacy,
|
||||
)
|
||||
from test_framework.script_util import (
|
||||
key_to_p2pk_script,
|
||||
@@ -1529,10 +1529,8 @@ class SegWitTest(BitcoinTestFramework):
|
||||
tx5 = CTransaction()
|
||||
tx5.vin.append(CTxIn(COutPoint(tx4.sha256, 0), b""))
|
||||
tx5.vout.append(CTxOut(tx4.vout[0].nValue - 1000, CScript([OP_TRUE])))
|
||||
(sig_hash, err) = LegacySignatureHash(script_pubkey, tx5, 0, SIGHASH_ALL)
|
||||
signature = key.sign_ecdsa(sig_hash) + b'\x01' # 0x1 is SIGHASH_ALL
|
||||
tx5.vin[0].scriptSig = CScript([signature, pubkey])
|
||||
tx5.rehash()
|
||||
tx5.vin[0].scriptSig = CScript([pubkey])
|
||||
sign_input_legacy(tx5, 0, script_pubkey, key)
|
||||
# Should pass policy and consensus.
|
||||
test_transaction_acceptance(self.nodes[0], self.test_node, tx5, True, True)
|
||||
block = self.build_next_block()
|
||||
|
||||
Reference in new issue
Block a user