@ -9,9 +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
import os
from test_framework . address import script_to_p2sh , key_to_p2pkh
import shutil
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
@ -243,5 +244,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 ( )