示例#1
0
    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)
示例#2
0
    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
示例#3
0
文件: run.py 项目: Need4Speak/saw
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)))
示例#4
0
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
示例#5
0
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)))
示例#6
0
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
示例#7
0
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)))
示例#8
0
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)
示例#9
0
    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)
 def __init__(self):
     self.SigningKey = pybitcointools.random_key()
     self.Address = pybitcointools.privtoaddr(self.SigningKey)
示例#12
0
    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:
示例#13
0
def get_address_from_private_key_wif(key):
    return pybitcointools.privtoaddr(pybitcointools.decode_privkey(key, 'wif'))
示例#14
0
def get_address_from_private_key_wif(key):
    return pybitcointools.privtoaddr(pybitcointools.decode_privkey(key, 'wif'))
示例#15
0
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)
示例#16
0
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])