Add tx importing
This commit is contained in:
parent
681123f85b
commit
bdd8bff10c
88
pywallet.py
88
pywallet.py
@ -571,7 +571,8 @@ def open_wallet(db_env, walletfile, writable=False):
|
|||||||
def inversetxid(txid):
|
def inversetxid(txid):
|
||||||
if len(txid) is not 64:
|
if len(txid) is not 64:
|
||||||
print("Bad txid")
|
print("Bad txid")
|
||||||
exit(0)
|
return "CORRUPTEDTXID:"+txid
|
||||||
|
# exit(0)
|
||||||
new_txid = ""
|
new_txid = ""
|
||||||
for i in range(32):
|
for i in range(32):
|
||||||
new_txid += txid[62-2*i];
|
new_txid += txid[62-2*i];
|
||||||
@ -625,7 +626,9 @@ def parse_wallet(db, item_callback):
|
|||||||
for i in xrange(n_vout):
|
for i in xrange(n_vout):
|
||||||
d['txOut'].append(parse_TxOut(vds))
|
d['txOut'].append(parse_TxOut(vds))
|
||||||
d['lockTime'] = vds.read_uint32()
|
d['lockTime'] = vds.read_uint32()
|
||||||
d['tx'] = vds.input[start:vds.read_cursor]
|
d['tx'] = vds.input[start:vds.read_cursor].encode('hex_codec')
|
||||||
|
d['txv'] = value.encode('hex_codec')
|
||||||
|
d['txk'] = key.encode('hex_codec')
|
||||||
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()
|
||||||
@ -729,8 +732,9 @@ def update_wallet(db, type, data):
|
|||||||
|
|
||||||
try:
|
try:
|
||||||
if type == "tx":
|
if type == "tx":
|
||||||
raise NotImplementedError("Writing items of type 'tx'")
|
# raise NotImplementedError("Writing items of type 'tx'")
|
||||||
kds.write(d['tx_id'])
|
kds.write(d['txi'][6:].decode('hex_codec'))
|
||||||
|
vds.write(d['txv'].decode('hex_codec'))
|
||||||
elif type == "name":
|
elif type == "name":
|
||||||
kds.write_string(d['hash'])
|
kds.write_string(d['hash'])
|
||||||
vds.write_string(d['name'])
|
vds.write_string(d['name'])
|
||||||
@ -815,7 +819,7 @@ def read_wallet(json_db, db_env, walletfile, print_wallet, print_wallet_transact
|
|||||||
|
|
||||||
def item_callback(type, d):
|
def item_callback(type, d):
|
||||||
if type == "tx":
|
if type == "tx":
|
||||||
json_db['tx'].append({"txid" : d['tx_id'], "txin" : d['txIn'], "txout" : d['txOut']})
|
json_db['tx'].append({"tx_id" : d['tx_id'], "txin" : d['txIn'], "txout" : d['txOut'], "tx_v" : d['txv'], "tx_k" : d['txk']})
|
||||||
|
|
||||||
elif type == "name":
|
elif type == "name":
|
||||||
json_db['names'][d['hash']] = d['name']
|
json_db['names'][d['hash']] = d['name']
|
||||||
@ -966,7 +970,7 @@ class WIRoot(resource.Resource):
|
|||||||
<div id="InfoDiv" style="display:none;margin:10px 3% 10px;padding:10px;overflow:auto;width:50%;max-height:300px;background-color:#fff8dd;"></div>\
|
<div id="InfoDiv" style="display:none;margin:10px 3% 10px;padding:10px;overflow:auto;width:50%;max-height:300px;background-color:#fff8dd;"></div>\
|
||||||
</form><br />'
|
</form><br />'
|
||||||
|
|
||||||
ImportForm = '<h3>Import a key in your wallet:</h3><form style="margin-left:15px;" action="Import" method=get>\
|
ImportForm = '<h3>Import a key into your wallet:</h3><form style="margin-left:15px;" action="Import" method=get>\
|
||||||
Wallet Directory: <input type=text name="dir" id="impf-dir" size=40 value="' + determine_db_dir() + '" /><br />\
|
Wallet Directory: <input type=text name="dir" id="impf-dir" size=40 value="' + determine_db_dir() + '" /><br />\
|
||||||
Wallet Filename: <input type=text name="name" id="impf-name" value="wallet.dat" /><br />\
|
Wallet Filename: <input type=text name="name" id="impf-name" value="wallet.dat" /><br />\
|
||||||
Key: <input type=text name="key" id="impf-key" size=65 /><br />\
|
Key: <input type=text name="key" id="impf-key" size=65 /><br />\
|
||||||
@ -993,6 +997,16 @@ class WIRoot(resource.Resource):
|
|||||||
<div id="DeleteDiv" style="display:none;margin:10px 3% 10px;padding:10px;overflow:auto;width:50%;max-height:300px;background-color:#fff8dd;"></div>\
|
<div id="DeleteDiv" style="display:none;margin:10px 3% 10px;padding:10px;overflow:auto;width:50%;max-height:300px;background-color:#fff8dd;"></div>\
|
||||||
</form><br />'
|
</form><br />'
|
||||||
|
|
||||||
|
ImportTxForm = '<h3>Import a transaction into your wallet:</h3><form style="margin-left:15px;" action="ImportTx" method=get>\
|
||||||
|
Wallet Directory: <input type=text name="dir" id="it-dir" size=40 value="' + determine_db_dir() + '" /><br />\
|
||||||
|
Wallet Filename: <input type=text name="name" id="it-name" value="wallet.dat" /><br />\
|
||||||
|
Txk: <input type=text name="txk" id="it-txk" size=65 /><br />\
|
||||||
|
Txv: <input type=text name="txv" id="it-txv" size=65 /><br />\
|
||||||
|
<input type=submit value="Import" onClick="document.getElementById(\'ImportTxDiv\').style.display=\'block\';document.getElementById(\'it-close\').style.display=\'inline\';ajaxImportTx();return false;" />\
|
||||||
|
<input type=button value="Close" onClick="document.getElementById(\'ImportTxDiv\').style.display=\'none\';document.getElementById(\'it-close\').style.display=\'none\';" id="it-close" style="display:none;" />\
|
||||||
|
<div id="ImportTxDiv" style="display:none;margin:10px 3% 10px;padding:10px;overflow:auto;width:50%;max-height:300px;background-color:#fff8dd;"></div>\
|
||||||
|
</form><br />'
|
||||||
|
|
||||||
BalanceForm = '<h3>Print the balance of a Bitcoin address:</h3><form style="margin-left:15px;" action="Balance" method=get>\
|
BalanceForm = '<h3>Print the balance of a Bitcoin address:</h3><form style="margin-left:15px;" action="Balance" method=get>\
|
||||||
Key: <input type=text name="key" id="bf-key" size=35 /><br />\
|
Key: <input type=text name="key" id="bf-key" size=35 /><br />\
|
||||||
<input type=submit value="Get balance" onClick="ajaxBalance();return false;" /><br /><br />\
|
<input type=submit value="Get balance" onClick="ajaxBalance();return false;" /><br /><br />\
|
||||||
@ -1141,9 +1155,35 @@ class WIRoot(resource.Resource):
|
|||||||
document.getElementById("DeleteDiv").innerHTML = "Loading...";\
|
document.getElementById("DeleteDiv").innerHTML = "Loading...";\
|
||||||
ajaxRequest.send(null);\
|
ajaxRequest.send(null);\
|
||||||
}\
|
}\
|
||||||
|
function ajaxImportTx(){\
|
||||||
|
var ajaxRequest;\
|
||||||
|
try{\
|
||||||
|
ajaxRequest = new XMLHttpRequest();\
|
||||||
|
} catch (e){\
|
||||||
|
try{\
|
||||||
|
ajaxRequest = new ActiveXObject("Msxml2.XMLHTTP");\
|
||||||
|
} catch (e) {\
|
||||||
|
try{\
|
||||||
|
ajaxRequest = new ActiveXObject("Microsoft.XMLHTTP");\
|
||||||
|
} catch (e){\
|
||||||
|
alert("Your browser broke!");\
|
||||||
|
return false;\
|
||||||
|
}\
|
||||||
|
}\
|
||||||
|
}\
|
||||||
|
ajaxRequest.onreadystatechange = function(){\
|
||||||
|
if(ajaxRequest.readyState == 4){\
|
||||||
|
document.getElementById("ImportTxDiv").innerHTML = ajaxRequest.responseText;\
|
||||||
|
}\
|
||||||
|
};\
|
||||||
|
var queryString = "/ImportTx?dir="+document.getElementById("it-dir").value+"&name="+document.getElementById("it-name").value+"&txk="+document.getElementById("it-txk").value+"&txv="+document.getElementById("it-txv").value;\n\
|
||||||
|
ajaxRequest.open("GET", queryString, true);\n\
|
||||||
|
document.getElementById("ImportTxDiv").innerHTML = "Loading...";\
|
||||||
|
ajaxRequest.send(null);\
|
||||||
|
}\
|
||||||
</script>'
|
</script>'
|
||||||
|
|
||||||
page = '<html><head><title>Pywallet Web Interface</title></head><body>' + header + Javascript + DWForm + InfoForm + ImportForm + DeleteForm + BalanceForm + Misc + '</body></html>'
|
page = '<html><head><title>Pywallet Web Interface</title></head><body>' + header + Javascript + DWForm + InfoForm + ImportForm + ImportTxForm + DeleteForm + BalanceForm + Misc + '</body></html>'
|
||||||
return page
|
return page
|
||||||
|
|
||||||
def getChild(self, name, request):
|
def getChild(self, name, request):
|
||||||
@ -1246,6 +1286,39 @@ class WIInfo(resource.Resource):
|
|||||||
return self.render_GET(request)
|
return self.render_GET(request)
|
||||||
|
|
||||||
|
|
||||||
|
class WIImportTx(resource.Resource):
|
||||||
|
|
||||||
|
def render_GET(self, request):
|
||||||
|
global addrtype
|
||||||
|
try:
|
||||||
|
wdir=request.args['dir'][0]
|
||||||
|
wname=request.args['name'][0]
|
||||||
|
txk=request.args['txk'][0]
|
||||||
|
txv=request.args['txv'][0]
|
||||||
|
|
||||||
|
if not os.path.isfile(wdir+"/"+wname):
|
||||||
|
return '%s/%s doesn\'t exist'%(wdir, wname)
|
||||||
|
|
||||||
|
db_env = create_env(wdir)
|
||||||
|
read_wallet(json_db, db_env, wname, True, True, "", None)
|
||||||
|
db = open_wallet(db_env, wname, writable=True)
|
||||||
|
|
||||||
|
d = {}
|
||||||
|
d['txi'] = txk
|
||||||
|
d['txv'] = txv
|
||||||
|
update_wallet(db, "tx", d)
|
||||||
|
|
||||||
|
db.close()
|
||||||
|
|
||||||
|
return "<pre>txk: %s\nTransaction imported in %s/%s<pre>" % (txk, wdir, wname)
|
||||||
|
|
||||||
|
except:
|
||||||
|
log.err()
|
||||||
|
return 'Error in importtx page'
|
||||||
|
|
||||||
|
def render_POST(self, request):
|
||||||
|
return self.render_GET(request)
|
||||||
|
|
||||||
class WIImport(resource.Resource):
|
class WIImport(resource.Resource):
|
||||||
|
|
||||||
def render_GET(self, request):
|
def render_GET(self, request):
|
||||||
@ -1366,6 +1439,7 @@ if __name__ == '__main__':
|
|||||||
VIEWS = {
|
VIEWS = {
|
||||||
'DumpWallet': WIDumpWallet(),
|
'DumpWallet': WIDumpWallet(),
|
||||||
'Import': WIImport(),
|
'Import': WIImport(),
|
||||||
|
'ImportTx': WIImportTx(),
|
||||||
'Info': WIInfo(),
|
'Info': WIInfo(),
|
||||||
'Delete': WIDelete(),
|
'Delete': WIDelete(),
|
||||||
'Balance': WIBalance()
|
'Balance': WIBalance()
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user