diff --git a/pybitcoin/__init__.py b/pybitcoin/__init__.py index 4a9c2d4..94f1055 100644 --- a/pybitcoin/__init__.py +++ b/pybitcoin/__init__.py @@ -7,13 +7,8 @@ :license: MIT, see LICENSE for more details. """ -import services from .services import * - -import transactions from .transactions import * - -import passphrases from .passphrases import create_passphrase from .passphrases.legacy import ( random_160bit_passphrase, random_256bit_passphrase diff --git a/pybitcoin/formatcheck.py b/pybitcoin/formatcheck.py index dc3ca0a..fc0d5a1 100644 --- a/pybitcoin/formatcheck.py +++ b/pybitcoin/formatcheck.py @@ -10,6 +10,7 @@ import os import re import random +import sys import binascii from utilitybelt import is_int, is_hex @@ -17,7 +18,11 @@ def is_secret_exponent(val, curve_order): - return (isinstance(val, (int, long)) and val >= 1 and val < curve_order) + number_types = [int] + if sys.version_info.major < 3: + number_types.append(long) + + return (isinstance(val, tuple(number_types)) and val >= 1 and val < curve_order) def is_256bit_hex_string(val): diff --git a/pybitcoin/rpc/namecoind_client.py b/pybitcoin/rpc/namecoind_client.py index 2919fa1..9caad84 100644 --- a/pybitcoin/rpc/namecoind_client.py +++ b/pybitcoin/rpc/namecoind_client.py @@ -16,38 +16,42 @@ from .config import NAMECOIND_USE_HTTPS, VALUE_MAX_LIMIT import ssl -import httplib -create_ssl_authproxy = False +try: + from httplib import HTTPSConnection +except ImportError: + from http.client import HTTPSConnection + +create_ssl_authproxy = False do_wrap_socket = False if hasattr( ssl, "_create_unverified_context" ): #opt-out for verifying self-signed certificates (typically used in namecoin/bitcoind) ssl._create_default_https_context = ssl._create_unverified_context - create_ssl_authproxy = True + create_ssl_authproxy = True if not hasattr( ssl, "create_default_context" ): create_ssl_authproxy = False do_wrap_socket = True -class NamecoindConnection( httplib.HTTPSConnection ): +class NamecoindConnection(HTTPSConnection): """ Wrapped SSL connection, if we can't use SSLContext. """ def __init__(self, host, port, timeout=None ): - - httplib.HTTPSConnection.__init__(self, host, port ) + + HTTPSConnection.__init__(self, host, port ) self.timeout = timeout - + def connect( self ): - + sock = socket.create_connection((self.host, self.port), self.timeout) if self._tunnel_host: self.sock = sock self._tunnel() - + self.sock = ssl.wrap_socket( sock, cert_reqs=ssl.CERT_NONE ) @@ -59,7 +63,7 @@ def __init__(self, server=NAMECOIND_SERVER, port=NAMECOIND_PORT, passphrase=NAMECOIND_WALLET_PASSPHRASE): global create_ssl_authproxy, do_wrap_socket - + if use_https: http_string = 'https://' else: @@ -69,23 +73,23 @@ def __init__(self, server=NAMECOIND_SERVER, port=NAMECOIND_PORT, self.passphrase = passphrase self.server = server - + if do_wrap_socket: # ssl._create_unverified_context and ssl.create_default_context are not supported. - # wrap the socket directly + # wrap the socket directly connection = NamecoindConnection( server, int(port) ) self.obj = AuthServiceProxy(authproxy_config_uri, connection=connection) - + elif create_ssl_authproxy: - # ssl has _create_unverified_context, so we're good to go + # ssl has _create_unverified_context, so we're good to go self.obj = AuthServiceProxy(authproxy_config_uri) - + else: - # have to set up an unverified context ourselves + # have to set up an unverified context ourselves ssl_ctx = ssl.create_default_context() ssl_ctx.check_hostname = False ssl_ctx.verify_mode = ssl.CERT_NONE - connection = httplib.HTTPSConnection( server, int(port), context=ssl_ctx ) + connection = HTTPSConnection( server, int(port), context=ssl_ctx ) self.obj = AuthServiceProxy(authproxy_config_uri, connection=connection) diff --git a/pybitcoin/services/__init__.py b/pybitcoin/services/__init__.py index c23214e..cb0d6aa 100644 --- a/pybitcoin/services/__init__.py +++ b/pybitcoin/services/__init__.py @@ -8,12 +8,7 @@ """ from .blockchain_client import BlockchainClient -from blockcypher import BlockcypherClient -from blockchain_info import BlockchainInfoClient -from chain_com import ChainComClient -from bitcoind import BitcoindClient, create_bitcoind_service_proxy - -import blockcypher -import blockchain_info -import chain_com -import bitcoind +from .blockcypher import BlockcypherClient +from .blockchain_info import BlockchainInfoClient +from .chain_com import ChainComClient +from .bitcoind import BitcoindClient, create_bitcoind_service_proxy diff --git a/pybitcoin/services/bitcoind.py b/pybitcoin/services/bitcoind.py index 8d86d9b..12bb3b6 100644 --- a/pybitcoin/services/bitcoind.py +++ b/pybitcoin/services/bitcoind.py @@ -7,7 +7,10 @@ :license: MIT, see LICENSE for more details. """ -import httplib +try: + from httplib import BadStatusLine +except ImportError: + from http.client import BadStatusLine from bitcoinrpc.authproxy import AuthServiceProxy @@ -89,7 +92,7 @@ def broadcast_transaction(hex_tx, blockchain_client): try: resp = bitcoind.sendrawtransaction(hex_tx) - except httplib.BadStatusLine: + except BadStatusLine: raise Exception('Invalid HTTP status code from bitcoind.') if len(resp) > 0: diff --git a/pybitcoin/services/blockchain_info.py b/pybitcoin/services/blockchain_info.py index c99b149..cb29f8f 100644 --- a/pybitcoin/services/blockchain_info.py +++ b/pybitcoin/services/blockchain_info.py @@ -49,9 +49,9 @@ def get_unspents(address, blockchain_client=BlockchainInfoClient()): r = requests.get(url, auth=auth) try: unspents = r.json()["unspent_outputs"] - except ValueError, e: + except ValueError as e: raise Exception('Invalid response from blockchain.info.') - + return format_unspents(unspents) def broadcast_transaction(hex_tx, blockchain_client=BlockchainInfoClient()): @@ -60,10 +60,8 @@ def broadcast_transaction(hex_tx, blockchain_client=BlockchainInfoClient()): url = BLOCKCHAIN_API_BASE_URL + '/pushtx' payload = {'tx': hex_tx} r = requests.post(url, data=payload, auth=blockchain_client.auth) - + if 'submitted' in r.text.lower(): return {'success': True} else: raise Exception('Invalid response from blockchain.info.') - - diff --git a/pybitcoin/services/chain_com.py b/pybitcoin/services/chain_com.py index 9690319..17ac6ad 100644 --- a/pybitcoin/services/chain_com.py +++ b/pybitcoin/services/chain_com.py @@ -51,9 +51,9 @@ def get_unspents(address, blockchain_client=ChainComClient()): try: unspents = r.json() - except ValueError, e: + except ValueError as e: raise Exception('Received non-JSON response from chain.com.') - + return format_unspents(unspents) def broadcast_transaction(hex_tx, blockchain_client): @@ -72,7 +72,7 @@ def broadcast_transaction(hex_tx, blockchain_client): try: data = r.json() - except ValueError, e: + except ValueError as e: raise Exception('Received non-JSON from chain.com.') if 'transaction_hash' in data: @@ -82,4 +82,3 @@ def broadcast_transaction(hex_tx, blockchain_client): return reply else: raise Exception('Tx hash missing from chain.com response: ' + str(data) + '\noriginal: ' + str(payload)) - diff --git a/pybitcoin/transactions/__init__.py b/pybitcoin/transactions/__init__.py index f402ec2..aa01d8f 100644 --- a/pybitcoin/transactions/__init__.py +++ b/pybitcoin/transactions/__init__.py @@ -7,8 +7,6 @@ :license: MIT, see LICENSE for more details. """ -import opcodes - from .network import broadcast_transaction, send_to_address, get_unspents, \ embed_data_in_blockchain, make_send_to_address_tx, make_op_return_tx, \ analyze_private_key, serialize_sign_and_broadcast, \ diff --git a/pybitcoin/transactions/utils.py b/pybitcoin/transactions/utils.py index 1164355..bcf9543 100644 --- a/pybitcoin/transactions/utils.py +++ b/pybitcoin/transactions/utils.py @@ -8,6 +8,7 @@ """ import struct +import sys from binascii import hexlify, unhexlify from utilitybelt import is_hex @@ -26,7 +27,11 @@ def variable_length_int(i): """ Encodes integers into variable length integers, which are used in Bitcoin in order to save space. """ - if not isinstance(i, (int,long)): + number_types = [int] + if sys.version_info.major < 3: + number_types.append(long) + + if not isinstance(i, tuple(number_types)): raise Exception('i must be an integer') if i < (2**8-3): @@ -38,4 +43,4 @@ def variable_length_int(i): elif i < (2**64): return chr(255) + struct.pack('