def test_wallet_balance_amount(): wallet = Wallet() blockchain = Blockchain() amount = 34 tr1 = Transactions(wallet, 'recp1', amount) blockchain.add_block([tr1.to_json()]) assert Wallet.calculate_balance(blockchain, wallet.address) == STARTING_BALANCE - amount
def blockchain(): blockchain = Blockchain() for i in range(3): miner_wallet = Wallet() transaction = Transactions(Wallet(), 'recipient', i) reward_transaction = Transactions.transaction_reward(miner_wallet) blockchain.add_block([transaction.to_json()]) return blockchain
def test_blockchain_valid_transaction_incorrect_historical_balance(blockchain): wallet = Wallet() bad_transaction = Transactions(wallet, 'recipient', 1) bad_transaction.output[wallet.address] = 9000 bad_transaction.input['amount'] = 9001 bad_transaction.input['signature'] = wallet.sign(bad_transaction.output) blockchain.add_block([bad_transaction.to_json()]) with pytest.raises(Exception, match="did not have the correct balance"): Blockchain.is_chain_transaction_valid(blockchain.chain)
def make_transaction(): transaction_json = request.get_json() #check if transaction exists transaction = transaction_pool.existing_transaction(wallet.address) if transaction: transaction.update_transaction(wallet, transaction_json['recipient'], transaction_json['amount']) else: transaction = Transactions(wallet, transaction_json['recipient'], transaction_json['amount']) #broadcast the transaction object pubsub.broadcast_transaction(transaction) return jsonify(transaction.to_json())
def test_transaction_clear_transaction(): transaction_pool = TransactionPool() transaction1 = Transactions(Wallet(), 'recp1', 10) transaction_pool.set_transaction(transaction1) blockchain = Blockchain() blockchain.add_block([transaction1.to_json()]) # assert len(blockchain.chain) > 1 print(transaction_pool.transaction_map) transaction_pool.clear_transaction(blockchain) assert transaction1.id not in transaction_pool.transaction_map.keys() # for index, block in enumerate(blockchain.chain): # if index == 0: # continue # for tdata in block.data: # # tdata = ast.literal_eval(tdata) # assert tdata['id'] == 'str'
@staticmethod def calculate_balance(blockchain, address): """ Method to calculate the balances of a Wallet given its address. If the wallet's address is in the transaction's input, then we set the balance to the amount in input field. If the wallet's address is in the transaction's output, then we add the value in output field to the balance. """ balance = STARTING_BALANCE #handle the scenario where blockchain is None if blockchain is None: return balance for index, block in enumerate(blockchain.chain): if index == 0: continue for transaction in block.data: if transaction['input']['address'] == address: balance = transaction['output'][address] elif address in transaction['output']: balance = balance + transaction['output'][address] return balance if __name__ == '__main__': from backend.wallet.transactions import Transactions from backend.blockchain.blockchain import Blockchain wallet = Wallet() blockchain = Blockchain() amount = 34 tr1 = Transactions(wallet, 'recp1', amount) blockchain.add_block([tr1.to_json()]) print(Wallet.calculate_balance(blockchain, wallet.address))