-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathwallet.py
356 lines (283 loc) · 103 KB
/
wallet.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
import base64
import binascii
import json
import os
import requests
import qrcode
from time import time
from Crypto.PublicKey import RSA
from Crypto.Hash import SHA256
from Crypto.Hash import RIPEMD160
from Crypto.Signature import pkcs1_15
from src.validation import Funds
import PySimpleGUI as sg
import hashlib
class Wallet:
unix_time = time()
def __init__(self):
if not os.path.isfile('data/wallet.json'):
self.generate_wallet()
self.nodes = []
sg.theme('Black')
# GUI INIT
layout = [[sg.Text('Please enter the address/ip and port of a known node')],
[sg.InputText()],
[sg.Submit(), sg.Cancel()]]
icon = base64.b64decode("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")
window = sg.Window('Wallet waiting to connect...', layout=layout, icon=icon)
event, values = window.read()
window.close()
# variable inits
self.node = values[0]
self.nodes.append(self.node)
sg.popup("Connecting to ", values[0], icon=icon)
# get the chain from the blockchain node
self.chain = self.get_chain()
#load our wallet file
wallet_file = json.load(open('data/wallet.json', 'r'))
self.private_key = RSA.import_key(wallet_file['private key'])
self.public_key = RSA.import_key(wallet_file['public key'])
self.public_key_hex = wallet_file['public key hex']
self.public_key_hash = wallet_file['public key hash']
# if wallet doesnt exist we'll generate one
if not os.path.exists('data'):
os.makedirs('data')
if not os.path.isfile('data/wallet_qr.png'):
self.create_qr()
# wallet file functions
def generate_wallet(self):
private_key = RSA.generate(2048)
private_key_plain = private_key.export_key("PEM")
public_key_plain = private_key.publickey().export_key("PEM")
public_key = private_key.publickey().export_key("DER")
public_key_hex = binascii.hexlify(public_key).decode("utf-8")
public_key_hash = self.calculate_hash(self.calculate_hash(public_key_hex, hash_function="sha256"),
hash_function="ripemd160")
wallet_data = {
'private key': private_key_plain.decode(),
'public key': public_key_plain.decode(),
'public key hex': public_key_hex,
'public key hash': public_key_hash
}
self.write_json(wallet_data, 'w')
def write_json(self, data, mode, filename='data/wallet.json'):
# opens the file in write mode
with open(filename, mode) as file:
block_dict = json.dumps(data, indent=6)
file.write(block_dict)
def create_qr(self):
data = self.public_key_hash
qr = qrcode.QRCode(
version=1,
box_size=10,
border=2)
qr.add_data(data)
qr.make(fit=True)
img = qr.make_image(fill='black', back_color='white')
img.save('data/wallet_qr.png')
# hash functions
@staticmethod
def hash(block):
# We must make sure that the Dictionary is Ordered, or we'll have inconsistent hashes
block_string = json.dumps(block, sort_keys=True).encode()
return hashlib.sha256(block_string).hexdigest()
def calculate_hash(self, data, hash_function):
data = bytearray(data, "utf-8")
if hash_function == "sha256":
h = SHA256.new()
h.update(data)
return h.hexdigest()
if hash_function == "ripemd160":
h = RIPEMD160.new()
h.update(data)
return h.hexdigest()
# functions for transactions
def new_transaction(self, recipient, amount, unix_time):
sender = self.public_key_hash
previous_block_hash = self.get_last_block_hash()
trans_data = {
'sender': sender,
'recipient': recipient,
'amount': amount,
'time_submitted': unix_time,
'previous_block_hash': previous_block_hash,
'public_key_hex': self.public_key_hex
}
total_bytes = self.calculate_bytes(trans_data)
fee = self.calculate_fee(total_bytes)
total_amount = amount + fee
transaction = {
'sender': sender,
'recipient': recipient,
'amount': amount,
'fee': fee,
'time_submitted': unix_time,
'previous_hash': previous_block_hash,
'public_key_hex': self.public_key_hex
}
hashed_trans = self.hash(transaction)
trans_with_hash = {
'sender': sender,
'recipient': recipient,
'amount': amount,
'fee': fee,
'time_submitted': trans_data['time_submitted'],
'previous_hash': previous_block_hash,
'public_key_hex': self.public_key_hex,
'transaction_hash': hashed_trans
}
signed_trans = self.sign(trans_with_hash)
full_transaction = {
'sender': sender,
'recipient': recipient,
'amount': amount,
'fee': fee,
'time_submitted': trans_data['time_submitted'],
'previous_hash': previous_block_hash,
'public_key_hex': self.public_key_hex,
'transaction_hash': hashed_trans,
'signature': signed_trans
}
icon = base64.b64decode('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')
confirmation_window_layout = [
[sg.Text("Are you sure you want to send this Transaction?")],
[[sg.Text("Recipient", justification='left'), sg.Text(recipient, justification='right')]],
[[sg.Text("Amount to send: ", justification='left')], [sg.Text(amount, justification='right')]],
[[sg.Text("Transaction Fee: ", justification='left')], sg.Text(fee, justification='right')],
[[sg.Text("Total Amount: ", justification='left')], sg.Text(total_amount, justification='right')],
[[sg.Button('Confirm')], [sg.Button('Exit')]]
]
window = sg.Window('Serpentcoin Wallet', layout=confirmation_window_layout, icon=icon)
event, values = window.read()
if event in (sg.WIN_CLOSED, 'Exit'):
window.close()
return "cancelled"
if event in 'Confirm':
if self.broadcast_transaction(full_transaction):
self.chain = self.get_chain()
window.close()
return "confirmed"
else:
self.chain = self.get_chain()
window.close()
return False
def broadcast_transaction(self, transaction):
headers = {'Content-type': 'application/json', 'Accept': 'text/plain'}
for node in self.nodes:
response = requests.post(f'http://{node}/transactions/new', json=transaction, headers=headers)
if response.status_code == 201:
return True
else:
return False
def sign_transaction_data(self, data):
transaction_bytes = json.dumps(data, sort_keys=True).encode('utf-8')
hash_object = SHA256.new(transaction_bytes)
signature = pkcs1_15.new(self.private_key).sign(hash_object)
return signature
def calculate_bytes(self, transaction):
tx_string = json.dumps(transaction)
tx_bytes = tx_string.encode('ascii')
return len(tx_bytes)
def calculate_fee(self, tx_bytes_length):
per_kb_fee = 0.25
sig_hash_bytes = 800
total = tx_bytes_length + sig_hash_bytes
return (total / 1000) * per_kb_fee
def sign(self, data):
signature_hex = binascii.hexlify(self.sign_transaction_data(data)).decode("utf-8")
return signature_hex
# functions for getting blockchain data
def get_balance(self):
chain_balance = Funds.enumerate_funds(self.public_key_hash, self.chain)
if chain_balance > 0:
return chain_balance
if chain_balance == False:
return 0
def get_block_height(self):
for node in self.nodes:
response = requests.get(f'http://{node}/chain')
if response.status_code == 200:
length = response.json()['length']
chain = response.json()['chain']
return chain[length - 1]['index']
def get_last_block_hash(self):
for node in self.nodes:
response = requests.get(f'http://{node}/chain')
if response.status_code == 200:
length = response.json()['length']
chain = response.json()['chain']
return chain[length - 1]['block_hash']
def get_chain(self):
for node in self.nodes:
response = requests.get(f'http://{node}/chain')
if response.status_code == 200:
chain = response.json()['chain']
return chain
wallet = Wallet()
layout = [
[sg.Column([[sg.Text('Welcome to the Serpentcoin wallet', )]], justification='center')],
[sg.Column([[sg.Image('data/wallet_qr.png')]], justification='center')],
[sg.Column([[sg.Text(wallet.public_key_hash)]], justification='center')],
[sg.Column([[sg.Text('Available Funds:', )]], justification='center')],
[sg.Column([[sg.Text(wallet.get_balance(), key='-BALANCE-')]], justification='center')],
[sg.Button('Update Blockchain'), sg.Button('Transaction History')],
[sg.Text("Address: "), sg.InputText(key='-ADDRESS-', size=(30, 20)), ],
[sg.Text(" Amount: "),
sg.InputText(key='-AMOUNT-', size=(30, 20))],
[sg.Button('Send Transaction'), sg.Button('Exit')]
]
icon = base64.b64decode('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')
window = sg.Window('Serpentcoin Wallet', layout=layout, icon=icon)
while True:
event, values = window.read()
if event in (sg.WIN_CLOSED, 'Exit'):
break
if event in 'Update Blockchain':
wallet.chain = wallet.get_chain()
wallet.get_balance()
window['-BALANCE-'].update(wallet.get_balance())
if event in 'Transaction History':
# code to find relevant transactions in the blockchain pertaining to our wallets address
chain = wallet.get_chain() # get the chain
sent = [] # list for storing sent transactions
received = [] # list for storing received transactions
for block in chain: # iterate through the blockchain
for transaction in block['transactions']:
# code to find received transactions
if transaction['recipient'] == wallet.public_key_hash:
print("received: ", transaction)
received.append(transaction)
# code to find sent transactions
if transaction['sender'] == wallet.public_key_hash:
print("sent: ", transaction)
sent.append(transaction)
else:
continue
sent_json = json.dumps(sent, indent=2)
received_json = json.dumps(received, indent=2)
transaction_window_layout = [
[sg.Text("Sent Transactions:")],
[sg.Multiline(sent_json, size=(100, 25))],
[sg.Text("Received Transactions:")],
[sg.Multiline(received_json, size=(100, 25))]
]
icon = base64.b64decode('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')
transaction_window = sg.Window('Transaction History', layout=transaction_window_layout, icon=icon)
events, values = transaction_window.read()
if event in 'Send Transaction':
time = wallet.unix_time
recipient = values['-ADDRESS-']
amount = float(values['-AMOUNT-'])
if len(recipient) == 40:
if wallet.new_transaction(recipient, amount, time) == "confirmed":
sg.popup(
'Transaction submitted and accepted by network...\nPlease wait for next block confirmation for transaction to confirm')
continue
if wallet.new_transaction(recipient, amount, time) == "cancelled":
sg.popup("Transaction Cancelled", icon=icon)
else:
sg.popup(
'Transaction denied by network\nyou either have unconfirmed transactions in the mempool or insufficient balance.\nPlease try again', icon=icon)
else:
sg.popup("Invalid address length, please double check your recipient address to avoid losing/burning funds.")
window.close()