second commit
This commit is contained in:
parent
bc1d07d669
commit
226e8c839d
63
pywallet.py
63
pywallet.py
@ -1,3 +1,5 @@
|
|||||||
|
#!/usr/bin/env python
|
||||||
|
#
|
||||||
# pywallet.py 1.0
|
# pywallet.py 1.0
|
||||||
#
|
#
|
||||||
# based on http://github.com/gavinandresen/bitcointools
|
# based on http://github.com/gavinandresen/bitcointools
|
||||||
@ -22,9 +24,7 @@ import socket
|
|||||||
import types
|
import types
|
||||||
import string
|
import string
|
||||||
import exceptions
|
import exceptions
|
||||||
import Crypto.Hash.SHA256 as SHA256
|
import hashlib
|
||||||
import Crypto.Hash.RIPEMD160 as RIPEMD160
|
|
||||||
from Crypto.PublicKey.pubkey import *
|
|
||||||
from ctypes import *
|
from ctypes import *
|
||||||
|
|
||||||
TESTNET = 0
|
TESTNET = 0
|
||||||
@ -130,8 +130,12 @@ def GetPubKey(pkey):
|
|||||||
return p.raw
|
return p.raw
|
||||||
|
|
||||||
def Hash(data):
|
def Hash(data):
|
||||||
h1 = SHA256.new(data).digest()
|
s1 = hashlib.sha256()
|
||||||
h2 = SHA256.new(h1).digest()
|
s1.update(data)
|
||||||
|
h1 = s1.digest()
|
||||||
|
s2 = hashlib.sha256()
|
||||||
|
s2.update(h1)
|
||||||
|
h2 = s2.digest()
|
||||||
return h2
|
return h2
|
||||||
|
|
||||||
def EncodeBase58Check(vchIn):
|
def EncodeBase58Check(vchIn):
|
||||||
@ -140,13 +144,14 @@ def EncodeBase58Check(vchIn):
|
|||||||
|
|
||||||
def DecodeBase58Check(psz):
|
def DecodeBase58Check(psz):
|
||||||
vchRet = b58decode(psz, None)
|
vchRet = b58decode(psz, None)
|
||||||
vch = vchRet[0:-4]
|
key = vchRet[0:-4]
|
||||||
chk = vchRet[-4:]
|
csum = vchRet[-4:]
|
||||||
hash = Hash(vch)[0:4]
|
hash = Hash(key)
|
||||||
if hash != chk:
|
cs32 = hash[0:4]
|
||||||
|
if cs32 != csum:
|
||||||
return None
|
return None
|
||||||
else:
|
else:
|
||||||
return vch
|
return key
|
||||||
|
|
||||||
def SecretToASecret(privkey):
|
def SecretToASecret(privkey):
|
||||||
vchSecret = privkey[9:9+32]
|
vchSecret = privkey[9:9+32]
|
||||||
@ -180,13 +185,8 @@ def importprivkey(db, key):
|
|||||||
print "Address: %s" % addr
|
print "Address: %s" % addr
|
||||||
print "Privkey: %s" % SecretToASecret(private_key)
|
print "Privkey: %s" % SecretToASecret(private_key)
|
||||||
|
|
||||||
type = 'key'
|
update_wallet(db, 'key', { 'public_key' : public_key, 'private_key' : private_key })
|
||||||
data = { 'public_key' : public_key, 'private_key' : private_key }
|
update_wallet(db, 'name', { 'hash' : addr, 'name' : '' })
|
||||||
update_wallet(db, type, data)
|
|
||||||
|
|
||||||
type = 'name'
|
|
||||||
data = { 'hash' : addr, 'name' : '' }
|
|
||||||
update_wallet(db, type, data)
|
|
||||||
|
|
||||||
return True
|
return True
|
||||||
|
|
||||||
@ -243,8 +243,12 @@ def b58decode(v, length):
|
|||||||
return result
|
return result
|
||||||
|
|
||||||
def hash_160(public_key):
|
def hash_160(public_key):
|
||||||
h1 = SHA256.new(public_key).digest()
|
s1 = hashlib.sha256()
|
||||||
h2 = RIPEMD160.new(h1).digest()
|
s1.update(public_key)
|
||||||
|
h1 = s1.digest()
|
||||||
|
s2 = hashlib.new('ripemd160')
|
||||||
|
s2.update(h1)
|
||||||
|
h2 = s2.digest()
|
||||||
return h2
|
return h2
|
||||||
|
|
||||||
def public_key_to_bc_address(public_key):
|
def public_key_to_bc_address(public_key):
|
||||||
@ -258,8 +262,8 @@ def hash_160_to_bc_address(h160):
|
|||||||
else:
|
else:
|
||||||
vh160 = "\x00" + h160 # \x00 is version 0
|
vh160 = "\x00" + h160 # \x00 is version 0
|
||||||
|
|
||||||
h3=SHA256.new(SHA256.new(vh160).digest()).digest()
|
h3 = Hash(vh160)
|
||||||
addr=vh160+h3[0:4]
|
addr = vh160 + h3[0:4]
|
||||||
return b58encode(addr)
|
return b58encode(addr)
|
||||||
|
|
||||||
def bc_address_to_hash_160(addr):
|
def bc_address_to_hash_160(addr):
|
||||||
@ -279,12 +283,19 @@ def create_env(db_dir=None):
|
|||||||
if db_dir is None:
|
if db_dir is None:
|
||||||
db_dir = determine_db_dir()
|
db_dir = determine_db_dir()
|
||||||
db_env = DBEnv(0)
|
db_env = DBEnv(0)
|
||||||
r = db_env.open(db_dir, (DB_CREATE|DB_INIT_LOCK|DB_INIT_LOG|DB_INIT_MPOOL| DB_INIT_TXN|DB_THREAD|DB_RECOVER))
|
r = db_env.open(db_dir, (DB_CREATE|DB_INIT_LOCK|DB_INIT_LOG|DB_INIT_MPOOL|DB_INIT_TXN|DB_THREAD|DB_RECOVER))
|
||||||
return db_env
|
return db_env
|
||||||
|
|
||||||
def parse_CAddress(vds):
|
def parse_CAddress(vds):
|
||||||
|
|
||||||
d = {}
|
d = {}
|
||||||
|
|
||||||
d['nVersion'] = vds.read_int32()
|
d['nVersion'] = vds.read_int32()
|
||||||
|
if d['nVersion'] > 32400:
|
||||||
|
d['ip'] = '0.0.0.0'
|
||||||
|
d['port'] = 0
|
||||||
|
return d
|
||||||
|
|
||||||
d['nTime'] = vds.read_uint32()
|
d['nTime'] = vds.read_uint32()
|
||||||
d['nServices'] = vds.read_uint64()
|
d['nServices'] = vds.read_uint64()
|
||||||
d['pchReserved'] = vds.read_bytes(12)
|
d['pchReserved'] = vds.read_bytes(12)
|
||||||
@ -293,7 +304,7 @@ def parse_CAddress(vds):
|
|||||||
return d
|
return d
|
||||||
|
|
||||||
def deserialize_CAddress(d):
|
def deserialize_CAddress(d):
|
||||||
return d['ip']+":"+str(d['port'])+" (lastseen: %s)"%(time.ctime(d['nTime']),)
|
return d['ip']+":"+str(d['port'])#+" (lastseen: %s)"%(time.ctime(d['nTime']),)
|
||||||
|
|
||||||
def parse_setting(setting, vds):
|
def parse_setting(setting, vds):
|
||||||
if setting[0] == "f": # flag (boolean) settings
|
if setting[0] == "f": # flag (boolean) settings
|
||||||
@ -450,7 +461,7 @@ def parse_wallet(db, item_callback):
|
|||||||
try:
|
try:
|
||||||
if type == "tx":
|
if type == "tx":
|
||||||
d["tx_id"] = kds.read_bytes(32)
|
d["tx_id"] = kds.read_bytes(32)
|
||||||
d.update(parse_WalletTx(vds))
|
#d.update(parse_WalletTx(vds))
|
||||||
elif type == "name":
|
elif type == "name":
|
||||||
d['hash'] = kds.read_string()
|
d['hash'] = kds.read_string()
|
||||||
d['name'] = vds.read_string()
|
d['name'] = vds.read_string()
|
||||||
@ -629,6 +640,10 @@ def read_wallet(json_db, db_env, print_wallet, print_wallet_transactions, transa
|
|||||||
elif type == "acentry":
|
elif type == "acentry":
|
||||||
json_db['acentry'] = (d['account'], d['nCreditDebit'], d['otherAccount'], time.ctime(d['nTime']), d['n'], d['comment'])
|
json_db['acentry'] = (d['account'], d['nCreditDebit'], d['otherAccount'], time.ctime(d['nTime']), d['n'], d['comment'])
|
||||||
|
|
||||||
|
else:
|
||||||
|
json_db[type] = 'unsupported'
|
||||||
|
|
||||||
|
|
||||||
parse_wallet(db, item_callback)
|
parse_wallet(db, item_callback)
|
||||||
|
|
||||||
db.close()
|
db.close()
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user