-
Notifications
You must be signed in to change notification settings - Fork 12
/
node_console.py
94 lines (85 loc) · 3.74 KB
/
node_console.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
from uuid import uuid4
from blockchain import Blockchain
from utility.verification import Verification
from wallet import Wallet
# This node class runs the local blockchain instance (id: Id of the node, blockchain: blockchain which is run by node)
class Node:
def __init__(self):
# self.id = str(uuid4())
self.wallet = Wallet()
self.wallet.create_keys()
self.blockchain = Blockchain(self.wallet.public_key)
# Get the user input, transform it from a string to a float and store it in user_input
def get_transaction_value(self):
tx_recipient = input('Enter the recipient of the transaction: ')
tx_amount = float(input('Your transaction amount please: '))
return tx_recipient, tx_amount
# Prompts the user for its choice and return it
def get_user_choice(self):
user_input = input('Your choice: ')
return user_input
# Output the blockchain list to the console
def print_blockchain_elements(self):
for block in self.blockchain.chain:
print('Outputting Block')
print(block)
else:
print('-' * 20)
# Starts the node and waits for user input
def listen_for_input(self):
waiting_for_input = True
# User Input Interface
while waiting_for_input:
print('Please choose')
print('1: Add a new transaction value')
print('2: Mine a new block')
print('3: Output the blockchain blocks')
print('4: Check transaction validity')
print('5: Create wallet')
print('6: Load wallet')
print('7: Save keys')
print('q: Quit')
user_choice = self.get_user_choice()
if user_choice == '1':
tx_data = self.get_transaction_value()
recipient, amount = tx_data
signature = self.wallet.sign_transaction(self.wallet.public_key, recipient, amount)
if self.blockchain.add_transaction(recipient, self.wallet.public_key, signature, amount=amount):
print('Added transaction!')
else:
print('Transaction failed!')
print(self.blockchain.get_open_transactions())
elif user_choice == '2':
if not self.blockchain.mine_block():
print('Mining failed. Got no wallet?')
elif user_choice == '3':
self.print_blockchain_elements()
elif user_choice == '4':
if Verification.verify_transactions(self.blockchain.get_open_transactions(), self.blockchain.get_balance):
print('All transactions are valid')
else:
print('There are invalid transactions')
elif user_choice == '5':
self.wallet.create_keys()
self.blockchain = Blockchain(self.wallet.public_key)
elif user_choice == '6':
self.wallet.load_keys()
self.blockchain = Blockchain(self.wallet.public_key)
elif user_choice == '7':
self.wallet.save_keys()
elif user_choice == 'q':
waiting_for_input = False
else:
print('Input was invalid, please pick a value from the list!')
if not Verification.verify_chain(self.blockchain.chain):
self.print_blockchain_elements()
print('Invalid blockchain!')
# Break out of the loop
break
print('Balance of {}: {:6.2f}'.format(self.wallet.public_key, self.blockchain.get_balance()))
else:
print('User left!')
print('Done!')
if __name__ == '__main__':
node = Node()
node.listen_for_input()