def test_get_address_from_output_script(self): # the inverse of this test is in test_bitcoin: test_address_to_script addr_from_script = lambda script: transaction.get_address_from_output_script( bfh(script)) # base58 p2pkh self.assertEqual( 'k11X9AqNVNLqmaeX7RCqXU47hpKzB3yXm8U', addr_from_script( '76a91428662c67561b95c79d2257d2a93d9d151c977e9188ac')) self.assertEqual( 'k185NR28jAC3VBG2axzNLhzqeArN2P7byuw', addr_from_script( '76a914704f4b81cadb7bf7e68c08cd3657220f680f863c88ac')) # almost but not quite self.assertEqual( None, addr_from_script( '76a9130000000000000000000000000000000000000088ac')) # base58 p2sh self.assertEqual( 'k32QN9L3r2VbWhL54GjLda4kF4LZzb15eoN', addr_from_script('a9142a84cf00d47f699ee7bbc1dea5ec1bdecb4ac15487')) self.assertEqual( 'k3LpGjKVPPFhcS4e2iLhkcEegFkiKwSyU6f', addr_from_script('a914f47c8954e421031ad04ecd8e7752c9479206b9d387')) # almost but not quite self.assertEqual( None, addr_from_script('a912f47c8954e421031ad04ecd8e7752c947920687')) # p2pk self.assertEqual( None, addr_from_script( '210289e14468d94537493c62e2168318b568912dec0fb95609afd56f2527c2751c8bac' )) self.assertEqual( None, addr_from_script( '41045485b0b076848af1209e788c893522a90f3df77c1abac2ca545846a725e6c3da1f7743f55a1bc3b5f0c7e0ee4459954ec0307022742d60032b13432953eb7120ac' )) # almost but not quite self.assertEqual( None, addr_from_script( '200289e14468d94537493c62e2168318b568912dec0fb95609afd56f2527c2751cac' )) self.assertEqual( None, addr_from_script( '210589e14468d94537493c62e2168318b568912dec0fb95609afd56f2527c2751c8bac' ))
def test_get_address_from_output_script(self): # the inverse of this test is in test_bitcoin: test_address_to_script addr_from_script = lambda script: transaction.get_address_from_output_script( bfh(script)) ADDR = transaction.TYPE_ADDRESS # bech32 native segwit # test vectors from BIP-0173 self.assertEqual( (ADDR, 'bc1qw508d6qejxtdg4y5r3zarvary0c5xw7kv8f3t4'), addr_from_script('0014751e76e8199196d454941c45d1b3a323f1433bd6')) self.assertEqual( (ADDR, 'bc1pw508d6qejxtdg4y5r3zarvary0c5xw7kw508d6qejxtdg4y5r3zarvary0c5xw7k7grplx' ), addr_from_script( '5128751e76e8199196d454941c45d1b3a323f1433bd6751e76e8199196d454941c45d1b3a323f1433bd6' )) self.assertEqual((ADDR, 'bc1sw50qa3jx3s'), addr_from_script('6002751e')) self.assertEqual( (ADDR, 'bc1zw508d6qejxtdg4y5r3zarvaryvg6kdaj'), addr_from_script('5210751e76e8199196d454941c45d1b3a323')) # base58 p2pkh self.assertEqual( (ADDR, '14gcRovpkCoGkCNBivQBvw7eso7eiNAbxG'), addr_from_script( '76a91428662c67561b95c79d2257d2a93d9d151c977e9188ac')) self.assertEqual( (ADDR, '1BEqfzh4Y3zzLosfGhw1AsqbEKVW6e1qHv'), addr_from_script( '76a914704f4b81cadb7bf7e68c08cd3657220f680f863c88ac')) self.assertEqual( (ADDR, '18u8VTYhogvwek9rUQRtHKn66Sf6a2RV5w'), addr_from_script( '76a91456a4c36cd1fdb71a493fec9941b69b4a7cec90ea88ac')) # base58 p2sh self.assertEqual( (ADDR, '35ZqQJcBQMZ1rsv8aSuJ2wkC7ohUCQMJbT'), addr_from_script('a9142a84cf00d47f699ee7bbc1dea5ec1bdecb4ac15487')) self.assertEqual( (ADDR, '3PyjzJ3im7f7bcV724GR57edKDqoZvH7Ji'), addr_from_script('a914f47c8954e421031ad04ecd8e7752c9479206b9d387'))
def verify_tx_input(tx, i, script, sig, pub): pub, sig, script = (binascii.unhexlify(x) for x in [pub, sig, script]) t = etr.Transaction(tx) t.deserialize() #to prepare for verification (to do the txhash for modtx) #we need to have the "address" field set in the input. typ, addr = etr.get_address_from_output_script(script) if not typ == ebt.TYPE_ADDRESS: #Don't support non-p2sh, non-p2pkh for now log.debug("Invalid script") return False t.inputs()[i]["address"] = addr txforsig = etr.Hash(t.tx_for_sig(i).decode('hex')) ecdsa_pub = get_ecdsa_verifying_key(pub) if not ecdsa_pub: return False try: verified = ecdsa_pub.verify_digest(sig, txforsig, sigdecode = sigdecode_der) except BadSignatureError, BadDigestError: return False
def verify_tx_input(tx, i, script, sig, pub): pub, sig, script = (binascii.unhexlify(x) for x in [pub, sig, script]) t = etr.Transaction(tx) t.deserialize() #to prepare for verification (to do the txhash for modtx) #we need to have the "address" field set in the input. typ, addr = etr.get_address_from_output_script(script) if not typ == ebt.TYPE_ADDRESS: #Don't support non-p2sh, non-p2pkh for now log.debug("Invalid script") return False t.inputs()[i]["address"] = addr t.inputs()[i]["type"] = 'p2pkh' txforsig = etr.Hash(t.serialize_preimage(i).decode('hex')) ecdsa_pub = get_ecdsa_verifying_key(pub) if not ecdsa_pub: return False try: verified = ecdsa_pub.verify_digest(sig, txforsig, sigdecode = sigdecode_der) except BadSignatureError, BadDigestError: return False
def script_to_address(script): bin_script = binascii.unhexlify(script) res = etr.get_address_from_output_script(bin_script) if not res[0] == ebt.TYPE_ADDRESS: raise ValueError("Invalid script for bitcoin address") return res[1]