class Node: """The node which runs the local blockchain instance. Attributes: :id: The id of the node. :blockchain: The blockchain which is run by this node. """ def __init__(self): # self.id = str(uuid4()) self.wallet = Wallet() self.wallet.create_keys() self.blockchain = Blockchain(self.wallet.public_key) def get_transaction_value(self): """ Returns the input of the user (a new transaction amount) as a float. """ # Get the user input, transform it from a string to a float and store it in user_input tx_recipient = input('Enter the recipient of the transaction: ') tx_amount = float(input('Your transaction amount please: ')) return tx_recipient, tx_amount def get_loan_request(self): '''Returns the inputs of the user for the loan request''' tx_amount = float(input('Enter the loan amount: ')) tx_length = float(input('Enter your desired loan term: ')) tx_apr = float(input('Enter your desired apr: ')) return tx_amount, tx_length, tx_apr def get_user_choice(self): """Prompts the user for its choice and return it.""" user_input = input('Your choice: ') return user_input def print_blockchain_elements(self): """ Output all blocks of the blockchain. """ # Output the blockchain list to the console for block in self.blockchain.chain: print('Outputting Block') print(block) else: print('-' * 20) def listen_for_input(self): """Starts the node and waits for user input.""" waiting_for_input = True # A while loop for the user input interface # It's a loop that exits once waiting_for_input becomes False or when break is called 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('8: Request Loan') print('q: Quit') user_choice = self.get_user_choice() if user_choice == '1': tx_data = self.get_transaction_value() recipient, amount = tx_data # Add the transaction amount to the blockchain 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 == '8': first_time = self.blockchain.first_time_borrow() loan_data = self.get_loan_request() tx_amount, tx_length, tx_apr = loan_data credit_score = self.blockchain.check_credit_score(first_time) self.blockchain.accept_loan(credit_score,tx_amount,tx_length, tx_apr) print('Loan request successful') print(self.blockchain.get_open_transactions()) elif user_choice == 'q': # This will lead to the loop to exist because it's running condition becomes False 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!')