From 7e381b6c80965f8fd3c1351074f52e863fff7950 Mon Sep 17 00:00:00 2001 From: Adam Gibson Date: Mon, 13 Mar 2017 19:49:31 +0200 Subject: [PATCH] Updates for Electrum 2.8 ElectrumWalletInterface now supports testnet. Changes to Electrum API in btc.py for new 2.8 code. --- jmclient/jmclient/blockchaininterface.py | 3 --- jmclient/jmclient/btc.py | 23 +++++++++++++++-------- 2 files changed, 15 insertions(+), 11 deletions(-) diff --git a/jmclient/jmclient/blockchaininterface.py b/jmclient/jmclient/blockchaininterface.py index 51f14a9..4f5df43 100644 --- a/jmclient/jmclient/blockchaininterface.py +++ b/jmclient/jmclient/blockchaininterface.py @@ -437,9 +437,6 @@ class ElectrumWalletInterface(BlockchainInterface): #pragma: no cover def __init__(self, testnet=False): super(ElectrumWalletInterface, self).__init__() - if testnet: - raise NotImplementedError( - "Electrum doesnt yet have a testnet interface") self.last_sync_unspent = 0 def set_wallet(self, wallet): diff --git a/jmclient/jmclient/btc.py b/jmclient/jmclient/btc.py index 5694ced..a29b14a 100644 --- a/jmclient/jmclient/btc.py +++ b/jmclient/jmclient/btc.py @@ -135,11 +135,18 @@ except ImportError: def get_version_byte(inp): leadingzbytes = len(re.match('^1*', inp).group(0)) - data = b'\x00' * leadingzbytes + b58check_to_bin(inp) + data = b'\x00' * leadingzbytes + b58check_to_bin(inp, version=True) return ord(data[0]) - def b58check_to_bin(addr): - return ebt.DecodeBase58Check(addr)[1:] + def b58check_to_bin(addr, version=False): + """optionally include the version byte for get_version_byte. + Note that jmbitcoin does not need this flag, because it + uses the changebase() function, which here has been restricted. + """ + if not version: + return ebt.DecodeBase58Check(addr)[1:] + else: + return ebt.DecodeBase58Check(addr) def changebase(inp, frm=256, to=58): """Implementation of base58 (*not* b58check) conversion @@ -178,7 +185,8 @@ except ImportError: log.debug("Invalid script") return False t.inputs()[i]["address"] = addr - txforsig = etr.Hash(t.tx_for_sig(i).decode('hex')) + 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 @@ -303,8 +311,7 @@ except ImportError: compressed=False else: raise ValueError("Invalid private key") - sec = ebt.SecretToASecret(privkey, compressed=compressed, - addrtype=BTC_P2PK_VBYTE["mainnet"]) + sec = ebt.SecretToASecret(privkey, compressed=compressed) retval = ebt.public_key_from_private_key(sec) if usehex: @@ -327,11 +334,11 @@ except ImportError: def from_wif_privkey(privkey, vbyte=0): #converts a WIF compressed privkey to a hex private key - return binascii.hexlify(ebt.ASecretToSecret(privkey, addrtype=vbyte)) + return binascii.hexlify(ebt.ASecretToSecret(privkey)) def txhash(txhex): t = etr.Transaction(txhex) - return t.hash() + return t.txid() #A simple copy-paste for now; move into support.py perhaps? TODO def estimate_tx_size(ins, outs, txtype='p2pkh'):