mirror of
https://github.com/bitcoin/bitcoin.git
synced 2025-01-25 10:43:19 -03:00
Merge bitcoin/bitcoin#22363: test: refactor: use script_util
helpers for creating P2{PKH,SH,WPKH,WSH} scripts
905d672b74
test: use script_util helpers for creating P2W{PKH,SH} scripts (Sebastian Falbesoner)285a65ccfd
test: use script_util helpers for creating P2SH scripts (Sebastian Falbesoner)b57b633b94
test: use script_util helpers for creating P2PKH scripts (Sebastian Falbesoner)61b6a017a9
test: wallet util: fix multisig P2SH-P2WSH script creation (Sebastian Falbesoner) Pull request description: PR #18788 (commit08067aebfd
) introduced functions to generate output scripts for various types. This PR replaces all manual CScript creations in the P2PKH, P2SH, P2WPKH, P2WSH formats with those helpers in order to increase readability and maintainability over the functional test codebase. The first commit fixes a bug in the wallet_util helper module w.r.t. to P2SH-P2WSH script creation (the result is not used in any test so far, hence it can still be seen as refactoring). The following table shows a summary of the output script patterns tackled in this PR: | Type | master branch | PR branch | | ---------- | ------------- | ------------- | | P2PKH | `CScript([OP_DUP, OP_HASH160, hash160(key), OP_EQUALVERIFY, OP_CHECKSIG])` | `key_to_p2pkh_script(key)` | | | `CScript([OP_DUP, OP_HASH160, keyhash, OP_EQUALVERIFY, OP_CHECKSIG])` | `keyhash_to_p2pkh_script(keyhash)` | | P2SH | `CScript([OP_HASH160, hash160(script), OP_EQUAL])` | `script_to_p2sh_script(script)` | | P2WPKH | `CScript([OP_0, hash160(key)])` | `key_to_p2wpkh_script(key)` | | P2WSH | `CScript([OP_0, sha256(script)])` | `script_to_p2wsh_script(script)` | Note that the `key_to_...` helpers can't be used if an invalid key size (not 33 or 65 bytes) is passed, which is the case in some rare instances where the scripts still have to be created manually. Possible follow-up ideas: * further simplify by identifying P2SH-wrapped scripts and using `key_to_p2sh_p2wpkh_script()` and `script_to_p2sh_p2wsh_script()` helpers * introduce and use `key_to_p2pk_script()` helper for P2PK scripts ACKs for top commit: rajarshimaitra: tACK905d672b74
LarryRuane: tACK905d672b74
0xB10C: ACK905d672b74
MarcoFalke: review ACK905d672b74
🕹 Tree-SHA512: 7ccfe69699bc81168ac122b03536720013355c1b2fbb088355b616015318644c4d1cd27e20c4f56c89ad083ae609add4bc838cf6316794d0edb0ce9cf7fa0fd8
This commit is contained in:
commit
d1e4c56309
10 changed files with 135 additions and 163 deletions
|
@ -29,27 +29,32 @@ from test_framework.messages import (
|
|||
CTxOut,
|
||||
MAX_MONEY,
|
||||
)
|
||||
from test_framework import script as sc
|
||||
from test_framework.blocktools import create_tx_with_script, MAX_BLOCK_SIGOPS
|
||||
from test_framework.script import (
|
||||
CScript,
|
||||
OP_CAT,
|
||||
OP_SUBSTR,
|
||||
OP_LEFT,
|
||||
OP_RIGHT,
|
||||
OP_INVERT,
|
||||
OP_AND,
|
||||
OP_OR,
|
||||
OP_XOR,
|
||||
OP_2MUL,
|
||||
OP_0,
|
||||
OP_2DIV,
|
||||
OP_MUL,
|
||||
OP_2MUL,
|
||||
OP_AND,
|
||||
OP_CAT,
|
||||
OP_CHECKSIG,
|
||||
OP_DIV,
|
||||
OP_MOD,
|
||||
OP_INVERT,
|
||||
OP_LEFT,
|
||||
OP_LSHIFT,
|
||||
OP_RSHIFT
|
||||
OP_MOD,
|
||||
OP_MUL,
|
||||
OP_OR,
|
||||
OP_RIGHT,
|
||||
OP_RSHIFT,
|
||||
OP_SUBSTR,
|
||||
OP_TRUE,
|
||||
OP_XOR,
|
||||
)
|
||||
basic_p2sh = sc.CScript([sc.OP_HASH160, sc.hash160(sc.CScript([sc.OP_0])), sc.OP_EQUAL])
|
||||
from test_framework.script_util import (
|
||||
script_to_p2sh_script,
|
||||
)
|
||||
basic_p2sh = script_to_p2sh_script(CScript([OP_0]))
|
||||
|
||||
|
||||
class BadTxTemplate:
|
||||
|
@ -116,7 +121,7 @@ class SizeTooSmall(BadTxTemplate):
|
|||
def get_tx(self):
|
||||
tx = CTransaction()
|
||||
tx.vin.append(self.valid_txin)
|
||||
tx.vout.append(CTxOut(0, sc.CScript([sc.OP_TRUE])))
|
||||
tx.vout.append(CTxOut(0, CScript([OP_TRUE])))
|
||||
tx.calc_sha256()
|
||||
return tx
|
||||
|
||||
|
@ -230,7 +235,7 @@ class TooManySigops(BadTxTemplate):
|
|||
expect_disconnect = False
|
||||
|
||||
def get_tx(self):
|
||||
lotsa_checksigs = sc.CScript([sc.OP_CHECKSIG] * (MAX_BLOCK_SIGOPS))
|
||||
lotsa_checksigs = CScript([OP_CHECKSIG] * (MAX_BLOCK_SIGOPS))
|
||||
return create_tx_with_script(
|
||||
self.spend_tx, 0,
|
||||
script_pub_key=lotsa_checksigs,
|
||||
|
|
|
@ -37,17 +37,17 @@ from test_framework.script import (
|
|||
OP_CHECKSIGVERIFY,
|
||||
OP_ELSE,
|
||||
OP_ENDIF,
|
||||
OP_EQUAL,
|
||||
OP_DROP,
|
||||
OP_FALSE,
|
||||
OP_HASH160,
|
||||
OP_IF,
|
||||
OP_INVALIDOPCODE,
|
||||
OP_RETURN,
|
||||
OP_TRUE,
|
||||
SIGHASH_ALL,
|
||||
LegacySignatureHash,
|
||||
hash160,
|
||||
)
|
||||
from test_framework.script_util import (
|
||||
script_to_p2sh_script,
|
||||
)
|
||||
from test_framework.test_framework import BitcoinTestFramework
|
||||
from test_framework.util import assert_equal
|
||||
|
@ -469,8 +469,7 @@ class FullBlockTest(BitcoinTestFramework):
|
|||
|
||||
# Build the redeem script, hash it, use hash to create the p2sh script
|
||||
redeem_script = CScript([self.coinbase_pubkey] + [OP_2DUP, OP_CHECKSIGVERIFY] * 5 + [OP_CHECKSIG])
|
||||
redeem_script_hash = hash160(redeem_script)
|
||||
p2sh_script = CScript([OP_HASH160, redeem_script_hash, OP_EQUAL])
|
||||
p2sh_script = script_to_p2sh_script(redeem_script)
|
||||
|
||||
# Create a transaction that spends one satoshi to the p2sh_script, the rest to OP_TRUE
|
||||
# This must be signed because it is spending a coinbase
|
||||
|
|
|
@ -18,10 +18,10 @@ from test_framework.script import (
|
|||
OP_1,
|
||||
OP_2,
|
||||
OP_DROP,
|
||||
OP_EQUAL,
|
||||
OP_HASH160,
|
||||
OP_TRUE,
|
||||
hash160,
|
||||
)
|
||||
from test_framework.script_util import (
|
||||
script_to_p2sh_script,
|
||||
)
|
||||
from test_framework.test_framework import BitcoinTestFramework
|
||||
from test_framework.util import (
|
||||
|
@ -37,8 +37,8 @@ from test_framework.util import (
|
|||
# time signing.
|
||||
REDEEM_SCRIPT_1 = CScript([OP_1, OP_DROP])
|
||||
REDEEM_SCRIPT_2 = CScript([OP_2, OP_DROP])
|
||||
P2SH_1 = CScript([OP_HASH160, hash160(REDEEM_SCRIPT_1), OP_EQUAL])
|
||||
P2SH_2 = CScript([OP_HASH160, hash160(REDEEM_SCRIPT_2), OP_EQUAL])
|
||||
P2SH_1 = script_to_p2sh_script(REDEEM_SCRIPT_1)
|
||||
P2SH_2 = script_to_p2sh_script(REDEEM_SCRIPT_2)
|
||||
|
||||
# Associated ScriptSig's to spend satisfy P2SH_1 and P2SH_2
|
||||
SCRIPT_SIG = [CScript([OP_TRUE, REDEEM_SCRIPT_1]), CScript([OP_TRUE, REDEEM_SCRIPT_2])]
|
||||
|
|
|
@ -23,7 +23,6 @@ from test_framework.messages import (
|
|||
CTransaction,
|
||||
CTxIn,
|
||||
CTxOut,
|
||||
sha256,
|
||||
tx_from_hex,
|
||||
)
|
||||
from test_framework.script import (
|
||||
|
@ -34,12 +33,13 @@ from test_framework.script import (
|
|||
OP_CHECKMULTISIG,
|
||||
OP_CHECKSIG,
|
||||
OP_DROP,
|
||||
OP_DUP,
|
||||
OP_EQUAL,
|
||||
OP_EQUALVERIFY,
|
||||
OP_HASH160,
|
||||
OP_TRUE,
|
||||
hash160,
|
||||
)
|
||||
from test_framework.script_util import (
|
||||
key_to_p2pkh_script,
|
||||
key_to_p2wpkh_script,
|
||||
script_to_p2sh_script,
|
||||
script_to_p2wsh_script,
|
||||
)
|
||||
from test_framework.test_framework import BitcoinTestFramework
|
||||
from test_framework.util import (
|
||||
|
@ -353,7 +353,7 @@ class SegWitTest(BitcoinTestFramework):
|
|||
|
||||
multisig_without_privkey_address = self.nodes[0].addmultisigaddress(2, [pubkeys[3], pubkeys[4]])['address']
|
||||
script = CScript([OP_2, hex_str_to_bytes(pubkeys[3]), hex_str_to_bytes(pubkeys[4]), OP_2, OP_CHECKMULTISIG])
|
||||
solvable_after_importaddress.append(CScript([OP_HASH160, hash160(script), OP_EQUAL]))
|
||||
solvable_after_importaddress.append(script_to_p2sh_script(script))
|
||||
|
||||
for i in compressed_spendable_address:
|
||||
v = self.nodes[0].getaddressinfo(i)
|
||||
|
@ -427,10 +427,10 @@ class SegWitTest(BitcoinTestFramework):
|
|||
op0 = CScript([OP_0])
|
||||
# 2N7MGY19ti4KDMSzRfPAssP6Pxyuxoi6jLe is the P2SH(P2PKH) version of mjoE3sSrb8ByYEvgnC3Aox86u1CHnfJA4V
|
||||
unsolvable_address_key = hex_str_to_bytes("02341AEC7587A51CDE5279E0630A531AEA2615A9F80B17E8D9376327BAEAA59E3D")
|
||||
unsolvablep2pkh = CScript([OP_DUP, OP_HASH160, hash160(unsolvable_address_key), OP_EQUALVERIFY, OP_CHECKSIG])
|
||||
unsolvablep2wshp2pkh = CScript([OP_0, sha256(unsolvablep2pkh)])
|
||||
p2shop0 = CScript([OP_HASH160, hash160(op0), OP_EQUAL])
|
||||
p2wshop1 = CScript([OP_0, sha256(op1)])
|
||||
unsolvablep2pkh = key_to_p2pkh_script(unsolvable_address_key)
|
||||
unsolvablep2wshp2pkh = script_to_p2wsh_script(unsolvablep2pkh)
|
||||
p2shop0 = script_to_p2sh_script(op0)
|
||||
p2wshop1 = script_to_p2wsh_script(op1)
|
||||
unsolvable_after_importaddress.append(unsolvablep2pkh)
|
||||
unsolvable_after_importaddress.append(unsolvablep2wshp2pkh)
|
||||
unsolvable_after_importaddress.append(op1) # OP_1 will be imported as script
|
||||
|
@ -450,16 +450,16 @@ class SegWitTest(BitcoinTestFramework):
|
|||
if (v['isscript']):
|
||||
bare = hex_str_to_bytes(v['hex'])
|
||||
importlist.append(bare.hex())
|
||||
importlist.append(CScript([OP_0, sha256(bare)]).hex())
|
||||
importlist.append(script_to_p2wsh_script(bare).hex())
|
||||
else:
|
||||
pubkey = hex_str_to_bytes(v['pubkey'])
|
||||
p2pk = CScript([pubkey, OP_CHECKSIG])
|
||||
p2pkh = CScript([OP_DUP, OP_HASH160, hash160(pubkey), OP_EQUALVERIFY, OP_CHECKSIG])
|
||||
p2pkh = key_to_p2pkh_script(pubkey)
|
||||
importlist.append(p2pk.hex())
|
||||
importlist.append(p2pkh.hex())
|
||||
importlist.append(CScript([OP_0, hash160(pubkey)]).hex())
|
||||
importlist.append(CScript([OP_0, sha256(p2pk)]).hex())
|
||||
importlist.append(CScript([OP_0, sha256(p2pkh)]).hex())
|
||||
importlist.append(key_to_p2wpkh_script(pubkey).hex())
|
||||
importlist.append(script_to_p2wsh_script(p2pk).hex())
|
||||
importlist.append(script_to_p2wsh_script(p2pkh).hex())
|
||||
|
||||
importlist.append(unsolvablep2pkh.hex())
|
||||
importlist.append(unsolvablep2wshp2pkh.hex())
|
||||
|
@ -614,22 +614,22 @@ class SegWitTest(BitcoinTestFramework):
|
|||
def p2sh_address_to_script(self, v):
|
||||
bare = CScript(hex_str_to_bytes(v['hex']))
|
||||
p2sh = CScript(hex_str_to_bytes(v['scriptPubKey']))
|
||||
p2wsh = CScript([OP_0, sha256(bare)])
|
||||
p2sh_p2wsh = CScript([OP_HASH160, hash160(p2wsh), OP_EQUAL])
|
||||
p2wsh = script_to_p2wsh_script(bare)
|
||||
p2sh_p2wsh = script_to_p2sh_script(p2wsh)
|
||||
return([bare, p2sh, p2wsh, p2sh_p2wsh])
|
||||
|
||||
def p2pkh_address_to_script(self, v):
|
||||
pubkey = hex_str_to_bytes(v['pubkey'])
|
||||
p2wpkh = CScript([OP_0, hash160(pubkey)])
|
||||
p2sh_p2wpkh = CScript([OP_HASH160, hash160(p2wpkh), OP_EQUAL])
|
||||
p2wpkh = key_to_p2wpkh_script(pubkey)
|
||||
p2sh_p2wpkh = script_to_p2sh_script(p2wpkh)
|
||||
p2pk = CScript([pubkey, OP_CHECKSIG])
|
||||
p2pkh = CScript(hex_str_to_bytes(v['scriptPubKey']))
|
||||
p2sh_p2pk = CScript([OP_HASH160, hash160(p2pk), OP_EQUAL])
|
||||
p2sh_p2pkh = CScript([OP_HASH160, hash160(p2pkh), OP_EQUAL])
|
||||
p2wsh_p2pk = CScript([OP_0, sha256(p2pk)])
|
||||
p2wsh_p2pkh = CScript([OP_0, sha256(p2pkh)])
|
||||
p2sh_p2wsh_p2pk = CScript([OP_HASH160, hash160(p2wsh_p2pk), OP_EQUAL])
|
||||
p2sh_p2wsh_p2pkh = CScript([OP_HASH160, hash160(p2wsh_p2pkh), OP_EQUAL])
|
||||
p2sh_p2pk = script_to_p2sh_script(p2pk)
|
||||
p2sh_p2pkh = script_to_p2sh_script(p2pkh)
|
||||
p2wsh_p2pk = script_to_p2wsh_script(p2pk)
|
||||
p2wsh_p2pkh = script_to_p2wsh_script(p2pkh)
|
||||
p2sh_p2wsh_p2pk = script_to_p2sh_script(p2wsh_p2pk)
|
||||
p2sh_p2wsh_p2pkh = script_to_p2sh_script(p2wsh_p2pkh)
|
||||
return [p2wpkh, p2sh_p2wpkh, p2pk, p2pkh, p2sh_p2pk, p2sh_p2pkh, p2wsh_p2pk, p2wsh_p2pkh, p2sh_p2wsh_p2pk, p2sh_p2wsh_p2pkh]
|
||||
|
||||
def create_and_mine_tx_from_txids(self, txids, success=True):
|
||||
|
|
|
@ -57,7 +57,6 @@ from test_framework.script import (
|
|||
OP_ENDIF,
|
||||
OP_EQUAL,
|
||||
OP_EQUALVERIFY,
|
||||
OP_HASH160,
|
||||
OP_IF,
|
||||
OP_NOP,
|
||||
OP_NOT,
|
||||
|
@ -76,12 +75,17 @@ from test_framework.script import (
|
|||
is_op_success,
|
||||
taproot_construct,
|
||||
)
|
||||
from test_framework.script_util import (
|
||||
key_to_p2wpkh_script,
|
||||
keyhash_to_p2pkh_script,
|
||||
script_to_p2sh_script,
|
||||
script_to_p2wsh_script,
|
||||
)
|
||||
from test_framework.test_framework import BitcoinTestFramework
|
||||
from test_framework.util import assert_raises_rpc_error, assert_equal
|
||||
from test_framework.key import generate_privkey, compute_xonly_pubkey, sign_schnorr, tweak_add_privkey, ECKey
|
||||
from test_framework.address import (
|
||||
hash160,
|
||||
sha256,
|
||||
)
|
||||
from collections import OrderedDict, namedtuple
|
||||
from io import BytesIO
|
||||
|
@ -458,13 +462,13 @@ def make_spender(comment, *, tap=None, witv0=False, script=None, pkh=None, p2sh=
|
|||
# P2WPKH
|
||||
assert script is None
|
||||
pubkeyhash = hash160(pkh)
|
||||
spk = CScript([OP_0, pubkeyhash])
|
||||
conf["scriptcode"] = CScript([OP_DUP, OP_HASH160, pubkeyhash, OP_EQUALVERIFY, OP_CHECKSIG])
|
||||
spk = key_to_p2wpkh_script(pkh)
|
||||
conf["scriptcode"] = keyhash_to_p2pkh_script(pubkeyhash)
|
||||
conf["script_witv0"] = None
|
||||
conf["inputs"] = [getter("sign"), pkh]
|
||||
elif script is not None:
|
||||
# P2WSH
|
||||
spk = CScript([OP_0, sha256(script)])
|
||||
spk = script_to_p2wsh_script(script)
|
||||
conf["scriptcode"] = script
|
||||
conf["script_witv0"] = script
|
||||
else:
|
||||
|
@ -475,7 +479,7 @@ def make_spender(comment, *, tap=None, witv0=False, script=None, pkh=None, p2sh=
|
|||
# P2PKH
|
||||
assert script is None
|
||||
pubkeyhash = hash160(pkh)
|
||||
spk = CScript([OP_DUP, OP_HASH160, pubkeyhash, OP_EQUALVERIFY, OP_CHECKSIG])
|
||||
spk = keyhash_to_p2pkh_script(pubkeyhash)
|
||||
conf["scriptcode"] = spk
|
||||
conf["inputs"] = [getter("sign"), pkh]
|
||||
elif script is not None:
|
||||
|
@ -496,7 +500,7 @@ def make_spender(comment, *, tap=None, witv0=False, script=None, pkh=None, p2sh=
|
|||
if p2sh:
|
||||
# P2SH wrapper can be combined with anything else
|
||||
conf["script_p2sh"] = spk
|
||||
spk = CScript([OP_HASH160, hash160(spk), OP_EQUAL])
|
||||
spk = script_to_p2sh_script(spk)
|
||||
|
||||
conf = {**conf, **kwargs}
|
||||
|
||||
|
|
|
@ -20,16 +20,17 @@ from test_framework.messages import (
|
|||
tx_from_hex,
|
||||
)
|
||||
from test_framework.script import (
|
||||
hash160,
|
||||
CScript,
|
||||
OP_0,
|
||||
OP_2,
|
||||
OP_3,
|
||||
OP_CHECKMULTISIG,
|
||||
OP_EQUAL,
|
||||
OP_HASH160,
|
||||
OP_RETURN,
|
||||
)
|
||||
from test_framework.script_util import (
|
||||
script_to_p2sh_script,
|
||||
)
|
||||
from test_framework.util import (
|
||||
assert_equal,
|
||||
assert_raises_rpc_error,
|
||||
|
@ -300,7 +301,7 @@ class MempoolAcceptanceTest(BitcoinTestFramework):
|
|||
rawtxs=[tx.serialize().hex()],
|
||||
)
|
||||
tx = tx_from_hex(raw_tx_reference)
|
||||
output_p2sh_burn = CTxOut(nValue=540, scriptPubKey=CScript([OP_HASH160, hash160(b'burn'), OP_EQUAL]))
|
||||
output_p2sh_burn = CTxOut(nValue=540, scriptPubKey=script_to_p2sh_script(b'burn'))
|
||||
num_scripts = 100000 // len(output_p2sh_burn.serialize()) # Use enough outputs to make the tx too large for our policy
|
||||
tx.vout = [output_p2sh_burn] * num_scripts
|
||||
self.check_mempool_result(
|
||||
|
|
|
@ -41,7 +41,6 @@ from test_framework.messages import (
|
|||
ser_vector,
|
||||
sha256,
|
||||
tx_from_hex,
|
||||
uint256_from_str,
|
||||
)
|
||||
from test_framework.p2p import (
|
||||
P2PInterface,
|
||||
|
@ -60,12 +59,8 @@ from test_framework.script import (
|
|||
OP_CHECKMULTISIG,
|
||||
OP_CHECKSIG,
|
||||
OP_DROP,
|
||||
OP_DUP,
|
||||
OP_ELSE,
|
||||
OP_ENDIF,
|
||||
OP_EQUAL,
|
||||
OP_EQUALVERIFY,
|
||||
OP_HASH160,
|
||||
OP_IF,
|
||||
OP_RETURN,
|
||||
OP_TRUE,
|
||||
|
@ -77,6 +72,12 @@ from test_framework.script import (
|
|||
LegacySignatureHash,
|
||||
hash160,
|
||||
)
|
||||
from test_framework.script_util import (
|
||||
key_to_p2wpkh_script,
|
||||
keyhash_to_p2pkh_script,
|
||||
script_to_p2sh_script,
|
||||
script_to_p2wsh_script,
|
||||
)
|
||||
from test_framework.test_framework import BitcoinTestFramework
|
||||
from test_framework.util import (
|
||||
assert_equal,
|
||||
|
@ -100,10 +101,6 @@ class UTXO():
|
|||
self.n = n
|
||||
self.nValue = value
|
||||
|
||||
def get_p2pkh_script(pubkeyhash):
|
||||
"""Get the script associated with a P2PKH."""
|
||||
return CScript([CScriptOp(OP_DUP), CScriptOp(OP_HASH160), pubkeyhash, CScriptOp(OP_EQUALVERIFY), CScriptOp(OP_CHECKSIG)])
|
||||
|
||||
def sign_p2pk_witness_input(script, tx_to, in_idx, hashtype, value, key):
|
||||
"""Add signature for a P2PK witness program."""
|
||||
tx_hash = SegwitV0SignatureHash(script, tx_to, in_idx, hashtype, value)
|
||||
|
@ -492,11 +489,8 @@ class SegWitTest(BitcoinTestFramework):
|
|||
|
||||
# Create two outputs, a p2wsh and p2sh-p2wsh
|
||||
witness_program = CScript([OP_TRUE])
|
||||
witness_hash = sha256(witness_program)
|
||||
script_pubkey = CScript([OP_0, witness_hash])
|
||||
|
||||
p2sh_pubkey = hash160(script_pubkey)
|
||||
p2sh_script_pubkey = CScript([OP_HASH160, p2sh_pubkey, OP_EQUAL])
|
||||
script_pubkey = script_to_p2wsh_script(witness_program)
|
||||
p2sh_script_pubkey = script_to_p2sh_script(script_pubkey)
|
||||
|
||||
value = self.utxo[0].nValue // 3
|
||||
|
||||
|
@ -631,11 +625,8 @@ class SegWitTest(BitcoinTestFramework):
|
|||
V0 segwit inputs may only be mined after activation, but not before."""
|
||||
|
||||
witness_program = CScript([OP_TRUE])
|
||||
witness_hash = sha256(witness_program)
|
||||
script_pubkey = CScript([OP_0, witness_hash])
|
||||
|
||||
p2sh_pubkey = hash160(witness_program)
|
||||
p2sh_script_pubkey = CScript([OP_HASH160, p2sh_pubkey, OP_EQUAL])
|
||||
script_pubkey = script_to_p2wsh_script(witness_program)
|
||||
p2sh_script_pubkey = script_to_p2sh_script(witness_program)
|
||||
|
||||
# First prepare a p2sh output (so that spending it will pass standardness)
|
||||
p2sh_tx = CTransaction()
|
||||
|
@ -662,6 +653,7 @@ class SegWitTest(BitcoinTestFramework):
|
|||
test_transaction_acceptance(self.nodes[1], self.std_node, tx, with_witness=True, accepted=True)
|
||||
|
||||
# Now create something that looks like a P2PKH output. This won't be spendable.
|
||||
witness_hash = sha256(witness_program)
|
||||
script_pubkey = CScript([OP_0, hash160(witness_hash)])
|
||||
tx2 = CTransaction()
|
||||
# tx was accepted, so we spend the second output.
|
||||
|
@ -740,10 +732,8 @@ class SegWitTest(BitcoinTestFramework):
|
|||
|
||||
# Prepare the p2sh-wrapped witness output
|
||||
witness_program = CScript([OP_DROP, OP_TRUE])
|
||||
witness_hash = sha256(witness_program)
|
||||
p2wsh_pubkey = CScript([OP_0, witness_hash])
|
||||
p2sh_witness_hash = hash160(p2wsh_pubkey)
|
||||
script_pubkey = CScript([OP_HASH160, p2sh_witness_hash, OP_EQUAL])
|
||||
p2wsh_pubkey = script_to_p2wsh_script(witness_program)
|
||||
script_pubkey = script_to_p2sh_script(p2wsh_pubkey)
|
||||
script_sig = CScript([p2wsh_pubkey]) # a push of the redeem script
|
||||
|
||||
# Fund the P2SH output
|
||||
|
@ -837,8 +827,7 @@ class SegWitTest(BitcoinTestFramework):
|
|||
|
||||
# Let's construct a witness program
|
||||
witness_program = CScript([OP_TRUE])
|
||||
witness_hash = sha256(witness_program)
|
||||
script_pubkey = CScript([OP_0, witness_hash])
|
||||
script_pubkey = script_to_p2wsh_script(witness_program)
|
||||
tx.vout.append(CTxOut(self.utxo[0].nValue - 1000, script_pubkey))
|
||||
tx.rehash()
|
||||
|
||||
|
@ -951,8 +940,7 @@ class SegWitTest(BitcoinTestFramework):
|
|||
NUM_OUTPUTS = 50
|
||||
|
||||
witness_program = CScript([OP_2DROP] * NUM_DROPS + [OP_TRUE])
|
||||
witness_hash = uint256_from_str(sha256(witness_program))
|
||||
script_pubkey = CScript([OP_0, ser_uint256(witness_hash)])
|
||||
script_pubkey = script_to_p2wsh_script(witness_program)
|
||||
|
||||
prevout = COutPoint(self.utxo[0].sha256, self.utxo[0].n)
|
||||
value = self.utxo[0].nValue
|
||||
|
@ -1054,8 +1042,7 @@ class SegWitTest(BitcoinTestFramework):
|
|||
block = self.build_next_block()
|
||||
|
||||
witness_program = CScript([OP_DROP, OP_TRUE])
|
||||
witness_hash = sha256(witness_program)
|
||||
script_pubkey = CScript([OP_0, witness_hash])
|
||||
script_pubkey = script_to_p2wsh_script(witness_program)
|
||||
|
||||
# First try extra witness data on a tx that doesn't require a witness
|
||||
tx = CTransaction()
|
||||
|
@ -1127,8 +1114,7 @@ class SegWitTest(BitcoinTestFramework):
|
|||
block = self.build_next_block()
|
||||
|
||||
witness_program = CScript([OP_DROP, OP_TRUE])
|
||||
witness_hash = sha256(witness_program)
|
||||
script_pubkey = CScript([OP_0, witness_hash])
|
||||
script_pubkey = script_to_p2wsh_script(witness_program)
|
||||
|
||||
tx = CTransaction()
|
||||
tx.vin.append(CTxIn(COutPoint(self.utxo[0].sha256, self.utxo[0].n), b""))
|
||||
|
@ -1166,8 +1152,7 @@ class SegWitTest(BitcoinTestFramework):
|
|||
# This program is 19 max pushes (9937 bytes), then 64 more opcode-bytes.
|
||||
long_witness_program = CScript([b'a' * MAX_SCRIPT_ELEMENT_SIZE] * 19 + [OP_DROP] * 63 + [OP_TRUE])
|
||||
assert len(long_witness_program) == MAX_PROGRAM_LENGTH + 1
|
||||
long_witness_hash = sha256(long_witness_program)
|
||||
long_script_pubkey = CScript([OP_0, long_witness_hash])
|
||||
long_script_pubkey = script_to_p2wsh_script(long_witness_program)
|
||||
|
||||
block = self.build_next_block()
|
||||
|
||||
|
@ -1190,8 +1175,7 @@ class SegWitTest(BitcoinTestFramework):
|
|||
# Try again with one less byte in the witness program
|
||||
witness_program = CScript([b'a' * MAX_SCRIPT_ELEMENT_SIZE] * 19 + [OP_DROP] * 62 + [OP_TRUE])
|
||||
assert len(witness_program) == MAX_PROGRAM_LENGTH
|
||||
witness_hash = sha256(witness_program)
|
||||
script_pubkey = CScript([OP_0, witness_hash])
|
||||
script_pubkey = script_to_p2wsh_script(witness_program)
|
||||
|
||||
tx.vout[0] = CTxOut(tx.vout[0].nValue, script_pubkey)
|
||||
tx.rehash()
|
||||
|
@ -1210,8 +1194,7 @@ class SegWitTest(BitcoinTestFramework):
|
|||
"""Test that vin length must match vtxinwit length."""
|
||||
|
||||
witness_program = CScript([OP_DROP, OP_TRUE])
|
||||
witness_hash = sha256(witness_program)
|
||||
script_pubkey = CScript([OP_0, witness_hash])
|
||||
script_pubkey = script_to_p2wsh_script(witness_program)
|
||||
|
||||
# Create a transaction that splits our utxo into many outputs
|
||||
tx = CTransaction()
|
||||
|
@ -1318,8 +1301,7 @@ class SegWitTest(BitcoinTestFramework):
|
|||
|
||||
# Now try to add extra witness data to a valid witness tx.
|
||||
witness_program = CScript([OP_TRUE])
|
||||
witness_hash = sha256(witness_program)
|
||||
script_pubkey = CScript([OP_0, witness_hash])
|
||||
script_pubkey = script_to_p2wsh_script(witness_program)
|
||||
tx2 = CTransaction()
|
||||
tx2.vin.append(CTxIn(COutPoint(tx_hash, 0), b""))
|
||||
tx2.vout.append(CTxOut(tx.vout[0].nValue - 1000, script_pubkey))
|
||||
|
@ -1331,9 +1313,8 @@ class SegWitTest(BitcoinTestFramework):
|
|||
|
||||
# Add too-large for IsStandard witness and check that it does not enter reject filter
|
||||
p2sh_program = CScript([OP_TRUE])
|
||||
p2sh_pubkey = hash160(p2sh_program)
|
||||
witness_program2 = CScript([b'a' * 400000])
|
||||
tx3.vout.append(CTxOut(tx2.vout[0].nValue - 1000, CScript([OP_HASH160, p2sh_pubkey, OP_EQUAL])))
|
||||
tx3.vout.append(CTxOut(tx2.vout[0].nValue - 1000, script_to_p2sh_script(p2sh_program)))
|
||||
tx3.wit.vtxinwit[0].scriptWitness.stack = [witness_program2]
|
||||
tx3.rehash()
|
||||
|
||||
|
@ -1482,8 +1463,7 @@ class SegWitTest(BitcoinTestFramework):
|
|||
block = self.build_next_block()
|
||||
# Change the output of the block to be a witness output.
|
||||
witness_program = CScript([OP_TRUE])
|
||||
witness_hash = sha256(witness_program)
|
||||
script_pubkey = CScript([OP_0, witness_hash])
|
||||
script_pubkey = script_to_p2wsh_script(witness_program)
|
||||
block.vtx[0].vout[0].scriptPubKey = script_pubkey
|
||||
# This next line will rehash the coinbase and update the merkle
|
||||
# root, and solve.
|
||||
|
@ -1530,7 +1510,7 @@ class SegWitTest(BitcoinTestFramework):
|
|||
# Test 1: P2WPKH
|
||||
# First create a P2WPKH output that uses an uncompressed pubkey
|
||||
pubkeyhash = hash160(pubkey)
|
||||
script_pkh = CScript([OP_0, pubkeyhash])
|
||||
script_pkh = key_to_p2wpkh_script(pubkey)
|
||||
tx = CTransaction()
|
||||
tx.vin.append(CTxIn(COutPoint(utxo.sha256, utxo.n), b""))
|
||||
tx.vout.append(CTxOut(utxo.nValue - 1000, script_pkh))
|
||||
|
@ -1544,13 +1524,12 @@ class SegWitTest(BitcoinTestFramework):
|
|||
# Now try to spend it. Send it to a P2WSH output, which we'll
|
||||
# use in the next test.
|
||||
witness_program = CScript([pubkey, CScriptOp(OP_CHECKSIG)])
|
||||
witness_hash = sha256(witness_program)
|
||||
script_wsh = CScript([OP_0, witness_hash])
|
||||
script_wsh = script_to_p2wsh_script(witness_program)
|
||||
|
||||
tx2 = CTransaction()
|
||||
tx2.vin.append(CTxIn(COutPoint(tx.sha256, 0), b""))
|
||||
tx2.vout.append(CTxOut(tx.vout[0].nValue - 1000, script_wsh))
|
||||
script = get_p2pkh_script(pubkeyhash)
|
||||
script = keyhash_to_p2pkh_script(pubkeyhash)
|
||||
sig_hash = SegwitV0SignatureHash(script, tx2, 0, SIGHASH_ALL, tx.vout[0].nValue)
|
||||
signature = key.sign_ecdsa(sig_hash) + b'\x01' # 0x1 is SIGHASH_ALL
|
||||
tx2.wit.vtxinwit.append(CTxInWitness())
|
||||
|
@ -1567,8 +1546,7 @@ class SegWitTest(BitcoinTestFramework):
|
|||
# Test 2: P2WSH
|
||||
# Try to spend the P2WSH output created in last test.
|
||||
# Send it to a P2SH(P2WSH) output, which we'll use in the next test.
|
||||
p2sh_witness_hash = hash160(script_wsh)
|
||||
script_p2sh = CScript([OP_HASH160, p2sh_witness_hash, OP_EQUAL])
|
||||
script_p2sh = script_to_p2sh_script(script_wsh)
|
||||
script_sig = CScript([script_wsh])
|
||||
|
||||
tx3 = CTransaction()
|
||||
|
@ -1587,7 +1565,7 @@ class SegWitTest(BitcoinTestFramework):
|
|||
# Test 3: P2SH(P2WSH)
|
||||
# Try to spend the P2SH output created in the last test.
|
||||
# Send it to a P2PKH output, which we'll use in the next test.
|
||||
script_pubkey = get_p2pkh_script(pubkeyhash)
|
||||
script_pubkey = keyhash_to_p2pkh_script(pubkeyhash)
|
||||
tx4 = CTransaction()
|
||||
tx4.vin.append(CTxIn(COutPoint(tx3.sha256, 0), script_sig))
|
||||
tx4.vout.append(CTxOut(tx3.vout[0].nValue - 1000, script_pubkey))
|
||||
|
@ -1624,8 +1602,7 @@ class SegWitTest(BitcoinTestFramework):
|
|||
pubkey = key.get_pubkey().get_bytes()
|
||||
|
||||
witness_program = CScript([pubkey, CScriptOp(OP_CHECKSIG)])
|
||||
witness_hash = sha256(witness_program)
|
||||
script_pubkey = CScript([OP_0, witness_hash])
|
||||
script_pubkey = script_to_p2wsh_script(witness_program)
|
||||
|
||||
# First create a witness output for use in the tests.
|
||||
tx = CTransaction()
|
||||
|
@ -1744,7 +1721,7 @@ class SegWitTest(BitcoinTestFramework):
|
|||
|
||||
# Now test witness version 0 P2PKH transactions
|
||||
pubkeyhash = hash160(pubkey)
|
||||
script_pkh = CScript([OP_0, pubkeyhash])
|
||||
script_pkh = key_to_p2wpkh_script(pubkey)
|
||||
tx = CTransaction()
|
||||
tx.vin.append(CTxIn(COutPoint(temp_utxos[0].sha256, temp_utxos[0].n), b""))
|
||||
tx.vout.append(CTxOut(temp_utxos[0].nValue, script_pkh))
|
||||
|
@ -1754,7 +1731,7 @@ class SegWitTest(BitcoinTestFramework):
|
|||
tx2.vin.append(CTxIn(COutPoint(tx.sha256, 0), b""))
|
||||
tx2.vout.append(CTxOut(tx.vout[0].nValue, CScript([OP_TRUE])))
|
||||
|
||||
script = get_p2pkh_script(pubkeyhash)
|
||||
script = keyhash_to_p2pkh_script(pubkeyhash)
|
||||
sig_hash = SegwitV0SignatureHash(script, tx2, 0, SIGHASH_ALL, tx.vout[0].nValue)
|
||||
signature = key.sign_ecdsa(sig_hash) + b'\x01' # 0x1 is SIGHASH_ALL
|
||||
|
||||
|
@ -1806,8 +1783,7 @@ class SegWitTest(BitcoinTestFramework):
|
|||
# rules (an anyone-can-spend OP_TRUE would be rejected, if not wrapped
|
||||
# in P2SH).
|
||||
p2sh_program = CScript([OP_TRUE])
|
||||
p2sh_pubkey = hash160(p2sh_program)
|
||||
script_pubkey = CScript([OP_HASH160, p2sh_pubkey, OP_EQUAL])
|
||||
script_pubkey = script_to_p2sh_script(p2sh_program)
|
||||
|
||||
# Now check that unnecessary witnesses can't be used to blind a node
|
||||
# to a transaction, eg by violating standardness checks.
|
||||
|
@ -1872,11 +1848,10 @@ class SegWitTest(BitcoinTestFramework):
|
|||
# For each script, generate a pair of P2WSH and P2SH-P2WSH output.
|
||||
outputvalue = (self.utxo[0].nValue - 1000) // (len(scripts) * 2)
|
||||
for i in scripts:
|
||||
p2wsh = CScript([OP_0, sha256(i)])
|
||||
p2sh = hash160(p2wsh)
|
||||
p2wsh = script_to_p2wsh_script(i)
|
||||
p2wsh_scripts.append(p2wsh)
|
||||
tx.vout.append(CTxOut(outputvalue, p2wsh))
|
||||
tx.vout.append(CTxOut(outputvalue, CScript([OP_HASH160, p2sh, OP_EQUAL])))
|
||||
tx.vout.append(CTxOut(outputvalue, script_to_p2sh_script(p2wsh)))
|
||||
tx.rehash()
|
||||
txid = tx.sha256
|
||||
test_transaction_acceptance(self.nodes[0], self.test_node, tx, with_witness=False, accepted=True)
|
||||
|
@ -1890,13 +1865,13 @@ class SegWitTest(BitcoinTestFramework):
|
|||
for i in range(len(scripts)):
|
||||
p2wsh_tx = CTransaction()
|
||||
p2wsh_tx.vin.append(CTxIn(COutPoint(txid, i * 2)))
|
||||
p2wsh_tx.vout.append(CTxOut(outputvalue - 5000, CScript([OP_0, hash160(hex_str_to_bytes(""))])))
|
||||
p2wsh_tx.vout.append(CTxOut(outputvalue - 5000, CScript([OP_0, hash160(b"")])))
|
||||
p2wsh_tx.wit.vtxinwit.append(CTxInWitness())
|
||||
p2wsh_tx.rehash()
|
||||
p2wsh_txs.append(p2wsh_tx)
|
||||
p2sh_tx = CTransaction()
|
||||
p2sh_tx.vin.append(CTxIn(COutPoint(txid, i * 2 + 1), CScript([p2wsh_scripts[i]])))
|
||||
p2sh_tx.vout.append(CTxOut(outputvalue - 5000, CScript([OP_0, hash160(hex_str_to_bytes(""))])))
|
||||
p2sh_tx.vout.append(CTxOut(outputvalue - 5000, CScript([OP_0, hash160(b"")])))
|
||||
p2sh_tx.wit.vtxinwit.append(CTxInWitness())
|
||||
p2sh_tx.rehash()
|
||||
p2sh_txs.append(p2sh_tx)
|
||||
|
@ -1991,8 +1966,7 @@ class SegWitTest(BitcoinTestFramework):
|
|||
|
||||
# Keep this under MAX_OPS_PER_SCRIPT (201)
|
||||
witness_program = CScript([OP_TRUE, OP_IF, OP_TRUE, OP_ELSE] + [OP_CHECKMULTISIG] * 5 + [OP_CHECKSIG] * 193 + [OP_ENDIF])
|
||||
witness_hash = sha256(witness_program)
|
||||
script_pubkey = CScript([OP_0, witness_hash])
|
||||
script_pubkey = script_to_p2wsh_script(witness_program)
|
||||
|
||||
sigops_per_script = 20 * 5 + 193 * 1
|
||||
# We'll produce 2 extra outputs, one with a program that would take us
|
||||
|
@ -2008,14 +1982,12 @@ class SegWitTest(BitcoinTestFramework):
|
|||
# N(=MAX_SIGOP_COST//sigops_per_script) outputs of our transaction,
|
||||
# would push us just over the block sigop limit.
|
||||
witness_program_toomany = CScript([OP_TRUE, OP_IF, OP_TRUE, OP_ELSE] + [OP_CHECKSIG] * (extra_sigops_available + 1) + [OP_ENDIF])
|
||||
witness_hash_toomany = sha256(witness_program_toomany)
|
||||
script_pubkey_toomany = CScript([OP_0, witness_hash_toomany])
|
||||
script_pubkey_toomany = script_to_p2wsh_script(witness_program_toomany)
|
||||
|
||||
# If we spend this script instead, we would exactly reach our sigop
|
||||
# limit (for witness sigops).
|
||||
witness_program_justright = CScript([OP_TRUE, OP_IF, OP_TRUE, OP_ELSE] + [OP_CHECKSIG] * (extra_sigops_available) + [OP_ENDIF])
|
||||
witness_hash_justright = sha256(witness_program_justright)
|
||||
script_pubkey_justright = CScript([OP_0, witness_hash_justright])
|
||||
script_pubkey_justright = script_to_p2wsh_script(witness_program_justright)
|
||||
|
||||
# First split our available utxo into a bunch of outputs
|
||||
split_value = self.utxo[0].nValue // outputs
|
||||
|
@ -2148,8 +2120,7 @@ class SegWitTest(BitcoinTestFramework):
|
|||
# Create a Segwit output from the latest UTXO
|
||||
# and announce it to the network
|
||||
witness_program = CScript([OP_TRUE])
|
||||
witness_hash = sha256(witness_program)
|
||||
script_pubkey = CScript([OP_0, witness_hash])
|
||||
script_pubkey = script_to_p2wsh_script(witness_program)
|
||||
|
||||
tx = CTransaction()
|
||||
tx.vin.append(CTxIn(COutPoint(self.utxo[0].sha256, self.utxo[0].n), b""))
|
||||
|
|
|
@ -6,7 +6,6 @@
|
|||
|
||||
from test_framework.blocktools import COINBASE_MATURITY
|
||||
from test_framework.address import (
|
||||
check_script,
|
||||
script_to_p2sh,
|
||||
script_to_p2wsh,
|
||||
)
|
||||
|
@ -20,12 +19,10 @@ from test_framework.util import (
|
|||
)
|
||||
from test_framework.messages import (
|
||||
CTxInWitness,
|
||||
sha256,
|
||||
tx_from_hex,
|
||||
)
|
||||
from test_framework.script import (
|
||||
CScript,
|
||||
OP_0,
|
||||
OP_CHECKLOCKTIMEVERIFY,
|
||||
OP_CHECKSIG,
|
||||
OP_CHECKSEQUENCEVERIFY,
|
||||
|
@ -233,7 +230,7 @@ class SignRawTransactionsTest(BitcoinTestFramework):
|
|||
'P2PKH': key_to_p2pkh_script(embedded_pubkey).hex(),
|
||||
'P2PK': CScript([hex_str_to_bytes(embedded_pubkey), OP_CHECKSIG]).hex()
|
||||
}.get(tx_type, "Invalid tx_type")
|
||||
redeem_script = CScript([OP_0, sha256(check_script(witness_script))]).hex()
|
||||
redeem_script = script_to_p2wsh_script(witness_script).hex()
|
||||
addr = script_to_p2sh(redeem_script)
|
||||
script_pub_key = self.nodes[1].validateaddress(addr)['scriptPubKey']
|
||||
# Fund that address
|
||||
|
|
|
@ -26,7 +26,6 @@ from .messages import (
|
|||
hash256,
|
||||
hex_str_to_bytes,
|
||||
ser_uint256,
|
||||
sha256,
|
||||
tx_from_hex,
|
||||
uint256_from_str,
|
||||
)
|
||||
|
@ -34,13 +33,15 @@ from .script import (
|
|||
CScript,
|
||||
CScriptNum,
|
||||
CScriptOp,
|
||||
OP_0,
|
||||
OP_1,
|
||||
OP_CHECKMULTISIG,
|
||||
OP_CHECKSIG,
|
||||
OP_RETURN,
|
||||
OP_TRUE,
|
||||
hash160,
|
||||
)
|
||||
from .script_util import (
|
||||
key_to_p2wpkh_script,
|
||||
script_to_p2wsh_script,
|
||||
)
|
||||
from .util import assert_equal
|
||||
|
||||
|
@ -206,13 +207,11 @@ def witness_script(use_p2wsh, pubkey):
|
|||
scriptPubKey."""
|
||||
if not use_p2wsh:
|
||||
# P2WPKH instead
|
||||
pubkeyhash = hash160(hex_str_to_bytes(pubkey))
|
||||
pkscript = CScript([OP_0, pubkeyhash])
|
||||
pkscript = key_to_p2wpkh_script(pubkey)
|
||||
else:
|
||||
# 1-of-1 multisig
|
||||
witness_program = CScript([OP_1, hex_str_to_bytes(pubkey), OP_1, OP_CHECKMULTISIG])
|
||||
scripthash = sha256(witness_program)
|
||||
pkscript = CScript([OP_0, scripthash])
|
||||
pkscript = script_to_p2wsh_script(witness_program)
|
||||
return pkscript.hex()
|
||||
|
||||
def create_witness_tx(node, use_p2wsh, utxo, pubkey, encode_p2sh, amount):
|
||||
|
|
|
@ -17,17 +17,15 @@ from test_framework.address import (
|
|||
from test_framework.key import ECKey
|
||||
from test_framework.script import (
|
||||
CScript,
|
||||
OP_0,
|
||||
OP_2,
|
||||
OP_3,
|
||||
OP_CHECKMULTISIG,
|
||||
OP_CHECKSIG,
|
||||
OP_DUP,
|
||||
OP_EQUAL,
|
||||
OP_EQUALVERIFY,
|
||||
OP_HASH160,
|
||||
hash160,
|
||||
sha256,
|
||||
)
|
||||
from test_framework.script_util import (
|
||||
key_to_p2pkh_script,
|
||||
key_to_p2wpkh_script,
|
||||
script_to_p2sh_script,
|
||||
script_to_p2wsh_script,
|
||||
)
|
||||
from test_framework.util import hex_str_to_bytes
|
||||
|
||||
|
@ -57,15 +55,14 @@ def get_key(node):
|
|||
Returns a named tuple of privkey, pubkey and all address and scripts."""
|
||||
addr = node.getnewaddress()
|
||||
pubkey = node.getaddressinfo(addr)['pubkey']
|
||||
pkh = hash160(hex_str_to_bytes(pubkey))
|
||||
return Key(privkey=node.dumpprivkey(addr),
|
||||
pubkey=pubkey,
|
||||
p2pkh_script=CScript([OP_DUP, OP_HASH160, pkh, OP_EQUALVERIFY, OP_CHECKSIG]).hex(),
|
||||
p2pkh_script=key_to_p2pkh_script(pubkey).hex(),
|
||||
p2pkh_addr=key_to_p2pkh(pubkey),
|
||||
p2wpkh_script=CScript([OP_0, pkh]).hex(),
|
||||
p2wpkh_script=key_to_p2wpkh_script(pubkey).hex(),
|
||||
p2wpkh_addr=key_to_p2wpkh(pubkey),
|
||||
p2sh_p2wpkh_script=CScript([OP_HASH160, hash160(CScript([OP_0, pkh])), OP_EQUAL]).hex(),
|
||||
p2sh_p2wpkh_redeem_script=CScript([OP_0, pkh]).hex(),
|
||||
p2sh_p2wpkh_script=script_to_p2sh_script(key_to_p2wpkh_script(pubkey)).hex(),
|
||||
p2sh_p2wpkh_redeem_script=key_to_p2wpkh_script(pubkey).hex(),
|
||||
p2sh_p2wpkh_addr=key_to_p2sh_p2wpkh(pubkey))
|
||||
|
||||
def get_generate_key():
|
||||
|
@ -76,15 +73,14 @@ def get_generate_key():
|
|||
eckey.generate()
|
||||
privkey = bytes_to_wif(eckey.get_bytes())
|
||||
pubkey = eckey.get_pubkey().get_bytes().hex()
|
||||
pkh = hash160(hex_str_to_bytes(pubkey))
|
||||
return Key(privkey=privkey,
|
||||
pubkey=pubkey,
|
||||
p2pkh_script=CScript([OP_DUP, OP_HASH160, pkh, OP_EQUALVERIFY, OP_CHECKSIG]).hex(),
|
||||
p2pkh_script=key_to_p2pkh_script(pubkey).hex(),
|
||||
p2pkh_addr=key_to_p2pkh(pubkey),
|
||||
p2wpkh_script=CScript([OP_0, pkh]).hex(),
|
||||
p2wpkh_script=key_to_p2wpkh_script(pubkey).hex(),
|
||||
p2wpkh_addr=key_to_p2wpkh(pubkey),
|
||||
p2sh_p2wpkh_script=CScript([OP_HASH160, hash160(CScript([OP_0, pkh])), OP_EQUAL]).hex(),
|
||||
p2sh_p2wpkh_redeem_script=CScript([OP_0, pkh]).hex(),
|
||||
p2sh_p2wpkh_script=script_to_p2sh_script(key_to_p2wpkh_script(pubkey)).hex(),
|
||||
p2sh_p2wpkh_redeem_script=key_to_p2wpkh_script(pubkey).hex(),
|
||||
p2sh_p2wpkh_addr=key_to_p2sh_p2wpkh(pubkey))
|
||||
|
||||
def get_multisig(node):
|
||||
|
@ -98,15 +94,15 @@ def get_multisig(node):
|
|||
addrs.append(addr['address'])
|
||||
pubkeys.append(addr['pubkey'])
|
||||
script_code = CScript([OP_2] + [hex_str_to_bytes(pubkey) for pubkey in pubkeys] + [OP_3, OP_CHECKMULTISIG])
|
||||
witness_script = CScript([OP_0, sha256(script_code)])
|
||||
witness_script = script_to_p2wsh_script(script_code)
|
||||
return Multisig(privkeys=[node.dumpprivkey(addr) for addr in addrs],
|
||||
pubkeys=pubkeys,
|
||||
p2sh_script=CScript([OP_HASH160, hash160(script_code), OP_EQUAL]).hex(),
|
||||
p2sh_script=script_to_p2sh_script(script_code).hex(),
|
||||
p2sh_addr=script_to_p2sh(script_code),
|
||||
redeem_script=script_code.hex(),
|
||||
p2wsh_script=witness_script.hex(),
|
||||
p2wsh_addr=script_to_p2wsh(script_code),
|
||||
p2sh_p2wsh_script=CScript([OP_HASH160, witness_script, OP_EQUAL]).hex(),
|
||||
p2sh_p2wsh_script=script_to_p2sh_script(witness_script).hex(),
|
||||
p2sh_p2wsh_addr=script_to_p2sh_p2wsh(script_code))
|
||||
|
||||
def test_address(node, address, **kwargs):
|
||||
|
|
Loading…
Add table
Reference in a new issue