diff --git a/pywallet.py b/pywallet.py index 17086f8..7da53f3 100755 --- a/pywallet.py +++ b/pywallet.py @@ -1086,12 +1086,12 @@ def hash_160(public_key): md.update(hashlib.sha256(public_key).digest()) return md.digest() -def public_key_to_bc_address(public_key): +def public_key_to_bc_address(public_key, v=addrtype): h160 = hash_160(public_key) - return hash_160_to_bc_address(h160) + return hash_160_to_bc_address(h160, v) -def hash_160_to_bc_address(h160): - vh160 = chr(addrtype) + h160 +def hash_160_to_bc_address(h160, v=addrtype): + vh160 = chr(v) + h160 h = Hash(vh160) addr = vh160 + h[0:4] return b58encode(addr) @@ -1766,37 +1766,44 @@ def parse_wallet(db, item_callback): print("value data in hex: %s"%value.encode('hex_codec')) sys.exit(1) -def delete_from_wallet(db_env, walletfile, typedel, keydel): +def delete_from_wallet(db_env, walletfile, typedel, kd): db = open_wallet(db_env, walletfile, True) kds = BCDataStream() vds = BCDataStream() deleted_items = 0 - for (key, value) in db.items(): - kds.clear(); kds.write(key) - vds.clear(); vds.write(value) - type = kds.read_string() - if typedel == "tx": - if type == "tx": - if keydel == inversetxid(kds.read_bytes(32).encode('hex_codec')) or keydel == "all": - db.delete(key) - deleted_items+=1 - elif typedel == "key": - if type == "key" or type == "ckey": - if keydel == public_key_to_bc_address(kds.read_bytes(kds.read_compact_size())): - db.delete(key) - deleted_items+=1 - elif type == "pool": - vds.read_int32() - vds.read_int64() - if keydel == public_key_to_bc_address(vds.read_bytes(vds.read_compact_size())): - db.delete(key) - deleted_items+=1 - elif type == "name": - if keydel == kds.read_string(): - db.delete(key) - deleted_items+=1 + if not isinstance(kd, list): + kd=[kd] + print kd + + for i in range(len(kd)): + keydel=kd[i] + for (key, value) in db.items(): + kds.clear(); kds.write(key) + vds.clear(); vds.write(value) + type = kds.read_string() + + if typedel == "tx": + if type == "tx": + if keydel == inversetxid(kds.read_bytes(32).encode('hex_codec')) or keydel == "all": + db.delete(key) + deleted_items+=1 + elif typedel == "key": + if type == "key" or type == "ckey": + if keydel == public_key_to_bc_address(kds.read_bytes(kds.read_compact_size())): + db.delete(key) + deleted_items+=1 + elif type == "pool": + vds.read_int32() + vds.read_int64() + if keydel == public_key_to_bc_address(vds.read_bytes(vds.read_compact_size())): + db.delete(key) + deleted_items+=1 + elif type == "name": + if keydel == kds.read_string(): + db.delete(key) + deleted_items+=1 db.close() @@ -2182,10 +2189,10 @@ def read_wallet(json_db, db_env, walletfile, print_wallet, print_wallet_transact crypted = 'salt' in json_db['mkey'] if not crypted: - print "The wallet is not crypted" + print "The wallet is not encrypted" if crypted and not passphrase: - print "The wallet is crypted but no passphrase is used" + print "The wallet is encrypted but no passphrase is used" if crypted and passphrase: check = True @@ -2196,14 +2203,14 @@ def read_wallet(json_db, db_env, walletfile, print_wallet, print_wallet_transact public_key = k['pubkey'].decode('hex') crypter.SetIV(Hash(public_key)) secret = crypter.Decrypt(ckey) - compressed = public_key[0] != '\x04' + compressed = public_key[0] != '\04' if check: check = False pkey = EC_KEY(int('0x' + secret.encode('hex'), 16)) if public_key != GetPubKey(pkey, compressed): - print "The wallet is crypted and the passphrase is incorrect" + print "The wallet is encrypted and the passphrase is incorrect" ppcorrect=False break @@ -2218,7 +2225,7 @@ def read_wallet(json_db, db_env, walletfile, print_wallet, print_wallet_transact # del(k['pubkey']) private_keys.append(sec) if ppcorrect: - print "The wallet is crypted and the passphrase is correct" + print "The wallet is encrypted and the passphrase is correct" for k in json_db['keys']: if k['compressed'] and 'secret' in k: @@ -2233,7 +2240,7 @@ def read_wallet(json_db, db_env, walletfile, print_wallet, print_wallet_transact -def importprivkey(db, sec, label, reserve, keyishex, verbose=True): +def importprivkey(db, sec, label, reserve, keyishex, verbose=True, addrv=addrtype): if keyishex is None: pkey = regenerate_key(sec) compressed = is_compressed(sec) @@ -2253,14 +2260,14 @@ def importprivkey(db, sec, label, reserve, keyishex, verbose=True): secret = GetSecret(pkey) private_key = GetPrivKey(pkey, compressed) public_key = GetPubKey(pkey, compressed) - addr = public_key_to_bc_address(public_key) + addr = public_key_to_bc_address(public_key, addrv) if verbose: - print "Address (%s): %s"%(aversions[addrtype], addr) - print "Privkey (%s): %s"%(aversions[addrtype], SecretToASecret(secret, compressed)) + print "Address (%s): %s"%(aversions[addrv], addr) + print "Privkey (%s): %s"%(aversions[addrv], SecretToASecret(secret, compressed)) print "Hexprivkey: %s"%(secret.encode('hex')) print "Hash160: %s"%(bc_address_to_hash_160(addr).encode('hex')) - if compressed: + if not compressed: print "Pubkey: 04%.64x%.64x"%(pkey.pubkey.point.x(), pkey.pubkey.point.y()) else: print "Pubkey: 0%d%.64x"%(2+(pkey.pubkey.point.y()&1), pkey.pubkey.point.x()) @@ -2944,14 +2951,18 @@ def import_csv_keys(filename, wdir, wname, nbremax=9999999): c=content[i] global_merging_message = ["Merging: "+str(round(100.0*(i+1)/len(content),1))+"%" for j in range(2)] if ';' in c and len(c)>0 and c[0]!="#": - sec,label=c.split(';') + cs=c.split(';') + sec,label=cs[0:2] + v=addrtype + if len(cs)>2: + v=int(cs[2]) reserve=False if label=="#Reserve": reserve=True - keyishex=False + keyishex=None if abs(len(sec)-65)==1: keyishex=True - importprivkey(db, sec, label, reserve, keyishex, verbose=False) + importprivkey(db, sec, label, reserve, keyishex, verbose=False, addrv=v) global_merging_message = ["Merging done.", ""] @@ -3120,12 +3131,12 @@ if 'twisted' not in missing_dep: WI_ReturnDiv('ImportRODiv') + \ WI_FormEnd() - DeleteForm = WI_FormInit('Delete a key from your wallet:', 'Delete', 'divformdelete') + \ + DeleteForm = WI_FormInit('Delete keys from your wallet:', 'Delete', 'divformdelete') + \ WI_InputText('Wallet Directory: ', 'dir', 'd-dir', determine_db_dir(), 40) + \ WI_InputText('Wallet Filename:', 'name', 'd-name', determine_db_name()) + \ - WI_InputText('Key:', 'key', 'd-key', '', 65) + \ + WI_InputText('Keys:', 'key', 'd-key', '', 65) + \ "Type:
" + \ - WI_RadioButton('d-type', 'tx', 'd-r-tx', 'CHECKED', ' Transaction (type "all" in "Key" to delete them all)') + \ + WI_RadioButton('d-type', 'tx', 'd-r-tx', 'CHECKED', ' Transaction (type "all" in "Keys" to delete them all)') + \ WI_RadioButton('d-type', 'key', 'd-r-key', '', ' Bitcoin address') + \ WI_Submit('Delete', 'DeleteDiv', 'd-close', 'ajaxDelete') + \ WI_CloseButton('DeleteDiv', 'd-close') + \ @@ -3397,7 +3408,7 @@ To support pywallet's development or if you think it's worth something, you can if not os.path.isfile(wdir+"/"+wname): return '%s/%s doesn\'t exist'%(wdir, wname) - deleted_items = delete_from_wallet(db_env, wname, typedel, keydel) + deleted_items = delete_from_wallet(db_env, wname, typedel, keydel.split('-')) return "%s:%s has been successfully deleted from %s/%s, resulting in %d deleted item%s"%(typedel, keydel, wdir, wname, deleted_items, iais(deleted_items))