def sign_tx(self, pw): if not self.is_wallet_loaded: raise Exception('Tried to spend when wallet not loaded.') if not self.is_dest_addr_set: raise Exception('Tried to spend when destination address not set.') if not self.is_send_amount_set: raise Exception('Tried to spend when amount not set.') if self.send_amount + self.txfee > self.balance: raise LowBalanceError("Insufficient funds to send {0} + {1} BTC.".format(core.satoshi_to_btc(self.send_amount), core.satoshi_to_btc(self.txfee))) try: prv = wallet.decrypt_privkey(self.encr_privkey, pw) addr = bc.privtoaddr(prv, self.magic_byte) except: raise PasswordError("Wrong password!") if addr != self.addr: raise Exception('Address from wallet does not match address from private key!') tx_ins, tx_outs = core.simple_tx_inputs_outputs(self.addr, self.unspent, self.dest_addr, self.send_amount, self.txfee) # Make transaction tx = bc.mktx(tx_ins, tx_outs) # Sign transaction for i in range(len(tx_ins)): tx = bc.sign(tx,i,prv) return tx_ins, tx_outs, tx, bc.deserialize(tx)
def create_wallet(self, method, input, aes_pw): privkey = '' if method == 'wif': fmt = bc.get_privkey_format(input) if fmt == 'wif': privkey = bc.encode_privkey(input, 'hex') elif fmt == 'wif_compressed': privkey = bc.encode_privkey(input, 'hex_compressed') else: raise Exception('Unrecoginized format for private key.') elif method == 'random': privkey = bc.random_key() else: raise Exception('Unsupported method: {0}.'.format(method)) wal_addr = bc.privtoaddr(privkey, self.magic_byte) encr_privkey = wallet.encrypt_privkey(privkey, aes_pw) wallet.create_wallet_file(self.wallet_filename, encr_privkey, wal_addr) # Read back from wallet to ensure consistency encr_privkey2, wal_addr2 = wallet.read_from_wallet_file(self.wallet_filename) privkey2 = wallet.decrypt_privkey(encr_privkey2, aes_pw) if encr_privkey2 != encr_privkey or wal_addr2 != wal_addr: raise Exception('Inconsistency in reading from/writing to wallet!') if privkey2 != privkey: raise Exception('Inconsistency in encrypting/decrypting private key!') return
def do_init(config, username=None): if username is None: username = config.get('DEFAULT', 'username') config.set('DEFAULT', 'username', username) print "set username: {}".format(username) save_config(config) wif_filename = config.get('DEFAULT', 'key_file') if wif_filename.endswith(".wif"): addr_filename = wif_filename[0:-len(".wif")] + ".addr" else: addr_filename = wif_filename + ".addr" if not os.path.exists(wif_filename): try: if not os.path.exists(os.path.dirname(wif_filename)): os.makedirs(os.path.dirname(wif_filename)) privkey = pybitcointools.random_key() encoded = pybitcointools.encode_privkey(privkey, 'wif') addr = pybitcointools.privtoaddr(privkey) with open(wif_filename, "w") as wif_fd: print "writing file: {}".format(wif_filename) wif_fd.write(encoded) wif_fd.write("\n") with open(addr_filename, "w") as addr_fd: print "writing file: {}".format(addr_filename) addr_fd.write(addr) addr_fd.write("\n") except IOError, ioe: raise AcException("IOError: {}".format(str(ioe)))
def load_config(): home = os.path.expanduser("~") real_user = getpass.getuser() config_file = os.path.join(home, ".sawtooth", "libor.cfg") key_dir = os.path.join(home, ".sawtooth", "keys") config = ConfigParser.SafeConfigParser() config.set('DEFAULT', 'url', 'http://localhost:8800') config.set('DEFAULT', 'key_dir', key_dir) config.set('DEFAULT', 'key_file', '%(key_dir)s/%(username)s.wif') config.set('DEFAULT', 'username', real_user) # If we already have a config file, then read it. Otherwise, # we are going to write a default one. if os.path.exists(config_file): config.read(config_file) else: if not os.path.exists(os.path.dirname(config_file)): os.makedirs(os.path.dirname(config_file)) with open("{}.new".format(config_file), "w") as fd: config.write(fd) os.rename("{}.new".format(config_file), config_file) # If the key file does not already exist, then we are going # to generate one wif_filename = config.get('DEFAULT', 'key_file') if wif_filename.endswith(".wif"): addr_filename = wif_filename[0:-len(".wif")] + ".addr" else: addr_filename = wif_filename + ".addr" if not os.path.exists(wif_filename): try: if not os.path.exists(os.path.dirname(wif_filename)): os.makedirs(os.path.dirname(wif_filename)) private_key = pybitcointools.random_key() encoded_key = pybitcointools.encode_privkey(private_key, 'wif') addr = pybitcointools.privtoaddr(private_key) with open(wif_filename, "w") as wif_fd: wif_fd.write(encoded_key) wif_fd.write("\n") with open(addr_filename, "w") as addr_fd: addr_fd.write(addr) addr_fd.write("\n") except IOError as ioe: raise LIBORClientException("IOError: {}".format(str(ioe))) return config
def do_init(args, config): username = config.get('DEFAULT', 'username') if args.username is not None: if len(args.username) < 3 or len(args.username) > 16: raise ClientException( "username must be between 3 and 16 characters") username = args.username config.set('DEFAULT', 'username', username) print "set username: {}".format(username) else: print "Username: {}".format(username) http_url = config.get('DEFAULT', 'url') if args.url is not None: http_url = args.url config.set('DEFAULT', 'url', http_url) print "set url to {}".format(http_url) else: print "Validator url: {}".format(http_url) save_config(config) wif_filename = config.get('DEFAULT', 'key_file') if wif_filename.endswith(".wif"): addr_filename = wif_filename[0:-len(".wif")] + ".addr" else: addr_filename = wif_filename + ".addr" if not os.path.exists(wif_filename): try: if not os.path.exists(os.path.dirname(wif_filename)): os.makedirs(os.path.dirname(wif_filename)) privkey = pybitcointools.random_key() encoded = pybitcointools.encode_privkey(privkey, 'wif') addr = pybitcointools.privtoaddr(privkey) with open(wif_filename, "w") as wif_fd: print "writing file: {}".format(wif_filename) wif_fd.write(encoded) wif_fd.write("\n") with open(addr_filename, "w") as addr_fd: print "writing file: {}".format(addr_filename) addr_fd.write(addr) addr_fd.write("\n") except IOError, ioe: raise ClientException("IOError: {}".format(str(ioe)))
def find_or_create_test_key(key_base_name, key_dir=None, quiet=True): ''' Interface to sawtooth cli: creates .wif key file if it does not exist, and returns a tupple containing all pertinent information. Useful for testing. Args: key_base_name: (str) key_dir: (str) Returns: (tupple) key_file: (str) private_key: (str) public_key: (str) ''' use_key_dir = key_dir is not None and not os.path.isabs(key_base_name) key_file = key_base_name if not key_file.endswith('.wif'): key_file += '.wif' if use_key_dir: key_file = os.path.join(key_dir, key_file) if not os.path.isfile(key_file): if key_base_name.endswith('.wif'): key_base_name = ''.join(key_base_name.split('.')[:-1]) cmd = 'keygen %s' % key_base_name if use_key_dir: cmd += ' --key-dir %s' % key_dir if quiet is True: cmd += ' -q' sawtooth_cli_intercept(cmd) assert os.path.exists(key_file) with open(key_file, 'r') as f: key_str = f.read() signing_key = key_str.split('\n')[0] identifier = pybitcointools.privtoaddr(signing_key) addr_file = '.'.join(key_file.split('.')[:-1]) + '.addr' if not os.path.exists(addr_file): with open(addr_file, 'w') as f: f.write('{}\n'.format(identifier)) return key_file, signing_key, identifier
def do_init(args, config): username = config.get('DEFAULT', 'username') if args.username is not None: username = args.username config.set('DEFAULT', 'username', username) print "set username: {}".format(username) save_config(config) wif_filename = config.get('DEFAULT', 'key_file') if wif_filename.endswith(".wif"): addr_filename = wif_filename[0:-len(".wif")] + ".addr" else: addr_filename = wif_filename + ".addr" if not os.path.exists(wif_filename): try: if not os.path.exists(os.path.dirname(wif_filename)): os.makedirs(os.path.dirname(wif_filename)) privkey = pybitcointools.random_key() encoded = pybitcointools.encode_privkey(privkey, 'wif') addr = pybitcointools.privtoaddr(privkey) with open(wif_filename, "w") as wif_fd: print "writing file: {}".format(wif_filename) wif_fd.write(encoded) wif_fd.write("\n") with open(addr_filename, "w") as addr_fd: print "writing file: {}".format(addr_filename) addr_fd.write(addr) addr_fd.write("\n") except IOError, ioe: raise XoException("IOError: {}".format(str(ioe)))
def find_or_create_test_key(key_base_name, key_dir=None, quiet=True): ''' Interface to sawtooth cli: creates .wif key file if it does not exist, and returns a tupple containing all pertinent information. Useful for testing. Args: key_base_name: (str) key_dir: (str) Returns: (tupple) key_file: (str) private_key: (str) public_key: (str) ''' use_key_dir = key_dir is not None and not os.path.isabs(key_base_name) key_file = key_base_name if not key_file.endswith('.wif'): key_file += '.wif' if use_key_dir: key_file = os.path.join(key_dir, key_file) if not os.path.isfile(key_file): if key_base_name.endswith('.wif'): key_base_name = ''.join(key_base_name.split('.')[:-1]) cmd = 'keygen %s' % key_base_name if use_key_dir: cmd += ' --key-dir %s' % key_dir if quiet is True: cmd += ' -q' sawtooth_cli_intercept(cmd) assert os.path.exists(key_file) addr_file = '.'.join(key_file.split('.')[:-1]) + '.addr' assert os.path.exists(addr_file) key_str = None with open(key_file, 'r') as f: key_str = f.read() signing_key = key_str.split('\n')[0] identifier = pybitcointools.privtoaddr(signing_key) return (key_file, signing_key, identifier)
wif_filename = os.path.join(key_dir, key_name + '.wif') addr_filename = os.path.join(key_dir, key_name + '.addr') if not args.force: file_exists = False for filename in [wif_filename, addr_filename]: if os.path.exists(filename): file_exists = True print >>sys.stderr, 'file exists: {}'.format(filename) if file_exists: raise ClientException( 'files exist, rerun with --force to overwrite existing files') privkey = pybitcointools.random_key() encoded = pybitcointools.encode_privkey(privkey, 'wif') addr = pybitcointools.privtoaddr(privkey) try: wif_exists = os.path.exists(wif_filename) with open(wif_filename, 'w') as wif_fd: if not args.quiet: if wif_exists: print 'overwriting file: {}'.format(wif_filename) else: print 'writing file: {}'.format(wif_filename) wif_fd.write(encoded) wif_fd.write('\n') addr_exists = os.path.exists(addr_filename) with open(addr_filename, 'w') as addr_fd: if not args.quiet:
def __init__(self): self.SigningKey = pybitcointools.random_key() self.Address = pybitcointools.privtoaddr(self.SigningKey)
wif_filename = os.path.join(key_dir, key_name + '.wif') addr_filename = os.path.join(key_dir, key_name + '.addr') if not args.force: file_exists = False for filename in [wif_filename, addr_filename]: if os.path.exists(filename): file_exists = True print >> sys.stderr, 'file exists: {}'.format(filename) if file_exists: raise ClientException( 'files exist, rerun with --force to overwrite existing files') privkey = pybitcointools.random_key() encoded = pybitcointools.encode_privkey(privkey, 'wif') addr = pybitcointools.privtoaddr(privkey) try: wif_exists = os.path.exists(wif_filename) with open(wif_filename, 'w') as wif_fd: if not args.quiet: if wif_exists: print 'overwriting file: {}'.format(wif_filename) else: print 'writing file: {}'.format(wif_filename) wif_fd.write(encoded) wif_fd.write('\n') addr_exists = os.path.exists(addr_filename) with open(addr_filename, 'w') as addr_fd: if not args.quiet:
def get_address_from_private_key_wif(key): return pybitcointools.privtoaddr(pybitcointools.decode_privkey(key, 'wif'))
def main(args=sys.argv[1:]): parser = argparse.ArgumentParser() # The intent is that node_name and keydir both be optional at some # future point, by reading in the appropriate values from the config # file. Therefore, no default is currently set and both are marked # as required so that the future usage of using config values as # defaults can be added without breaking anything. parser.add_argument('node_name', help="name of the node") parser.add_argument('--keydir', help="directory to write key files", required=True) parser.add_argument('-f', '--force', help="overwrite files if they exist", action='store_true') parser.add_argument('-q', '--quiet', help="print no output", action='store_true') options = parser.parse_args(args) base_filename = os.path.join(options.keydir, options.node_name) wif_filename = base_filename + ".wif" addr_filename = base_filename + ".addr" if not os.path.isdir(options.keydir): print >> sys.stderr, "no such directory: {}".format(options.keydir) sys.exit(1) if not options.force: file_exists = False for filename in [wif_filename, addr_filename]: if os.path.exists(filename): file_exists = True print >> sys.stderr, "file exists: {}".format(filename) if file_exists: print >> sys.stderr, \ "rerun with --force to overwrite existing files" sys.exit(1) privkey = pybitcointools.random_key() encoded = pybitcointools.encode_privkey(privkey, 'wif') addr = pybitcointools.privtoaddr(privkey) try: wif_exists = os.path.exists(wif_filename) with open(wif_filename, "w") as wif_fd: if not options.quiet: if wif_exists: print "overwriting file: {}".format(wif_filename) else: print "writing file: {}".format(wif_filename) wif_fd.write(encoded) wif_fd.write("\n") addr_exists = os.path.exists(addr_filename) with open(addr_filename, "w") as addr_fd: if not options.quiet: if addr_exists: print "overwriting file: {}".format(addr_filename) else: print "writing file: {}".format(addr_filename) addr_fd.write(addr) addr_fd.write("\n") except IOError, ioe: print >> sys.stderr, "IOError: {}".format(str(ioe)) sys.exit(1)
import pybitcointools import sys if __name__ == "__main__": if len(sys.argv) >= 2: priv_key = sys.argv[ 1] #"LmB72UZvRmJ5cUPZWpxqYWW5KkCgASa53GZQNhWNTPzJ9J1R4T8x" priv_data = pybitcointools.decode_privkey(priv_key) print(pybitcointools.encode_privkey(priv_data, "wif_compressed")) print(pybitcointools.privtoaddr(priv_key)) else: print("Usage: %s [private_key]" % sys.argv[0])