Beispiel #1
0
    def witness_script_test(self):
        # Now test signing transaction to P2SH-P2WSH addresses without wallet
        # Create a new P2SH-P2WSH 1-of-1 multisig address:
        embedded_address = self.nodes[1].getaddressinfo(self.nodes[1].getnewaddress())
        embedded_privkey = self.nodes[1].dumpprivkey(embedded_address["address"])
        p2sh_p2wsh_address = self.nodes[1].addmultisigaddress(1, [embedded_address["pubkey"]], "", "p2sh-segwit")
        # send transaction to P2SH-P2WSH 1-of-1 multisig address
        self.nodes[0].generate(101)
        self.nodes[0].sendtoaddress(p2sh_p2wsh_address["address"], 49.999)
        self.nodes[0].generate(1)
        self.sync_all()
        # Find the UTXO for the transaction node[1] should have received, check witnessScript matches
        unspent_output = self.nodes[1].listunspent(0, 999999, [p2sh_p2wsh_address["address"]])[0]
        assert_equal(unspent_output["witnessScript"], p2sh_p2wsh_address["redeemScript"])
        p2sh_redeemScript = CScript([OP_0, sha256(hex_str_to_bytes(p2sh_p2wsh_address["redeemScript"]))])
        assert_equal(unspent_output["redeemScript"], p2sh_redeemScript.hex())
        # Now create and sign a transaction spending that output on node[0], which doesn't know the scripts or keys
        spending_tx = self.nodes[0].createrawtransaction([unspent_output], {self.nodes[1].getnewaddress(): Decimal("49.998")})
        spending_tx_signed = self.nodes[0].signrawtransactionwithkey(spending_tx, [embedded_privkey], [unspent_output])
        # Check the signing completed successfully
        assert 'complete' in spending_tx_signed
        assert_equal(spending_tx_signed['complete'], True)

        self.log.info('Try with a P2PKH script as the witnessScript')
        embedded_addr_info = self.nodes[1].getaddressinfo(self.nodes[1].getnewaddress('', 'legacy'))
        embedded_privkey = self.nodes[1].dumpprivkey(embedded_addr_info['address'])
        witness_script = embedded_addr_info['scriptPubKey']
        redeem_script = CScript([OP_0, sha256(check_script(witness_script))]).hex()
        addr = script_to_p2sh(redeem_script)
        script_pub_key = self.nodes[1].validateaddress(addr)['scriptPubKey']
        # Fund that address
        txid = self.nodes[0].sendtoaddress(addr, 10)
        vout = find_vout_for_address(self.nodes[0], txid, addr)
        self.nodes[0].generate(1)
        # Now create and sign a transaction spending that output on node[0], which doesn't know the scripts or keys
        spending_tx = self.nodes[0].createrawtransaction([{'txid': txid, 'vout': vout}], {self.nodes[1].getnewaddress(): Decimal("9.999")})
        spending_tx_signed = self.nodes[0].signrawtransactionwithkey(spending_tx, [embedded_privkey], [{'txid': txid, 'vout': vout, 'scriptPubKey': script_pub_key, 'redeemScript': redeem_script, 'witnessScript': witness_script, 'amount': 10}])
        # Check the signing completed successfully
        assert 'complete' in spending_tx_signed
        assert_equal(spending_tx_signed['complete'], True)
        self.nodes[0].sendrawtransaction(spending_tx_signed['hex'])

        self.log.info('Try with a P2PK script as the witnessScript')
        embedded_addr_info = self.nodes[1].getaddressinfo(self.nodes[1].getnewaddress('', 'legacy'))
        embedded_privkey = self.nodes[1].dumpprivkey(embedded_addr_info['address'])
        witness_script = CScript([hex_str_to_bytes(embedded_addr_info['pubkey']), OP_CHECKSIG]).hex()
        redeem_script = CScript([OP_0, sha256(check_script(witness_script))]).hex()
        addr = script_to_p2sh(redeem_script)
        script_pub_key = self.nodes[1].validateaddress(addr)['scriptPubKey']
        # Fund that address
        txid = self.nodes[0].sendtoaddress(addr, 10)
        vout = find_vout_for_address(self.nodes[0], txid, addr)
        self.nodes[0].generate(1)
        # Now create and sign a transaction spending that output on node[0], which doesn't know the scripts or keys
        spending_tx = self.nodes[0].createrawtransaction([{'txid': txid, 'vout': vout}], {self.nodes[1].getnewaddress(): Decimal("9.999")})
        spending_tx_signed = self.nodes[0].signrawtransactionwithkey(spending_tx, [embedded_privkey], [{'txid': txid, 'vout': vout, 'scriptPubKey': script_pub_key, 'redeemScript': redeem_script, 'witnessScript': witness_script, 'amount': 10}])
        # Check the signing completed successfully
        assert 'complete' in spending_tx_signed
        assert_equal(spending_tx_signed['complete'], True)
        self.nodes[0].sendrawtransaction(spending_tx_signed['hex'])
 def verify_txn_with_witness_script(self, tx_type):
     self.log.info(
         "Test with a {} script as the witnessScript".format(tx_type))
     eckey = ECKey()
     eckey.generate()
     embedded_privkey = bytes_to_wif(eckey.get_bytes())
     embedded_pubkey = eckey.get_pubkey().get_bytes().hex()
     witness_script = {
         '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()
     addr = script_to_p2sh(redeem_script, prefix=196)
     script_pub_key = self.nodes[1].validateaddress(addr)['scriptPubKey']
     # Fund that address
     txid = self.nodes[0].sendtoaddress(addr, 10)
     vout = find_vout_for_address(self.nodes[0], txid, addr)
     self.nodes[0].generate(1)
     # Now create and sign a transaction spending that output on node[0], which doesn't know the scripts or keys
     spending_tx = self.nodes[0].createrawtransaction([{
         'txid': txid,
         'vout': vout
     }], [{
         self.nodes[1].getnewaddress(): Decimal("9.999")
     }, {
         "fee": Decimal("0.001")
     }])
     spending_tx_signed = self.nodes[0].signrawtransactionwithkey(
         spending_tx, [embedded_privkey], [{
             'txid': txid,
             'vout': vout,
             'scriptPubKey': script_pub_key,
             'redeemScript': redeem_script,
             'witnessScript': witness_script,
             'amount': 10
         }])
     # Check the signing completed successfully
     assert 'complete' in spending_tx_signed
     assert_equal(spending_tx_signed['complete'], True)
     self.nodes[0].sendrawtransaction(spending_tx_signed['hex'])