mirror of
https://github.com/dashpay/dash.git
synced 2024-12-27 04:52:59 +01:00
test segwit uncompressed key fixes
This commit is contained in:
parent
248f3a76a8
commit
9260085377
@ -9,7 +9,10 @@
|
|||||||
|
|
||||||
from test_framework.test_framework import BitcoinTestFramework
|
from test_framework.test_framework import BitcoinTestFramework
|
||||||
from test_framework.util import *
|
from test_framework.util import *
|
||||||
from test_framework.mininode import sha256, ripemd160
|
from test_framework.mininode import sha256, ripemd160, CTransaction, CTxIn, COutPoint, CTxOut
|
||||||
|
from test_framework.address import script_to_p2sh, key_to_p2pkh
|
||||||
|
from test_framework.script import CScript, OP_HASH160, OP_CHECKSIG, OP_0, hash160, OP_EQUAL, OP_DUP, OP_EQUALVERIFY, OP_1, OP_2, OP_CHECKMULTISIG
|
||||||
|
from io import BytesIO
|
||||||
|
|
||||||
NODE_0 = 0
|
NODE_0 = 0
|
||||||
NODE_1 = 1
|
NODE_1 = 1
|
||||||
@ -242,5 +245,360 @@ class SegWitTest(BitcoinTestFramework):
|
|||||||
# This is an acceptable outcome
|
# This is an acceptable outcome
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
print("Verify behaviour of importaddress, addwitnessaddress and listunspent")
|
||||||
|
|
||||||
|
# Some public keys to be used later
|
||||||
|
pubkeys = [
|
||||||
|
"0363D44AABD0F1699138239DF2F042C3282C0671CC7A76826A55C8203D90E39242", # cPiM8Ub4heR9NBYmgVzJQiUH1if44GSBGiqaeJySuL2BKxubvgwb
|
||||||
|
"02D3E626B3E616FC8662B489C123349FECBFC611E778E5BE739B257EAE4721E5BF", # cPpAdHaD6VoYbW78kveN2bsvb45Q7G5PhaPApVUGwvF8VQ9brD97
|
||||||
|
"04A47F2CBCEFFA7B9BCDA184E7D5668D3DA6F9079AD41E422FA5FD7B2D458F2538A62F5BD8EC85C2477F39650BD391EA6250207065B2A81DA8B009FC891E898F0E", # 91zqCU5B9sdWxzMt1ca3VzbtVm2YM6Hi5Rxn4UDtxEaN9C9nzXV
|
||||||
|
"02A47F2CBCEFFA7B9BCDA184E7D5668D3DA6F9079AD41E422FA5FD7B2D458F2538", # cPQFjcVRpAUBG8BA9hzr2yEzHwKoMgLkJZBBtK9vJnvGJgMjzTbd
|
||||||
|
"036722F784214129FEB9E8129D626324F3F6716555B603FFE8300BBCB882151228", # cQGtcm34xiLjB1v7bkRa4V3aAc9tS2UTuBZ1UnZGeSeNy627fN66
|
||||||
|
"0266A8396EE936BF6D99D17920DB21C6C7B1AB14C639D5CD72B300297E416FD2EC", # cTW5mR5M45vHxXkeChZdtSPozrFwFgmEvTNnanCW6wrqwaCZ1X7K
|
||||||
|
"0450A38BD7F0AC212FEBA77354A9B036A32E0F7C81FC4E0C5ADCA7C549C4505D2522458C2D9AE3CEFD684E039194B72C8A10F9CB9D4764AB26FCC2718D421D3B84", # 92h2XPssjBpsJN5CqSP7v9a7cf2kgDunBC6PDFwJHMACM1rrVBJ
|
||||||
|
]
|
||||||
|
|
||||||
|
# Import a compressed key and an uncompressed key, generate some multisig addresses
|
||||||
|
self.nodes[0].importprivkey("92e6XLo5jVAVwrQKPNTs93oQco8f8sDNBcpv73Dsrs397fQtFQn")
|
||||||
|
uncompressed_spendable_address = ["mvozP4UwyGD2mGZU4D2eMvMLPB9WkMmMQu"]
|
||||||
|
self.nodes[0].importprivkey("cNC8eQ5dg3mFAVePDX4ddmPYpPbw41r9bm2jd1nLJT77e6RrzTRR")
|
||||||
|
compressed_spendable_address = ["mmWQubrDomqpgSYekvsU7HWEVjLFHAakLe"]
|
||||||
|
assert ((self.nodes[0].validateaddress(uncompressed_spendable_address[0])['iscompressed'] == False))
|
||||||
|
assert ((self.nodes[0].validateaddress(compressed_spendable_address[0])['iscompressed'] == True))
|
||||||
|
|
||||||
|
self.nodes[0].importpubkey(pubkeys[0])
|
||||||
|
compressed_solvable_address = [key_to_p2pkh(pubkeys[0])]
|
||||||
|
self.nodes[0].importpubkey(pubkeys[1])
|
||||||
|
compressed_solvable_address.append(key_to_p2pkh(pubkeys[1]))
|
||||||
|
self.nodes[0].importpubkey(pubkeys[2])
|
||||||
|
uncompressed_solvable_address = [key_to_p2pkh(pubkeys[2])]
|
||||||
|
|
||||||
|
spendable_anytime = [] # These outputs should be seen anytime after importprivkey and addmultisigaddress
|
||||||
|
spendable_after_importaddress = [] # These outputs should be seen after importaddress
|
||||||
|
solvable_after_importaddress = [] # These outputs should be seen after importaddress but not spendable
|
||||||
|
unsolvable_after_importaddress = [] # These outputs should be unsolvable after importaddress
|
||||||
|
solvable_anytime = [] # These outputs should be solvable after importpubkey
|
||||||
|
unseen_anytime = [] # These outputs should never be seen
|
||||||
|
|
||||||
|
uncompressed_spendable_address.append(self.nodes[0].addmultisigaddress(2, [uncompressed_spendable_address[0], compressed_spendable_address[0]]))
|
||||||
|
uncompressed_spendable_address.append(self.nodes[0].addmultisigaddress(2, [uncompressed_spendable_address[0], uncompressed_spendable_address[0]]))
|
||||||
|
compressed_spendable_address.append(self.nodes[0].addmultisigaddress(2, [compressed_spendable_address[0], compressed_spendable_address[0]]))
|
||||||
|
uncompressed_solvable_address.append(self.nodes[0].addmultisigaddress(2, [compressed_spendable_address[0], uncompressed_solvable_address[0]]))
|
||||||
|
compressed_solvable_address.append(self.nodes[0].addmultisigaddress(2, [compressed_spendable_address[0], compressed_solvable_address[0]]))
|
||||||
|
compressed_solvable_address.append(self.nodes[0].addmultisigaddress(2, [compressed_solvable_address[0], compressed_solvable_address[1]]))
|
||||||
|
unknown_address = ["mtKKyoHabkk6e4ppT7NaM7THqPUt7AzPrT", "2NDP3jLWAFT8NDAiUa9qiE6oBt2awmMq7Dx"]
|
||||||
|
|
||||||
|
# Test multisig_without_privkey
|
||||||
|
# We have 2 public keys without private keys, use addmultisigaddress to add to wallet.
|
||||||
|
# Money sent to P2SH of multisig of this should only be seen after importaddress with the BASE58 P2SH address.
|
||||||
|
|
||||||
|
multisig_without_privkey_address = self.nodes[0].addmultisigaddress(2, [pubkeys[3], pubkeys[4]])
|
||||||
|
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]))
|
||||||
|
|
||||||
|
for i in compressed_spendable_address:
|
||||||
|
v = self.nodes[0].validateaddress(i)
|
||||||
|
if (v['isscript']):
|
||||||
|
[bare, p2sh, p2wsh, p2sh_p2wsh] = self.p2sh_address_to_script(v)
|
||||||
|
# bare and p2sh multisig with compressed keys should always be spendable
|
||||||
|
spendable_anytime.extend([bare, p2sh])
|
||||||
|
# P2WSH and P2SH(P2WSH) multisig with compressed keys are spendable after direct importaddress
|
||||||
|
spendable_after_importaddress.extend([p2wsh, p2sh_p2wsh])
|
||||||
|
else:
|
||||||
|
[p2wpkh, p2sh_p2wpkh, p2pk, p2pkh, p2sh_p2pk, p2sh_p2pkh, p2wsh_p2pk, p2wsh_p2pkh, p2sh_p2wsh_p2pk, p2sh_p2wsh_p2pkh] = self.p2pkh_address_to_script(v)
|
||||||
|
# normal P2PKH and P2PK with compressed keys should always be spendable
|
||||||
|
spendable_anytime.extend([p2pkh, p2pk])
|
||||||
|
# P2SH_P2PK, P2SH_P2PKH, and witness with compressed keys are spendable after direct importaddress
|
||||||
|
spendable_after_importaddress.extend([p2wpkh, p2sh_p2wpkh, p2sh_p2pk, p2sh_p2pkh, p2wsh_p2pk, p2wsh_p2pkh, p2sh_p2wsh_p2pk, p2sh_p2wsh_p2pkh])
|
||||||
|
|
||||||
|
for i in uncompressed_spendable_address:
|
||||||
|
v = self.nodes[0].validateaddress(i)
|
||||||
|
if (v['isscript']):
|
||||||
|
[bare, p2sh, p2wsh, p2sh_p2wsh] = self.p2sh_address_to_script(v)
|
||||||
|
# bare and p2sh multisig with uncompressed keys should always be spendable
|
||||||
|
spendable_anytime.extend([bare, p2sh])
|
||||||
|
# P2WSH and P2SH(P2WSH) multisig with uncompressed keys are never seen
|
||||||
|
unseen_anytime.extend([p2wsh, p2sh_p2wsh])
|
||||||
|
else:
|
||||||
|
[p2wpkh, p2sh_p2wpkh, p2pk, p2pkh, p2sh_p2pk, p2sh_p2pkh, p2wsh_p2pk, p2wsh_p2pkh, p2sh_p2wsh_p2pk, p2sh_p2wsh_p2pkh] = self.p2pkh_address_to_script(v)
|
||||||
|
# normal P2PKH and P2PK with uncompressed keys should always be spendable
|
||||||
|
spendable_anytime.extend([p2pkh, p2pk])
|
||||||
|
# P2SH_P2PK and P2SH_P2PKH are spendable after direct importaddress
|
||||||
|
spendable_after_importaddress.extend([p2sh_p2pk, p2sh_p2pkh])
|
||||||
|
# witness with uncompressed keys are never seen
|
||||||
|
unseen_anytime.extend([p2wpkh, p2sh_p2wpkh, p2wsh_p2pk, p2wsh_p2pkh, p2sh_p2wsh_p2pk, p2sh_p2wsh_p2pkh])
|
||||||
|
|
||||||
|
for i in compressed_solvable_address:
|
||||||
|
v = self.nodes[0].validateaddress(i)
|
||||||
|
if (v['isscript']):
|
||||||
|
# Multisig without private is not seen after addmultisigaddress, but seen after importaddress
|
||||||
|
[bare, p2sh, p2wsh, p2sh_p2wsh] = self.p2sh_address_to_script(v)
|
||||||
|
solvable_after_importaddress.extend([bare, p2sh, p2wsh, p2sh_p2wsh])
|
||||||
|
else:
|
||||||
|
[p2wpkh, p2sh_p2wpkh, p2pk, p2pkh, p2sh_p2pk, p2sh_p2pkh, p2wsh_p2pk, p2wsh_p2pkh, p2sh_p2wsh_p2pk, p2sh_p2wsh_p2pkh] = self.p2pkh_address_to_script(v)
|
||||||
|
# normal P2PKH and P2PK with compressed keys should always be seen
|
||||||
|
solvable_anytime.extend([p2pkh, p2pk])
|
||||||
|
# P2SH_P2PK, P2SH_P2PKH, and witness with compressed keys are seen after direct importaddress
|
||||||
|
solvable_after_importaddress.extend([p2wpkh, p2sh_p2wpkh, p2sh_p2pk, p2sh_p2pkh, p2wsh_p2pk, p2wsh_p2pkh, p2sh_p2wsh_p2pk, p2sh_p2wsh_p2pkh])
|
||||||
|
|
||||||
|
for i in uncompressed_solvable_address:
|
||||||
|
v = self.nodes[0].validateaddress(i)
|
||||||
|
if (v['isscript']):
|
||||||
|
[bare, p2sh, p2wsh, p2sh_p2wsh] = self.p2sh_address_to_script(v)
|
||||||
|
# Base uncompressed multisig without private is not seen after addmultisigaddress, but seen after importaddress
|
||||||
|
solvable_after_importaddress.extend([bare, p2sh])
|
||||||
|
# P2WSH and P2SH(P2WSH) multisig with uncompressed keys are never seen
|
||||||
|
unseen_anytime.extend([p2wsh, p2sh_p2wsh])
|
||||||
|
else:
|
||||||
|
[p2wpkh, p2sh_p2wpkh, p2pk, p2pkh, p2sh_p2pk, p2sh_p2pkh, p2wsh_p2pk, p2wsh_p2pkh, p2sh_p2wsh_p2pk, p2sh_p2wsh_p2pkh] = self.p2pkh_address_to_script(v)
|
||||||
|
# normal P2PKH and P2PK with uncompressed keys should always be seen
|
||||||
|
solvable_anytime.extend([p2pkh, p2pk])
|
||||||
|
# P2SH_P2PK, P2SH_P2PKH with uncompressed keys are seen after direct importaddress
|
||||||
|
solvable_after_importaddress.extend([p2sh_p2pk, p2sh_p2pkh])
|
||||||
|
# witness with uncompressed keys are never seen
|
||||||
|
unseen_anytime.extend([p2wpkh, p2sh_p2wpkh, p2wsh_p2pk, p2wsh_p2pkh, p2sh_p2wsh_p2pk, p2sh_p2wsh_p2pkh])
|
||||||
|
|
||||||
|
op1 = CScript([OP_1])
|
||||||
|
op0 = CScript([OP_0])
|
||||||
|
# 2N7MGY19ti4KDMSzRfPAssP6Pxyuxoi6jLe is the P2SH(P2PKH) version of mjoE3sSrb8ByYEvgnC3Aox86u1CHnfJA4V
|
||||||
|
unsolvable_address = ["mjoE3sSrb8ByYEvgnC3Aox86u1CHnfJA4V", "2N7MGY19ti4KDMSzRfPAssP6Pxyuxoi6jLe", script_to_p2sh(op1), script_to_p2sh(op0)]
|
||||||
|
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)])
|
||||||
|
unsolvable_after_importaddress.append(unsolvablep2pkh)
|
||||||
|
unsolvable_after_importaddress.append(unsolvablep2wshp2pkh)
|
||||||
|
unsolvable_after_importaddress.append(op1) # OP_1 will be imported as script
|
||||||
|
unsolvable_after_importaddress.append(p2wshop1)
|
||||||
|
unseen_anytime.append(op0) # OP_0 will be imported as P2SH address with no script provided
|
||||||
|
unsolvable_after_importaddress.append(p2shop0)
|
||||||
|
|
||||||
|
spendable_txid = []
|
||||||
|
solvable_txid = []
|
||||||
|
spendable_txid.append(self.mine_and_test_listunspent(spendable_anytime, 2))
|
||||||
|
solvable_txid.append(self.mine_and_test_listunspent(solvable_anytime, 1))
|
||||||
|
self.mine_and_test_listunspent(spendable_after_importaddress + solvable_after_importaddress + unseen_anytime + unsolvable_after_importaddress, 0)
|
||||||
|
|
||||||
|
importlist = []
|
||||||
|
for i in compressed_spendable_address + uncompressed_spendable_address + compressed_solvable_address + uncompressed_solvable_address:
|
||||||
|
v = self.nodes[0].validateaddress(i)
|
||||||
|
if (v['isscript']):
|
||||||
|
bare = hex_str_to_bytes(v['hex'])
|
||||||
|
importlist.append(bytes_to_hex_str(bare))
|
||||||
|
importlist.append(bytes_to_hex_str(CScript([OP_0, sha256(bare)])))
|
||||||
|
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])
|
||||||
|
importlist.append(bytes_to_hex_str(p2pk))
|
||||||
|
importlist.append(bytes_to_hex_str(p2pkh))
|
||||||
|
importlist.append(bytes_to_hex_str(CScript([OP_0, hash160(pubkey)])))
|
||||||
|
importlist.append(bytes_to_hex_str(CScript([OP_0, sha256(p2pk)])))
|
||||||
|
importlist.append(bytes_to_hex_str(CScript([OP_0, sha256(p2pkh)])))
|
||||||
|
|
||||||
|
importlist.append(bytes_to_hex_str(unsolvablep2pkh))
|
||||||
|
importlist.append(bytes_to_hex_str(unsolvablep2wshp2pkh))
|
||||||
|
importlist.append(bytes_to_hex_str(op1))
|
||||||
|
importlist.append(bytes_to_hex_str(p2wshop1))
|
||||||
|
|
||||||
|
for i in importlist:
|
||||||
|
try:
|
||||||
|
self.nodes[0].importaddress(i,"",False,True)
|
||||||
|
except JSONRPCException as exp:
|
||||||
|
assert_equal(exp.error["message"], "The wallet already contains the private key for this address or script")
|
||||||
|
|
||||||
|
self.nodes[0].importaddress(script_to_p2sh(op0)) # import OP_0 as address only
|
||||||
|
self.nodes[0].importaddress(multisig_without_privkey_address) # Test multisig_without_privkey
|
||||||
|
|
||||||
|
spendable_txid.append(self.mine_and_test_listunspent(spendable_anytime + spendable_after_importaddress, 2))
|
||||||
|
solvable_txid.append(self.mine_and_test_listunspent(solvable_anytime + solvable_after_importaddress, 1))
|
||||||
|
self.mine_and_test_listunspent(unsolvable_after_importaddress, 1)
|
||||||
|
self.mine_and_test_listunspent(unseen_anytime, 0)
|
||||||
|
|
||||||
|
# addwitnessaddress should refuse to return a witness address if an uncompressed key is used or the address is
|
||||||
|
# not in the wallet
|
||||||
|
# note that no witness address should be returned by unsolvable addresses
|
||||||
|
# the multisig_without_privkey_address will fail because its keys were not added with importpubkey
|
||||||
|
for i in uncompressed_spendable_address + uncompressed_solvable_address + unknown_address + unsolvable_address + [multisig_without_privkey_address]:
|
||||||
|
try:
|
||||||
|
self.nodes[0].addwitnessaddress(i)
|
||||||
|
except JSONRPCException as exp:
|
||||||
|
assert_equal(exp.error["message"], "Public key or redeemscript not known to wallet, or the key is uncompressed")
|
||||||
|
else:
|
||||||
|
assert(False)
|
||||||
|
|
||||||
|
for i in compressed_spendable_address + compressed_solvable_address:
|
||||||
|
witaddress = self.nodes[0].addwitnessaddress(i)
|
||||||
|
# addwitnessaddress should return the same address if it is a known P2SH-witness address
|
||||||
|
assert_equal(witaddress, self.nodes[0].addwitnessaddress(witaddress))
|
||||||
|
|
||||||
|
spendable_txid.append(self.mine_and_test_listunspent(spendable_anytime + spendable_after_importaddress, 2))
|
||||||
|
solvable_txid.append(self.mine_and_test_listunspent(solvable_anytime + solvable_after_importaddress, 1))
|
||||||
|
self.mine_and_test_listunspent(unsolvable_after_importaddress, 1)
|
||||||
|
self.mine_and_test_listunspent(unseen_anytime, 0)
|
||||||
|
|
||||||
|
# Repeat some tests. This time we don't add witness scripts with importaddress
|
||||||
|
# Import a compressed key and an uncompressed key, generate some multisig addresses
|
||||||
|
self.nodes[0].importprivkey("927pw6RW8ZekycnXqBQ2JS5nPyo1yRfGNN8oq74HeddWSpafDJH")
|
||||||
|
uncompressed_spendable_address = ["mguN2vNSCEUh6rJaXoAVwY3YZwZvEmf5xi"]
|
||||||
|
self.nodes[0].importprivkey("cMcrXaaUC48ZKpcyydfFo8PxHAjpsYLhdsp6nmtB3E2ER9UUHWnw")
|
||||||
|
compressed_spendable_address = ["n1UNmpmbVUJ9ytXYXiurmGPQ3TRrXqPWKL"]
|
||||||
|
|
||||||
|
self.nodes[0].importpubkey(pubkeys[5])
|
||||||
|
compressed_solvable_address = [key_to_p2pkh(pubkeys[5])]
|
||||||
|
self.nodes[0].importpubkey(pubkeys[6])
|
||||||
|
uncompressed_solvable_address = [key_to_p2pkh(pubkeys[6])]
|
||||||
|
|
||||||
|
spendable_after_addwitnessaddress = [] # These outputs should be seen after importaddress
|
||||||
|
solvable_after_addwitnessaddress=[] # These outputs should be seen after importaddress but not spendable
|
||||||
|
unseen_anytime = [] # These outputs should never be seen
|
||||||
|
|
||||||
|
uncompressed_spendable_address.append(self.nodes[0].addmultisigaddress(2, [uncompressed_spendable_address[0], compressed_spendable_address[0]]))
|
||||||
|
uncompressed_spendable_address.append(self.nodes[0].addmultisigaddress(2, [uncompressed_spendable_address[0], uncompressed_spendable_address[0]]))
|
||||||
|
compressed_spendable_address.append(self.nodes[0].addmultisigaddress(2, [compressed_spendable_address[0], compressed_spendable_address[0]]))
|
||||||
|
uncompressed_solvable_address.append(self.nodes[0].addmultisigaddress(2, [compressed_solvable_address[0], uncompressed_solvable_address[0]]))
|
||||||
|
compressed_solvable_address.append(self.nodes[0].addmultisigaddress(2, [compressed_spendable_address[0], compressed_solvable_address[0]]))
|
||||||
|
|
||||||
|
premature_witaddress = []
|
||||||
|
|
||||||
|
for i in compressed_spendable_address:
|
||||||
|
v = self.nodes[0].validateaddress(i)
|
||||||
|
if (v['isscript']):
|
||||||
|
[bare, p2sh, p2wsh, p2sh_p2wsh] = self.p2sh_address_to_script(v)
|
||||||
|
# P2WSH and P2SH(P2WSH) multisig with compressed keys are spendable after addwitnessaddress
|
||||||
|
spendable_after_addwitnessaddress.extend([p2wsh, p2sh_p2wsh])
|
||||||
|
premature_witaddress.append(script_to_p2sh(p2wsh))
|
||||||
|
else:
|
||||||
|
[p2wpkh, p2sh_p2wpkh, p2pk, p2pkh, p2sh_p2pk, p2sh_p2pkh, p2wsh_p2pk, p2wsh_p2pkh, p2sh_p2wsh_p2pk, p2sh_p2wsh_p2pkh] = self.p2pkh_address_to_script(v)
|
||||||
|
# P2WPKH, P2SH_P2WPKH are spendable after addwitnessaddress
|
||||||
|
spendable_after_addwitnessaddress.extend([p2wpkh, p2sh_p2wpkh])
|
||||||
|
premature_witaddress.append(script_to_p2sh(p2wpkh))
|
||||||
|
|
||||||
|
for i in uncompressed_spendable_address + uncompressed_solvable_address:
|
||||||
|
v = self.nodes[0].validateaddress(i)
|
||||||
|
if (v['isscript']):
|
||||||
|
[bare, p2sh, p2wsh, p2sh_p2wsh] = self.p2sh_address_to_script(v)
|
||||||
|
# P2WSH and P2SH(P2WSH) multisig with uncompressed keys are never seen
|
||||||
|
unseen_anytime.extend([p2wsh, p2sh_p2wsh])
|
||||||
|
else:
|
||||||
|
[p2wpkh, p2sh_p2wpkh, p2pk, p2pkh, p2sh_p2pk, p2sh_p2pkh, p2wsh_p2pk, p2wsh_p2pkh, p2sh_p2wsh_p2pk, p2sh_p2wsh_p2pkh] = self.p2pkh_address_to_script(v)
|
||||||
|
# P2WPKH, P2SH_P2WPKH with uncompressed keys are never seen
|
||||||
|
unseen_anytime.extend([p2wpkh, p2sh_p2wpkh])
|
||||||
|
|
||||||
|
for i in compressed_solvable_address:
|
||||||
|
v = self.nodes[0].validateaddress(i)
|
||||||
|
if (v['isscript']):
|
||||||
|
# P2WSH multisig without private key are seen after addwitnessaddress
|
||||||
|
[bare, p2sh, p2wsh, p2sh_p2wsh] = self.p2sh_address_to_script(v)
|
||||||
|
solvable_after_addwitnessaddress.extend([p2wsh, p2sh_p2wsh])
|
||||||
|
premature_witaddress.append(script_to_p2sh(p2wsh))
|
||||||
|
else:
|
||||||
|
[p2wpkh, p2sh_p2wpkh, p2pk, p2pkh, p2sh_p2pk, p2sh_p2pkh, p2wsh_p2pk, p2wsh_p2pkh, p2sh_p2wsh_p2pk, p2sh_p2wsh_p2pkh] = self.p2pkh_address_to_script(v)
|
||||||
|
# P2SH_P2PK, P2SH_P2PKH with compressed keys are seen after addwitnessaddress
|
||||||
|
solvable_after_addwitnessaddress.extend([p2wpkh, p2sh_p2wpkh])
|
||||||
|
premature_witaddress.append(script_to_p2sh(p2wpkh))
|
||||||
|
|
||||||
|
self.mine_and_test_listunspent(spendable_after_addwitnessaddress + solvable_after_addwitnessaddress + unseen_anytime, 0)
|
||||||
|
|
||||||
|
# addwitnessaddress should refuse to return a witness address if an uncompressed key is used
|
||||||
|
# note that a multisig address returned by addmultisigaddress is not solvable until it is added with importaddress
|
||||||
|
# premature_witaddress are not accepted until the script is added with addwitnessaddress first
|
||||||
|
for i in uncompressed_spendable_address + uncompressed_solvable_address + premature_witaddress + [compressed_solvable_address[1]]:
|
||||||
|
try:
|
||||||
|
self.nodes[0].addwitnessaddress(i)
|
||||||
|
except JSONRPCException as exp:
|
||||||
|
assert_equal(exp.error["message"], "Public key or redeemscript not known to wallet, or the key is uncompressed")
|
||||||
|
else:
|
||||||
|
assert(False)
|
||||||
|
|
||||||
|
# after importaddress it should pass addwitnessaddress
|
||||||
|
v = self.nodes[0].validateaddress(compressed_solvable_address[1])
|
||||||
|
self.nodes[0].importaddress(v['hex'],"",False,True)
|
||||||
|
for i in compressed_spendable_address + compressed_solvable_address + premature_witaddress:
|
||||||
|
witaddress = self.nodes[0].addwitnessaddress(i)
|
||||||
|
assert_equal(witaddress, self.nodes[0].addwitnessaddress(witaddress))
|
||||||
|
|
||||||
|
spendable_txid.append(self.mine_and_test_listunspent(spendable_after_addwitnessaddress, 2))
|
||||||
|
solvable_txid.append(self.mine_and_test_listunspent(solvable_after_addwitnessaddress, 1))
|
||||||
|
self.mine_and_test_listunspent(unseen_anytime, 0)
|
||||||
|
|
||||||
|
# Check that spendable outputs are really spendable
|
||||||
|
self.create_and_mine_tx_from_txids(spendable_txid)
|
||||||
|
|
||||||
|
# import all the private keys so solvable addresses become spendable
|
||||||
|
self.nodes[0].importprivkey("cPiM8Ub4heR9NBYmgVzJQiUH1if44GSBGiqaeJySuL2BKxubvgwb")
|
||||||
|
self.nodes[0].importprivkey("cPpAdHaD6VoYbW78kveN2bsvb45Q7G5PhaPApVUGwvF8VQ9brD97")
|
||||||
|
self.nodes[0].importprivkey("91zqCU5B9sdWxzMt1ca3VzbtVm2YM6Hi5Rxn4UDtxEaN9C9nzXV")
|
||||||
|
self.nodes[0].importprivkey("cPQFjcVRpAUBG8BA9hzr2yEzHwKoMgLkJZBBtK9vJnvGJgMjzTbd")
|
||||||
|
self.nodes[0].importprivkey("cQGtcm34xiLjB1v7bkRa4V3aAc9tS2UTuBZ1UnZGeSeNy627fN66")
|
||||||
|
self.nodes[0].importprivkey("cTW5mR5M45vHxXkeChZdtSPozrFwFgmEvTNnanCW6wrqwaCZ1X7K")
|
||||||
|
self.create_and_mine_tx_from_txids(solvable_txid)
|
||||||
|
|
||||||
|
def mine_and_test_listunspent(self, script_list, ismine):
|
||||||
|
utxo = find_unspent(self.nodes[0], 50)
|
||||||
|
tx = CTransaction()
|
||||||
|
tx.vin.append(CTxIn(COutPoint(int('0x'+utxo['txid'],0), utxo['vout'])))
|
||||||
|
for i in script_list:
|
||||||
|
tx.vout.append(CTxOut(10000000, i))
|
||||||
|
tx.rehash()
|
||||||
|
signresults = self.nodes[0].signrawtransaction(bytes_to_hex_str(tx.serialize_without_witness()))['hex']
|
||||||
|
txid = self.nodes[0].sendrawtransaction(signresults, True)
|
||||||
|
self.nodes[0].generate(1)
|
||||||
|
sync_blocks(self.nodes)
|
||||||
|
watchcount = 0
|
||||||
|
spendcount = 0
|
||||||
|
for i in self.nodes[0].listunspent():
|
||||||
|
if (i['txid'] == txid):
|
||||||
|
watchcount += 1
|
||||||
|
if (i['spendable'] == True):
|
||||||
|
spendcount += 1
|
||||||
|
if (ismine == 2):
|
||||||
|
assert_equal(spendcount, len(script_list))
|
||||||
|
elif (ismine == 1):
|
||||||
|
assert_equal(watchcount, len(script_list))
|
||||||
|
assert_equal(spendcount, 0)
|
||||||
|
else:
|
||||||
|
assert_equal(watchcount, 0)
|
||||||
|
return txid
|
||||||
|
|
||||||
|
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])
|
||||||
|
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])
|
||||||
|
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])
|
||||||
|
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):
|
||||||
|
tx = CTransaction()
|
||||||
|
for i in txids:
|
||||||
|
txtmp = CTransaction()
|
||||||
|
txraw = self.nodes[0].getrawtransaction(i)
|
||||||
|
f = BytesIO(hex_str_to_bytes(txraw))
|
||||||
|
txtmp.deserialize(f)
|
||||||
|
for j in range(len(txtmp.vout)):
|
||||||
|
tx.vin.append(CTxIn(COutPoint(int('0x'+i,0), j)))
|
||||||
|
tx.vout.append(CTxOut(0, CScript()))
|
||||||
|
tx.rehash()
|
||||||
|
signresults = self.nodes[0].signrawtransaction(bytes_to_hex_str(tx.serialize_without_witness()))['hex']
|
||||||
|
self.nodes[0].sendrawtransaction(signresults, True)
|
||||||
|
self.nodes[0].generate(1)
|
||||||
|
sync_blocks(self.nodes)
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
SegWitTest().main()
|
SegWitTest().main()
|
||||||
|
74
qa/rpc-tests/test_framework/address.py
Normal file
74
qa/rpc-tests/test_framework/address.py
Normal file
@ -0,0 +1,74 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
# Copyright (c) 2016 The Bitcoin Core developers
|
||||||
|
# Distributed under the MIT software license, see the accompanying
|
||||||
|
# file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
||||||
|
|
||||||
|
#
|
||||||
|
# address.py
|
||||||
|
#
|
||||||
|
# This file encodes and decodes BASE58 P2PKH and P2SH addresses
|
||||||
|
#
|
||||||
|
|
||||||
|
from .script import hash256, hash160, sha256, CScript, OP_0
|
||||||
|
from .util import bytes_to_hex_str, hex_str_to_bytes
|
||||||
|
|
||||||
|
chars = '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz'
|
||||||
|
|
||||||
|
def byte_to_base58(b, version):
|
||||||
|
result = ''
|
||||||
|
str = bytes_to_hex_str(b)
|
||||||
|
str = bytes_to_hex_str(chr(version).encode('latin-1')) + str
|
||||||
|
checksum = bytes_to_hex_str(hash256(hex_str_to_bytes(str)))
|
||||||
|
str += checksum[:8]
|
||||||
|
value = int('0x'+str,0)
|
||||||
|
while value > 0:
|
||||||
|
result = chars[value % 58] + result
|
||||||
|
value //= 58
|
||||||
|
while (str[:2] == '00'):
|
||||||
|
result = chars[0] + result
|
||||||
|
str = str[2:]
|
||||||
|
return result
|
||||||
|
|
||||||
|
# TODO: def base58_decode
|
||||||
|
|
||||||
|
def keyhash_to_p2pkh(hash, main = False):
|
||||||
|
assert (len(hash) == 20)
|
||||||
|
version = 0 if main else 111
|
||||||
|
return byte_to_base58(hash, version)
|
||||||
|
|
||||||
|
def scripthash_to_p2sh(hash, main = False):
|
||||||
|
assert (len(hash) == 20)
|
||||||
|
version = 5 if main else 196
|
||||||
|
return byte_to_base58(hash, version)
|
||||||
|
|
||||||
|
def key_to_p2pkh(key, main = False):
|
||||||
|
key = check_key(key)
|
||||||
|
return keyhash_to_p2pkh(hash160(key), main)
|
||||||
|
|
||||||
|
def script_to_p2sh(script, main = False):
|
||||||
|
script = check_script(script)
|
||||||
|
return scripthash_to_p2sh(hash160(script), main)
|
||||||
|
|
||||||
|
def key_to_p2sh_p2wpkh(key, main = False):
|
||||||
|
key = check_key(key)
|
||||||
|
p2shscript = CScript([OP_0, hash160(key)])
|
||||||
|
return script_to_p2sh(p2shscript, main)
|
||||||
|
|
||||||
|
def script_to_p2sh_p2wsh(script, main = False):
|
||||||
|
script = check_script(script)
|
||||||
|
p2shscript = CScript([OP_0, sha256(script)])
|
||||||
|
return script_to_p2sh(p2shscript, main)
|
||||||
|
|
||||||
|
def check_key(key):
|
||||||
|
if (type(key) is str):
|
||||||
|
key = hex_str_to_bytes(key) # Assuming this is hex string
|
||||||
|
if (type(key) is bytes and (len(key) == 33 or len(key) == 65)):
|
||||||
|
return key
|
||||||
|
assert(False)
|
||||||
|
|
||||||
|
def check_script(script):
|
||||||
|
if (type(script) is str):
|
||||||
|
script = hex_str_to_bytes(script) # Assuming this is hex string
|
||||||
|
if (type(script) is bytes or type(script) is CScript):
|
||||||
|
return script
|
||||||
|
assert(False)
|
@ -1855,6 +1855,8 @@
|
|||||||
"OK",
|
"OK",
|
||||||
"P2SH with CLEANSTACK"
|
"P2SH with CLEANSTACK"
|
||||||
],
|
],
|
||||||
|
|
||||||
|
["Testing with uncompressed keys in witness v0 without WITNESS_PUBKEYTYPE"],
|
||||||
[
|
[
|
||||||
[
|
[
|
||||||
"304402200d461c140cfdfcf36b94961db57ae8c18d1cb80e9d95a9e47ac22470c1bf125502201c8dc1cbfef6a3ef90acbbb992ca22fe9466ee6f9d4898eda277a7ac3ab4b25101",
|
"304402200d461c140cfdfcf36b94961db57ae8c18d1cb80e9d95a9e47ac22470c1bf125502201c8dc1cbfef6a3ef90acbbb992ca22fe9466ee6f9d4898eda277a7ac3ab4b25101",
|
||||||
@ -2139,6 +2141,370 @@
|
|||||||
"P2PK with witness"
|
"P2PK with witness"
|
||||||
],
|
],
|
||||||
|
|
||||||
|
["Testing with compressed keys in witness v0 with WITNESS_PUBKEYTYPE"],
|
||||||
|
[
|
||||||
|
[
|
||||||
|
"304402204256146fcf8e73b0fd817ffa2a4e408ff0418ff987dd08a4f485b62546f6c43c02203f3c8c3e2febc051e1222867f5f9d0eaf039d6792911c10940aa3cc74123378e01",
|
||||||
|
"210279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798ac",
|
||||||
|
0.00000001
|
||||||
|
],
|
||||||
|
"",
|
||||||
|
"0 0x20 0x1863143c14c5166804bd19203356da136c985678cd4d27a1b8c6329604903262",
|
||||||
|
"P2SH,WITNESS,WITNESS_PUBKEYTYPE",
|
||||||
|
"OK",
|
||||||
|
"Basic P2WSH with compressed key"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
[
|
||||||
|
"304402204edf27486f11432466b744df533e1acac727e0c83e5f912eb289a3df5bf8035f022075809fdd876ede40ad21667eba8b7e96394938f9c9c50f11b6a1280cce2cea8601",
|
||||||
|
"0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798",
|
||||||
|
0.00000001
|
||||||
|
],
|
||||||
|
"",
|
||||||
|
"0 0x14 0x751e76e8199196d454941c45d1b3a323f1433bd6",
|
||||||
|
"P2SH,WITNESS,WITNESS_PUBKEYTYPE",
|
||||||
|
"OK",
|
||||||
|
"Basic P2WPKH with compressed key"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
[
|
||||||
|
"304402203a549090cc46bce1e5e95c4922ea2c12747988e0207b04c42f81cdbe87bb1539022050f57a245b875fd5119c419aaf050bcdf41384f0765f04b809e5bced1fe7093d01",
|
||||||
|
"210279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798ac",
|
||||||
|
0.00000001
|
||||||
|
],
|
||||||
|
"0x22 0x00201863143c14c5166804bd19203356da136c985678cd4d27a1b8c6329604903262",
|
||||||
|
"HASH160 0x14 0xe4300531190587e3880d4c3004f5355d88ff928d EQUAL",
|
||||||
|
"P2SH,WITNESS,WITNESS_PUBKEYTYPE",
|
||||||
|
"OK",
|
||||||
|
"Basic P2SH(P2WSH) with compressed key"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
[
|
||||||
|
"304402201bc0d53046827f4a35a3166e33e3b3366c4085540dc383b95d21ed2ab11e368a0220333e78c6231214f5f8e59621e15d7eeab0d4e4d0796437e00bfbd2680c5f9c1701",
|
||||||
|
"0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798",
|
||||||
|
0.00000001
|
||||||
|
],
|
||||||
|
"0x16 0x0014751e76e8199196d454941c45d1b3a323f1433bd6",
|
||||||
|
"HASH160 0x14 0xbcfeb728b584253d5f3f70bcb780e9ef218a68f4 EQUAL",
|
||||||
|
"P2SH,WITNESS,WITNESS_PUBKEYTYPE",
|
||||||
|
"OK",
|
||||||
|
"Basic P2SH(P2WPKH) with compressed key"
|
||||||
|
],
|
||||||
|
|
||||||
|
["Testing with uncompressed keys in witness v0 with WITNESS_PUBKEYTYPE"],
|
||||||
|
[
|
||||||
|
[
|
||||||
|
"304402200d461c140cfdfcf36b94961db57ae8c18d1cb80e9d95a9e47ac22470c1bf125502201c8dc1cbfef6a3ef90acbbb992ca22fe9466ee6f9d4898eda277a7ac3ab4b25101",
|
||||||
|
"410479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8ac",
|
||||||
|
0.00000001
|
||||||
|
],
|
||||||
|
"",
|
||||||
|
"0 0x20 0xb95237b48faaa69eb078e1170be3b5cbb3fddf16d0a991e14ad274f7b33a4f64",
|
||||||
|
"P2SH,WITNESS,WITNESS_PUBKEYTYPE",
|
||||||
|
"WITNESS_PUBKEYTYPE",
|
||||||
|
"Basic P2WSH"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
[
|
||||||
|
"304402201e7216e5ccb3b61d46946ec6cc7e8c4e0117d13ac2fd4b152197e4805191c74202203e9903e33e84d9ee1dd13fb057afb7ccfb47006c23f6a067185efbc9dd780fc501",
|
||||||
|
"0479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8",
|
||||||
|
0.00000001
|
||||||
|
],
|
||||||
|
"",
|
||||||
|
"0 0x14 0x91b24bf9f5288532960ac687abb035127b1d28a5",
|
||||||
|
"P2SH,WITNESS,WITNESS_PUBKEYTYPE",
|
||||||
|
"WITNESS_PUBKEYTYPE",
|
||||||
|
"Basic P2WPKH"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
[
|
||||||
|
"3044022066e02c19a513049d49349cf5311a1b012b7c4fae023795a18ab1d91c23496c22022025e216342c8e07ce8ef51e8daee88f84306a9de66236cab230bb63067ded1ad301",
|
||||||
|
"410479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8ac",
|
||||||
|
0.00000001
|
||||||
|
],
|
||||||
|
"0x22 0x0020b95237b48faaa69eb078e1170be3b5cbb3fddf16d0a991e14ad274f7b33a4f64",
|
||||||
|
"HASH160 0x14 0xf386c2ba255cc56d20cfa6ea8b062f8b59945518 EQUAL",
|
||||||
|
"P2SH,WITNESS,WITNESS_PUBKEYTYPE",
|
||||||
|
"WITNESS_PUBKEYTYPE",
|
||||||
|
"Basic P2SH(P2WSH)"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
[
|
||||||
|
"304402200929d11561cd958460371200f82e9cae64c727a495715a31828e27a7ad57b36d0220361732ced04a6f97351ecca21a56d0b8cd4932c1da1f8f569a2b68e5e48aed7801",
|
||||||
|
"0479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8",
|
||||||
|
0.00000001
|
||||||
|
],
|
||||||
|
"0x16 0x001491b24bf9f5288532960ac687abb035127b1d28a5",
|
||||||
|
"HASH160 0x14 0x17743beb429c55c942d2ec703b98c4d57c2df5c6 EQUAL",
|
||||||
|
"P2SH,WITNESS,WITNESS_PUBKEYTYPE",
|
||||||
|
"WITNESS_PUBKEYTYPE",
|
||||||
|
"Basic P2SH(P2WPKH)"
|
||||||
|
],
|
||||||
|
|
||||||
|
["Testing P2WSH multisig with compressed keys"],
|
||||||
|
[
|
||||||
|
[
|
||||||
|
"",
|
||||||
|
"304402207eb8a59b5c65fc3f6aeef77066556ed5c541948a53a3ba7f7c375b8eed76ee7502201e036a7a9a98ff919ff94dc905d67a1ec006f79ef7cff0708485c8bb79dce38e01",
|
||||||
|
"5121038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508210279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f8179852ae",
|
||||||
|
0.00000001
|
||||||
|
],
|
||||||
|
"",
|
||||||
|
"0 0x20 0x06c24420938f0fa3c1cb2707d867154220dca365cdbfa0dd2a83854730221460",
|
||||||
|
"P2SH,WITNESS,WITNESS_PUBKEYTYPE",
|
||||||
|
"OK",
|
||||||
|
"P2WSH CHECKMULTISIG with compressed keys"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
[
|
||||||
|
"",
|
||||||
|
"3044022033706aed33b8155d5486df3b9bca8cdd3bd4bdb5436dce46d72cdaba51d22b4002203626e94fe53a178af46624f17315c6931f20a30b103f5e044e1eda0c3fe185c601",
|
||||||
|
"5121038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508210279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f8179852ae",
|
||||||
|
0.00000001
|
||||||
|
],
|
||||||
|
"0x22 0x002006c24420938f0fa3c1cb2707d867154220dca365cdbfa0dd2a83854730221460",
|
||||||
|
"HASH160 0x14 0x26282aad7c29369d15fed062a778b6100d31a340 EQUAL",
|
||||||
|
"P2SH,WITNESS,WITNESS_PUBKEYTYPE",
|
||||||
|
"OK",
|
||||||
|
"P2SH(P2WSH) CHECKMULTISIG with compressed keys"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
[
|
||||||
|
"",
|
||||||
|
"304402204048b7371ab1c544362efb89af0c80154747d665aa4fcfb2edfd2d161e57b42e02207e043748e96637080ffc3acbd4dcc6fee1e58d30f6d1269535f32188e5ddae7301",
|
||||||
|
"5121038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508210279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f8179852ae",
|
||||||
|
0.00000001
|
||||||
|
],
|
||||||
|
"",
|
||||||
|
"0 0x20 0x06c24420938f0fa3c1cb2707d867154220dca365cdbfa0dd2a83854730221460",
|
||||||
|
"P2SH,WITNESS,WITNESS_PUBKEYTYPE",
|
||||||
|
"OK",
|
||||||
|
"P2WSH CHECKMULTISIG with compressed keys"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
[
|
||||||
|
"",
|
||||||
|
"3044022073902ef0b8a554c36c44cc03c1b64df96ce2914ebcf946f5bb36078fd5245cdf02205b148f1ba127065fb8c83a5a9576f2dcd111739788ed4bb3ee08b2bd3860c91c01",
|
||||||
|
"5121038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508210279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f8179852ae",
|
||||||
|
0.00000001
|
||||||
|
],
|
||||||
|
"0x22 0x002006c24420938f0fa3c1cb2707d867154220dca365cdbfa0dd2a83854730221460",
|
||||||
|
"HASH160 0x14 0x26282aad7c29369d15fed062a778b6100d31a340 EQUAL",
|
||||||
|
"P2SH,WITNESS,WITNESS_PUBKEYTYPE",
|
||||||
|
"OK",
|
||||||
|
"P2SH(P2WSH) CHECKMULTISIG with compressed keys"
|
||||||
|
],
|
||||||
|
|
||||||
|
["Testing P2WSH multisig with compressed and uncompressed keys (first key being the key closer to the top of stack)"],
|
||||||
|
[
|
||||||
|
[
|
||||||
|
"",
|
||||||
|
"304402202d092ededd1f060609dbf8cb76950634ff42b3e62cf4adb69ab92397b07d742302204ff886f8d0817491a96d1daccdcc820f6feb122ee6230143303100db37dfa79f01",
|
||||||
|
"5121038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508410479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b852ae",
|
||||||
|
0.00000001
|
||||||
|
],
|
||||||
|
"",
|
||||||
|
"0 0x20 0x08a6665ebfd43b02323423e764e185d98d1587f903b81507dbb69bfc41005efa",
|
||||||
|
"P2SH,WITNESS",
|
||||||
|
"OK",
|
||||||
|
"P2WSH CHECKMULTISIG with first key uncompressed and signing with the first key"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
[
|
||||||
|
"",
|
||||||
|
"304402202dd7e91243f2235481ffb626c3b7baf2c859ae3a5a77fb750ef97b99a8125dc002204960de3d3c3ab9496e218ec57e5240e0e10a6f9546316fe240c216d45116d29301",
|
||||||
|
"5121038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508410479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b852ae",
|
||||||
|
0.00000001
|
||||||
|
],
|
||||||
|
"0x22 0x002008a6665ebfd43b02323423e764e185d98d1587f903b81507dbb69bfc41005efa",
|
||||||
|
"HASH160 0x14 0x6f5ecd4b83b77f3c438f5214eff96454934fc5d1 EQUAL",
|
||||||
|
"P2SH,WITNESS",
|
||||||
|
"OK",
|
||||||
|
"P2SH(P2WSH) CHECKMULTISIG first key uncompressed and signing with the first key"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
[
|
||||||
|
"",
|
||||||
|
"304402202d092ededd1f060609dbf8cb76950634ff42b3e62cf4adb69ab92397b07d742302204ff886f8d0817491a96d1daccdcc820f6feb122ee6230143303100db37dfa79f01",
|
||||||
|
"5121038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508410479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b852ae",
|
||||||
|
0.00000001
|
||||||
|
],
|
||||||
|
"",
|
||||||
|
"0 0x20 0x08a6665ebfd43b02323423e764e185d98d1587f903b81507dbb69bfc41005efa",
|
||||||
|
"P2SH,WITNESS,WITNESS_PUBKEYTYPE",
|
||||||
|
"WITNESS_PUBKEYTYPE",
|
||||||
|
"P2WSH CHECKMULTISIG with first key uncompressed and signing with the first key"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
[
|
||||||
|
"",
|
||||||
|
"304402202dd7e91243f2235481ffb626c3b7baf2c859ae3a5a77fb750ef97b99a8125dc002204960de3d3c3ab9496e218ec57e5240e0e10a6f9546316fe240c216d45116d29301",
|
||||||
|
"5121038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508410479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b852ae",
|
||||||
|
0.00000001
|
||||||
|
],
|
||||||
|
"0x22 0x002008a6665ebfd43b02323423e764e185d98d1587f903b81507dbb69bfc41005efa",
|
||||||
|
"HASH160 0x14 0x6f5ecd4b83b77f3c438f5214eff96454934fc5d1 EQUAL",
|
||||||
|
"P2SH,WITNESS,WITNESS_PUBKEYTYPE",
|
||||||
|
"WITNESS_PUBKEYTYPE",
|
||||||
|
"P2SH(P2WSH) CHECKMULTISIG with first key uncompressed and signing with the first key"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
[
|
||||||
|
"",
|
||||||
|
"304402201e9e6f7deef5b2f21d8223c5189b7d5e82d237c10e97165dd08f547c4e5ce6ed02206796372eb1cc6acb52e13ee2d7f45807780bf96b132cb6697f69434be74b1af901",
|
||||||
|
"5121038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508410479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b852ae",
|
||||||
|
0.00000001
|
||||||
|
],
|
||||||
|
"",
|
||||||
|
"0 0x20 0x08a6665ebfd43b02323423e764e185d98d1587f903b81507dbb69bfc41005efa",
|
||||||
|
"P2SH,WITNESS",
|
||||||
|
"OK",
|
||||||
|
"P2WSH CHECKMULTISIG with first key uncompressed and signing with the second key"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
[
|
||||||
|
"",
|
||||||
|
"3044022045e667f3f0f3147b95597a24babe9afecea1f649fd23637dfa7ed7e9f3ac18440220295748e81005231135289fe3a88338dabba55afa1bdb4478691337009d82b68d01",
|
||||||
|
"5121038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508410479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b852ae",
|
||||||
|
0.00000001
|
||||||
|
],
|
||||||
|
"0x22 0x002008a6665ebfd43b02323423e764e185d98d1587f903b81507dbb69bfc41005efa",
|
||||||
|
"HASH160 0x14 0x6f5ecd4b83b77f3c438f5214eff96454934fc5d1 EQUAL",
|
||||||
|
"P2SH,WITNESS",
|
||||||
|
"OK",
|
||||||
|
"P2SH(P2WSH) CHECKMULTISIG with first key uncompressed and signing with the second key"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
[
|
||||||
|
"",
|
||||||
|
"304402201e9e6f7deef5b2f21d8223c5189b7d5e82d237c10e97165dd08f547c4e5ce6ed02206796372eb1cc6acb52e13ee2d7f45807780bf96b132cb6697f69434be74b1af901",
|
||||||
|
"5121038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508410479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b852ae",
|
||||||
|
0.00000001
|
||||||
|
],
|
||||||
|
"",
|
||||||
|
"0 0x20 0x08a6665ebfd43b02323423e764e185d98d1587f903b81507dbb69bfc41005efa",
|
||||||
|
"P2SH,WITNESS,WITNESS_PUBKEYTYPE",
|
||||||
|
"WITNESS_PUBKEYTYPE",
|
||||||
|
"P2WSH CHECKMULTISIG with first key uncompressed and signing with the second key"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
[
|
||||||
|
"",
|
||||||
|
"3044022045e667f3f0f3147b95597a24babe9afecea1f649fd23637dfa7ed7e9f3ac18440220295748e81005231135289fe3a88338dabba55afa1bdb4478691337009d82b68d01",
|
||||||
|
"5121038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508410479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b852ae",
|
||||||
|
0.00000001
|
||||||
|
],
|
||||||
|
"0x22 0x002008a6665ebfd43b02323423e764e185d98d1587f903b81507dbb69bfc41005efa",
|
||||||
|
"HASH160 0x14 0x6f5ecd4b83b77f3c438f5214eff96454934fc5d1 EQUAL",
|
||||||
|
"P2SH,WITNESS,WITNESS_PUBKEYTYPE",
|
||||||
|
"WITNESS_PUBKEYTYPE",
|
||||||
|
"P2SH(P2WSH) CHECKMULTISIG with first key uncompressed and signing with the second key"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
[
|
||||||
|
"",
|
||||||
|
"3044022046f5367a261fd8f8d7de6eb390491344f8ec2501638fb9a1095a0599a21d3f4c02205c1b3b51d20091c5f1020841bbca87b44ebe25405c64e4acf758f2eae8665f8401",
|
||||||
|
"5141048282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f5150811f8a8098557dfe45e8256e830b60ace62d613ac2f7b17bed31b6eaff6e26caf210279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f8179852ae",
|
||||||
|
0.00000001
|
||||||
|
],
|
||||||
|
"",
|
||||||
|
"0 0x20 0x230828ed48871f0f362ce9432aa52f620f442cc8d9ce7a8b5e798365595a38bb",
|
||||||
|
"P2SH,WITNESS",
|
||||||
|
"OK",
|
||||||
|
"P2WSH CHECKMULTISIG with second key uncompressed and signing with the first key"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
[
|
||||||
|
"",
|
||||||
|
"3044022053e210e4fb1881e6092fd75c3efc5163105599e246ded661c0ee2b5682cc2d6c02203a26b7ada8682a095b84c6d1b881637000b47d761fc837c4cee33555296d63f101",
|
||||||
|
"5141048282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f5150811f8a8098557dfe45e8256e830b60ace62d613ac2f7b17bed31b6eaff6e26caf210279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f8179852ae",
|
||||||
|
0.00000001
|
||||||
|
],
|
||||||
|
"0x22 0x0020230828ed48871f0f362ce9432aa52f620f442cc8d9ce7a8b5e798365595a38bb",
|
||||||
|
"HASH160 0x14 0x3478e7019ce61a68148f87549579b704cbe4c393 EQUAL",
|
||||||
|
"P2SH,WITNESS",
|
||||||
|
"OK",
|
||||||
|
"P2SH(P2WSH) CHECKMULTISIG second key uncompressed and signing with the first key"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
[
|
||||||
|
"",
|
||||||
|
"3044022046f5367a261fd8f8d7de6eb390491344f8ec2501638fb9a1095a0599a21d3f4c02205c1b3b51d20091c5f1020841bbca87b44ebe25405c64e4acf758f2eae8665f8401",
|
||||||
|
"5141048282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f5150811f8a8098557dfe45e8256e830b60ace62d613ac2f7b17bed31b6eaff6e26caf210279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f8179852ae",
|
||||||
|
0.00000001
|
||||||
|
],
|
||||||
|
"",
|
||||||
|
"0 0x20 0x230828ed48871f0f362ce9432aa52f620f442cc8d9ce7a8b5e798365595a38bb",
|
||||||
|
"P2SH,WITNESS,WITNESS_PUBKEYTYPE",
|
||||||
|
"OK",
|
||||||
|
"P2WSH CHECKMULTISIG with second key uncompressed and signing with the first key should pass as the uncompressed key is not used"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
[
|
||||||
|
"",
|
||||||
|
"3044022053e210e4fb1881e6092fd75c3efc5163105599e246ded661c0ee2b5682cc2d6c02203a26b7ada8682a095b84c6d1b881637000b47d761fc837c4cee33555296d63f101",
|
||||||
|
"5141048282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f5150811f8a8098557dfe45e8256e830b60ace62d613ac2f7b17bed31b6eaff6e26caf210279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f8179852ae",
|
||||||
|
0.00000001
|
||||||
|
],
|
||||||
|
"0x22 0x0020230828ed48871f0f362ce9432aa52f620f442cc8d9ce7a8b5e798365595a38bb",
|
||||||
|
"HASH160 0x14 0x3478e7019ce61a68148f87549579b704cbe4c393 EQUAL",
|
||||||
|
"P2SH,WITNESS,WITNESS_PUBKEYTYPE",
|
||||||
|
"OK",
|
||||||
|
"P2SH(P2WSH) CHECKMULTISIG with second key uncompressed and signing with the first key should pass as the uncompressed key is not used"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
[
|
||||||
|
"",
|
||||||
|
"304402206c6d9f5daf85b54af2a93ec38b15ab27f205dbf5c735365ff12451e43613d1f40220736a44be63423ed5ebf53491618b7cc3d8a5093861908da853739c73717938b701",
|
||||||
|
"5141048282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f5150811f8a8098557dfe45e8256e830b60ace62d613ac2f7b17bed31b6eaff6e26caf210279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f8179852ae",
|
||||||
|
0.00000001
|
||||||
|
],
|
||||||
|
"",
|
||||||
|
"0 0x20 0x230828ed48871f0f362ce9432aa52f620f442cc8d9ce7a8b5e798365595a38bb",
|
||||||
|
"P2SH,WITNESS",
|
||||||
|
"OK",
|
||||||
|
"P2WSH CHECKMULTISIG with second key uncompressed and signing with the second key"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
[
|
||||||
|
"",
|
||||||
|
"30440220687871bc6144012d75baf585bb26ce13997f7d8c626f4d8825b069c3b2d064470220108936fe1c57327764782253e99090b09c203ec400ed35ce9e026ce2ecf842a001",
|
||||||
|
"5141048282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f5150811f8a8098557dfe45e8256e830b60ace62d613ac2f7b17bed31b6eaff6e26caf210279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f8179852ae",
|
||||||
|
0.00000001
|
||||||
|
],
|
||||||
|
"0x22 0x0020230828ed48871f0f362ce9432aa52f620f442cc8d9ce7a8b5e798365595a38bb",
|
||||||
|
"HASH160 0x14 0x3478e7019ce61a68148f87549579b704cbe4c393 EQUAL",
|
||||||
|
"P2SH,WITNESS",
|
||||||
|
"OK",
|
||||||
|
"P2SH(P2WSH) CHECKMULTISIG with second key uncompressed and signing with the second key"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
[
|
||||||
|
"",
|
||||||
|
"304402206c6d9f5daf85b54af2a93ec38b15ab27f205dbf5c735365ff12451e43613d1f40220736a44be63423ed5ebf53491618b7cc3d8a5093861908da853739c73717938b701",
|
||||||
|
"5141048282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f5150811f8a8098557dfe45e8256e830b60ace62d613ac2f7b17bed31b6eaff6e26caf210279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f8179852ae",
|
||||||
|
0.00000001
|
||||||
|
],
|
||||||
|
"",
|
||||||
|
"0 0x20 0x230828ed48871f0f362ce9432aa52f620f442cc8d9ce7a8b5e798365595a38bb",
|
||||||
|
"P2SH,WITNESS,WITNESS_PUBKEYTYPE",
|
||||||
|
"WITNESS_PUBKEYTYPE",
|
||||||
|
"P2WSH CHECKMULTISIG with second key uncompressed and signing with the second key"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
[
|
||||||
|
"",
|
||||||
|
"30440220687871bc6144012d75baf585bb26ce13997f7d8c626f4d8825b069c3b2d064470220108936fe1c57327764782253e99090b09c203ec400ed35ce9e026ce2ecf842a001",
|
||||||
|
"5141048282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f5150811f8a8098557dfe45e8256e830b60ace62d613ac2f7b17bed31b6eaff6e26caf210279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f8179852ae",
|
||||||
|
0.00000001
|
||||||
|
],
|
||||||
|
"0x22 0x0020230828ed48871f0f362ce9432aa52f620f442cc8d9ce7a8b5e798365595a38bb",
|
||||||
|
"HASH160 0x14 0x3478e7019ce61a68148f87549579b704cbe4c393 EQUAL",
|
||||||
|
"P2SH,WITNESS,WITNESS_PUBKEYTYPE",
|
||||||
|
"WITNESS_PUBKEYTYPE",
|
||||||
|
"P2SH(P2WSH) CHECKMULTISIG with second key uncompressed and signing with the second key"
|
||||||
|
],
|
||||||
|
|
||||||
["CHECKSEQUENCEVERIFY tests"],
|
["CHECKSEQUENCEVERIFY tests"],
|
||||||
["", "CHECKSEQUENCEVERIFY", "CHECKSEQUENCEVERIFY", "INVALID_STACK_OPERATION", "CSV automatically fails on a empty stack"],
|
["", "CHECKSEQUENCEVERIFY", "CHECKSEQUENCEVERIFY", "INVALID_STACK_OPERATION", "CSV automatically fails on a empty stack"],
|
||||||
["-1", "CHECKSEQUENCEVERIFY", "CHECKSEQUENCEVERIFY", "NEGATIVE_LOCKTIME", "CSV automatically fails if stack top is negative"],
|
["-1", "CHECKSEQUENCEVERIFY", "CHECKSEQUENCEVERIFY", "NEGATIVE_LOCKTIME", "CSV automatically fails if stack top is negative"],
|
||||||
|
@ -826,6 +826,99 @@ BOOST_AUTO_TEST_CASE(script_build)
|
|||||||
"P2PK with witness", SCRIPT_VERIFY_WITNESS | SCRIPT_VERIFY_P2SH
|
"P2PK with witness", SCRIPT_VERIFY_WITNESS | SCRIPT_VERIFY_P2SH
|
||||||
).PushSig(keys.key0).Push("0").AsWit().ScriptError(SCRIPT_ERR_WITNESS_UNEXPECTED));
|
).PushSig(keys.key0).Push("0").AsWit().ScriptError(SCRIPT_ERR_WITNESS_UNEXPECTED));
|
||||||
|
|
||||||
|
// Compressed keys should pass SCRIPT_VERIFY_WITNESS_PUBKEYTYPE
|
||||||
|
tests.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey0C) << OP_CHECKSIG,
|
||||||
|
"Basic P2WSH with compressed key", SCRIPT_VERIFY_WITNESS | SCRIPT_VERIFY_P2SH | SCRIPT_VERIFY_WITNESS_PUBKEYTYPE, false, WITNESS_SH,
|
||||||
|
0, 1).PushWitSig(keys.key0C).PushWitRedeem());
|
||||||
|
tests.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey0C),
|
||||||
|
"Basic P2WPKH with compressed key", SCRIPT_VERIFY_WITNESS | SCRIPT_VERIFY_P2SH | SCRIPT_VERIFY_WITNESS_PUBKEYTYPE, false, WITNESS_PKH,
|
||||||
|
0, 1).PushWitSig(keys.key0C).Push(keys.pubkey0C).AsWit());
|
||||||
|
tests.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey0C) << OP_CHECKSIG,
|
||||||
|
"Basic P2SH(P2WSH) with compressed key", SCRIPT_VERIFY_WITNESS | SCRIPT_VERIFY_P2SH | SCRIPT_VERIFY_WITNESS_PUBKEYTYPE, true, WITNESS_SH,
|
||||||
|
0, 1).PushWitSig(keys.key0C).PushWitRedeem().PushRedeem());
|
||||||
|
tests.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey0C),
|
||||||
|
"Basic P2SH(P2WPKH) with compressed key", SCRIPT_VERIFY_WITNESS | SCRIPT_VERIFY_P2SH | SCRIPT_VERIFY_WITNESS_PUBKEYTYPE, true, WITNESS_PKH,
|
||||||
|
0, 1).PushWitSig(keys.key0C).Push(keys.pubkey0C).AsWit().PushRedeem());
|
||||||
|
|
||||||
|
// Testing uncompressed key in witness with SCRIPT_VERIFY_WITNESS_PUBKEYTYPE
|
||||||
|
tests.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey0) << OP_CHECKSIG,
|
||||||
|
"Basic P2WSH", SCRIPT_VERIFY_WITNESS | SCRIPT_VERIFY_P2SH | SCRIPT_VERIFY_WITNESS_PUBKEYTYPE, false, WITNESS_SH,
|
||||||
|
0, 1).PushWitSig(keys.key0).PushWitRedeem().ScriptError(SCRIPT_ERR_WITNESS_PUBKEYTYPE));
|
||||||
|
tests.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey0),
|
||||||
|
"Basic P2WPKH", SCRIPT_VERIFY_WITNESS | SCRIPT_VERIFY_P2SH | SCRIPT_VERIFY_WITNESS_PUBKEYTYPE, false, WITNESS_PKH,
|
||||||
|
0, 1).PushWitSig(keys.key0).Push(keys.pubkey0).AsWit().ScriptError(SCRIPT_ERR_WITNESS_PUBKEYTYPE));
|
||||||
|
tests.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey0) << OP_CHECKSIG,
|
||||||
|
"Basic P2SH(P2WSH)", SCRIPT_VERIFY_WITNESS | SCRIPT_VERIFY_P2SH | SCRIPT_VERIFY_WITNESS_PUBKEYTYPE, true, WITNESS_SH,
|
||||||
|
0, 1).PushWitSig(keys.key0).PushWitRedeem().PushRedeem().ScriptError(SCRIPT_ERR_WITNESS_PUBKEYTYPE));
|
||||||
|
tests.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey0),
|
||||||
|
"Basic P2SH(P2WPKH)", SCRIPT_VERIFY_WITNESS | SCRIPT_VERIFY_P2SH | SCRIPT_VERIFY_WITNESS_PUBKEYTYPE, true, WITNESS_PKH,
|
||||||
|
0, 1).PushWitSig(keys.key0).Push(keys.pubkey0).AsWit().PushRedeem().ScriptError(SCRIPT_ERR_WITNESS_PUBKEYTYPE));
|
||||||
|
|
||||||
|
// P2WSH 1-of-2 multisig with compressed keys
|
||||||
|
tests.push_back(TestBuilder(CScript() << OP_1 << ToByteVector(keys.pubkey1C) << ToByteVector(keys.pubkey0C) << OP_2 << OP_CHECKMULTISIG,
|
||||||
|
"P2WSH CHECKMULTISIG with compressed keys", SCRIPT_VERIFY_WITNESS | SCRIPT_VERIFY_P2SH | SCRIPT_VERIFY_WITNESS_PUBKEYTYPE, false, WITNESS_SH,
|
||||||
|
0, 1).Push(CScript()).AsWit().PushWitSig(keys.key0C).PushWitRedeem());
|
||||||
|
tests.push_back(TestBuilder(CScript() << OP_1 << ToByteVector(keys.pubkey1C) << ToByteVector(keys.pubkey0C) << OP_2 << OP_CHECKMULTISIG,
|
||||||
|
"P2SH(P2WSH) CHECKMULTISIG with compressed keys", SCRIPT_VERIFY_WITNESS | SCRIPT_VERIFY_P2SH | SCRIPT_VERIFY_WITNESS_PUBKEYTYPE, true, WITNESS_SH,
|
||||||
|
0, 1).Push(CScript()).AsWit().PushWitSig(keys.key0C).PushWitRedeem().PushRedeem());
|
||||||
|
tests.push_back(TestBuilder(CScript() << OP_1 << ToByteVector(keys.pubkey1C) << ToByteVector(keys.pubkey0C) << OP_2 << OP_CHECKMULTISIG,
|
||||||
|
"P2WSH CHECKMULTISIG with compressed keys", SCRIPT_VERIFY_WITNESS | SCRIPT_VERIFY_P2SH | SCRIPT_VERIFY_WITNESS_PUBKEYTYPE, false, WITNESS_SH,
|
||||||
|
0, 1).Push(CScript()).AsWit().PushWitSig(keys.key1C).PushWitRedeem());
|
||||||
|
tests.push_back(TestBuilder(CScript() << OP_1 << ToByteVector(keys.pubkey1C) << ToByteVector(keys.pubkey0C) << OP_2 << OP_CHECKMULTISIG,
|
||||||
|
"P2SH(P2WSH) CHECKMULTISIG with compressed keys", SCRIPT_VERIFY_WITNESS | SCRIPT_VERIFY_P2SH | SCRIPT_VERIFY_WITNESS_PUBKEYTYPE, true, WITNESS_SH,
|
||||||
|
0, 1).Push(CScript()).AsWit().PushWitSig(keys.key1C).PushWitRedeem().PushRedeem());
|
||||||
|
|
||||||
|
// P2WSH 1-of-2 multisig with first key uncompressed
|
||||||
|
tests.push_back(TestBuilder(CScript() << OP_1 << ToByteVector(keys.pubkey1C) << ToByteVector(keys.pubkey0) << OP_2 << OP_CHECKMULTISIG,
|
||||||
|
"P2WSH CHECKMULTISIG with first key uncompressed and signing with the first key", SCRIPT_VERIFY_WITNESS | SCRIPT_VERIFY_P2SH, false, WITNESS_SH,
|
||||||
|
0, 1).Push(CScript()).AsWit().PushWitSig(keys.key0).PushWitRedeem());
|
||||||
|
tests.push_back(TestBuilder(CScript() << OP_1 << ToByteVector(keys.pubkey1C) << ToByteVector(keys.pubkey0) << OP_2 << OP_CHECKMULTISIG,
|
||||||
|
"P2SH(P2WSH) CHECKMULTISIG first key uncompressed and signing with the first key", SCRIPT_VERIFY_WITNESS | SCRIPT_VERIFY_P2SH, true, WITNESS_SH,
|
||||||
|
0, 1).Push(CScript()).AsWit().PushWitSig(keys.key0).PushWitRedeem().PushRedeem());
|
||||||
|
tests.push_back(TestBuilder(CScript() << OP_1 << ToByteVector(keys.pubkey1C) << ToByteVector(keys.pubkey0) << OP_2 << OP_CHECKMULTISIG,
|
||||||
|
"P2WSH CHECKMULTISIG with first key uncompressed and signing with the first key", SCRIPT_VERIFY_WITNESS | SCRIPT_VERIFY_P2SH | SCRIPT_VERIFY_WITNESS_PUBKEYTYPE, false, WITNESS_SH,
|
||||||
|
0, 1).Push(CScript()).AsWit().PushWitSig(keys.key0).PushWitRedeem().ScriptError(SCRIPT_ERR_WITNESS_PUBKEYTYPE));
|
||||||
|
tests.push_back(TestBuilder(CScript() << OP_1 << ToByteVector(keys.pubkey1C) << ToByteVector(keys.pubkey0) << OP_2 << OP_CHECKMULTISIG,
|
||||||
|
"P2SH(P2WSH) CHECKMULTISIG with first key uncompressed and signing with the first key", SCRIPT_VERIFY_WITNESS | SCRIPT_VERIFY_P2SH | SCRIPT_VERIFY_WITNESS_PUBKEYTYPE, true, WITNESS_SH,
|
||||||
|
0, 1).Push(CScript()).AsWit().PushWitSig(keys.key0).PushWitRedeem().PushRedeem().ScriptError(SCRIPT_ERR_WITNESS_PUBKEYTYPE));
|
||||||
|
tests.push_back(TestBuilder(CScript() << OP_1 << ToByteVector(keys.pubkey1C) << ToByteVector(keys.pubkey0) << OP_2 << OP_CHECKMULTISIG,
|
||||||
|
"P2WSH CHECKMULTISIG with first key uncompressed and signing with the second key", SCRIPT_VERIFY_WITNESS | SCRIPT_VERIFY_P2SH, false, WITNESS_SH,
|
||||||
|
0, 1).Push(CScript()).AsWit().PushWitSig(keys.key1C).PushWitRedeem());
|
||||||
|
tests.push_back(TestBuilder(CScript() << OP_1 << ToByteVector(keys.pubkey1C) << ToByteVector(keys.pubkey0) << OP_2 << OP_CHECKMULTISIG,
|
||||||
|
"P2SH(P2WSH) CHECKMULTISIG with first key uncompressed and signing with the second key", SCRIPT_VERIFY_WITNESS | SCRIPT_VERIFY_P2SH, true, WITNESS_SH,
|
||||||
|
0, 1).Push(CScript()).AsWit().PushWitSig(keys.key1C).PushWitRedeem().PushRedeem());
|
||||||
|
tests.push_back(TestBuilder(CScript() << OP_1 << ToByteVector(keys.pubkey1C) << ToByteVector(keys.pubkey0) << OP_2 << OP_CHECKMULTISIG,
|
||||||
|
"P2WSH CHECKMULTISIG with first key uncompressed and signing with the second key", SCRIPT_VERIFY_WITNESS | SCRIPT_VERIFY_P2SH | SCRIPT_VERIFY_WITNESS_PUBKEYTYPE, false, WITNESS_SH,
|
||||||
|
0, 1).Push(CScript()).AsWit().PushWitSig(keys.key1C).PushWitRedeem().ScriptError(SCRIPT_ERR_WITNESS_PUBKEYTYPE));
|
||||||
|
tests.push_back(TestBuilder(CScript() << OP_1 << ToByteVector(keys.pubkey1C) << ToByteVector(keys.pubkey0) << OP_2 << OP_CHECKMULTISIG,
|
||||||
|
"P2SH(P2WSH) CHECKMULTISIG with first key uncompressed and signing with the second key", SCRIPT_VERIFY_WITNESS | SCRIPT_VERIFY_P2SH | SCRIPT_VERIFY_WITNESS_PUBKEYTYPE, true, WITNESS_SH,
|
||||||
|
0, 1).Push(CScript()).AsWit().PushWitSig(keys.key1C).PushWitRedeem().PushRedeem().ScriptError(SCRIPT_ERR_WITNESS_PUBKEYTYPE));
|
||||||
|
// P2WSH 1-of-2 multisig with second key uncompressed
|
||||||
|
tests.push_back(TestBuilder(CScript() << OP_1 << ToByteVector(keys.pubkey1) << ToByteVector(keys.pubkey0C) << OP_2 << OP_CHECKMULTISIG,
|
||||||
|
"P2WSH CHECKMULTISIG with second key uncompressed and signing with the first key", SCRIPT_VERIFY_WITNESS | SCRIPT_VERIFY_P2SH, false, WITNESS_SH,
|
||||||
|
0, 1).Push(CScript()).AsWit().PushWitSig(keys.key0C).PushWitRedeem());
|
||||||
|
tests.push_back(TestBuilder(CScript() << OP_1 << ToByteVector(keys.pubkey1) << ToByteVector(keys.pubkey0C) << OP_2 << OP_CHECKMULTISIG,
|
||||||
|
"P2SH(P2WSH) CHECKMULTISIG second key uncompressed and signing with the first key", SCRIPT_VERIFY_WITNESS | SCRIPT_VERIFY_P2SH, true, WITNESS_SH,
|
||||||
|
0, 1).Push(CScript()).AsWit().PushWitSig(keys.key0C).PushWitRedeem().PushRedeem());
|
||||||
|
tests.push_back(TestBuilder(CScript() << OP_1 << ToByteVector(keys.pubkey1) << ToByteVector(keys.pubkey0C) << OP_2 << OP_CHECKMULTISIG,
|
||||||
|
"P2WSH CHECKMULTISIG with second key uncompressed and signing with the first key should pass as the uncompressed key is not used", SCRIPT_VERIFY_WITNESS | SCRIPT_VERIFY_P2SH | SCRIPT_VERIFY_WITNESS_PUBKEYTYPE, false, WITNESS_SH,
|
||||||
|
0, 1).Push(CScript()).AsWit().PushWitSig(keys.key0C).PushWitRedeem());
|
||||||
|
tests.push_back(TestBuilder(CScript() << OP_1 << ToByteVector(keys.pubkey1) << ToByteVector(keys.pubkey0C) << OP_2 << OP_CHECKMULTISIG,
|
||||||
|
"P2SH(P2WSH) CHECKMULTISIG with second key uncompressed and signing with the first key should pass as the uncompressed key is not used", SCRIPT_VERIFY_WITNESS | SCRIPT_VERIFY_P2SH | SCRIPT_VERIFY_WITNESS_PUBKEYTYPE, true, WITNESS_SH,
|
||||||
|
0, 1).Push(CScript()).AsWit().PushWitSig(keys.key0C).PushWitRedeem().PushRedeem());
|
||||||
|
tests.push_back(TestBuilder(CScript() << OP_1 << ToByteVector(keys.pubkey1) << ToByteVector(keys.pubkey0C) << OP_2 << OP_CHECKMULTISIG,
|
||||||
|
"P2WSH CHECKMULTISIG with second key uncompressed and signing with the second key", SCRIPT_VERIFY_WITNESS | SCRIPT_VERIFY_P2SH, false, WITNESS_SH,
|
||||||
|
0, 1).Push(CScript()).AsWit().PushWitSig(keys.key1).PushWitRedeem());
|
||||||
|
tests.push_back(TestBuilder(CScript() << OP_1 << ToByteVector(keys.pubkey1) << ToByteVector(keys.pubkey0C) << OP_2 << OP_CHECKMULTISIG,
|
||||||
|
"P2SH(P2WSH) CHECKMULTISIG with second key uncompressed and signing with the second key", SCRIPT_VERIFY_WITNESS | SCRIPT_VERIFY_P2SH, true, WITNESS_SH,
|
||||||
|
0, 1).Push(CScript()).AsWit().PushWitSig(keys.key1).PushWitRedeem().PushRedeem());
|
||||||
|
tests.push_back(TestBuilder(CScript() << OP_1 << ToByteVector(keys.pubkey1) << ToByteVector(keys.pubkey0C) << OP_2 << OP_CHECKMULTISIG,
|
||||||
|
"P2WSH CHECKMULTISIG with second key uncompressed and signing with the second key", SCRIPT_VERIFY_WITNESS | SCRIPT_VERIFY_P2SH | SCRIPT_VERIFY_WITNESS_PUBKEYTYPE, false, WITNESS_SH,
|
||||||
|
0, 1).Push(CScript()).AsWit().PushWitSig(keys.key1).PushWitRedeem().ScriptError(SCRIPT_ERR_WITNESS_PUBKEYTYPE));
|
||||||
|
tests.push_back(TestBuilder(CScript() << OP_1 << ToByteVector(keys.pubkey1) << ToByteVector(keys.pubkey0C) << OP_2 << OP_CHECKMULTISIG,
|
||||||
|
"P2SH(P2WSH) CHECKMULTISIG with second key uncompressed and signing with the second key", SCRIPT_VERIFY_WITNESS | SCRIPT_VERIFY_P2SH | SCRIPT_VERIFY_WITNESS_PUBKEYTYPE, true, WITNESS_SH,
|
||||||
|
0, 1).Push(CScript()).AsWit().PushWitSig(keys.key1).PushWitRedeem().PushRedeem().ScriptError(SCRIPT_ERR_WITNESS_PUBKEYTYPE));
|
||||||
|
|
||||||
std::set<std::string> tests_set;
|
std::set<std::string> tests_set;
|
||||||
|
|
||||||
{
|
{
|
||||||
|
Loading…
Reference in New Issue
Block a user