def test_add_transaction(): transaction_pool = TransactionPool() transaction = Transaction(Wallet(), "abcd", 10) transaction_pool.add_transaction(transaction) assert transaction_pool.all_transactions[transaction.id] == transaction
def test_transaction_exceeds_balance(): with pytest.raises(Exception, match='Amount exceeds balance'): Transaction(Wallet(), 'recipient', 9001)
def test_valid_transaction(): Transaction.is_valid_transaction(Transaction(Wallet(), 'recipient', 50))
def blockchain_three_blocks(): blockchain = Blockchain() for i in range(3): blockchain.add_block( list([Transaction(Wallet(), 'recipient', i).to_json()])) return blockchain
ROOT_PORT = 5000 PORT = ROOT_PORT if os.environ.get('PEER') == 'True': PORT = random.randint(5001, 6000) result = requests.get(f'http://localhost:{ROOT_PORT}/blockchain') result_blockchain = Blockchain.from_json(result.json()) try: blockchain.replace_chain(result_blockchain.chain) print('\n -- Successfully synchronized the local chain') except Exception as e: print(f'\n -- Error synchronizing: {e}') if os.environ.get('SEED_DATA') == 'True': for i in range(10): blockchain.add_block([ Transaction(Wallet(), Wallet().address, random.randint(2, 50)).to_json(), Transaction(Wallet(), Wallet().address, random.randint(2, 50)).to_json() ]) for i in range(3): transaction_pool.set_transaction( Transaction(Wallet(), Wallet().address, random.randint(2, 50))) app.run(port=PORT)
def test_set_transaction(): transaction_pool = TransactionPool() transaction = Transaction(Wallet(), 'recipient', 1) transaction_pool.set_transaction(transaction) assert transaction_pool.transaction_map[transaction.id] == transaction
def test_valid_transaction_chain_duplicate_transactions(populated_blockchain): transaction = Transaction(Wallet(), 'recipient', 1).to_json() populated_blockchain.add_block([transaction, transaction]) with pytest.raises(Exception, match='is not unique!'): Blockchain.is_valid_transaction_chain(populated_blockchain.chain)
def test_transaction_in_sufficient_balance(): with pytest.raises(Exception, match="In sufficient balance"): Transaction(Wallet(), 'recipient', 1001)
def test_valid_transaction(): transaction = Transaction(Wallet(), "abcd", 20) Transaction.is_transaction_valid(transaction)
def test_is_valid_transaction_chain_bad_transaction(blockchain_3b): bad_trans = Transaction(Wallet(), 'recipient', 1) bad_trans.input['signature'] = Wallet().sign(bad_trans.output) blockchain_3b.add_block([bad_trans.to_json()]) with pytest.raises(Exception): Blockchain.is_valid_trans_chain(blockchain_3b.chain)
def blockchain_3b(): ''' Pytest Fixture for a blockchain containing 3 blocks ''' blockchain = Blockchain() for i in range(3): blockchain.add_block([Transaction(Wallet(), 'recipient', i).to_json()]) return blockchain
def test_transaction_chain_when_duplicate_tx(clone_blockchain): tx_instance = Transaction(Wallet(), "b13b2bf4", 1).serialize_to_json() clone_blockchain.add_block([tx_instance, tx_instance]) with pytest.raises(Exception, match="is not unique;"): Blockchain.is_tx_chain_valid(clone_blockchain.chain)
def clone_blockchain(): blockchain = Blockchain() for i in range(3): blockchain.add_block( [Transaction(Wallet(), "b13b2bf4", i).serialize_to_json()]) return blockchain
def test_transaction(): sender_wallet = Wallet() recipient = 'recipient' amount = 50 transaction = Transaction(sender_wallet, recipient, amount) assert transaction.output[recipient] == amount assert transaction.output[ sender_wallet.address] == sender_wallet.balance - amount assert 'timestamp' in transaction.input assert transaction.input['amount'] == sender_wallet.balance assert transaction.input['address'] == sender_wallet.address assert transaction.input['public_key'] == sender_wallet.public_key assert Wallet.verfiy(transaction.input['public_key'], transaction.output, transaction.input['signature']) def test_transaction_exceeds_balance(): with pytest.raises(Exception, match='Amount exceeds balance'): transaction(Wallet(), 'recipient', 9001) def test_transaction_update(): sender_wallet = Wallet() first_recipient = 'first_recipient' first_amount = 50 transaction = Transaction(sender_wallet, first_recipient, first_amount) next_recipient = 'next_recipient' next_amount = 75 transaction.update(sender_wallet, next_recipient, next_amount) assert transaction.output[next_recipient] == next_amount assert transaction.output[sender_wallet.address] ==\ sender_wallet.balance - first_amount - next_amount assert Wallet.verfiy(transaction.input['public_key'], transaction.output, transaction.input['signature']) to_first_again_amount = 25 transaction(sender_wallet, first_recipient, to_first_again_amount) assert transaction.output[ first_recipient] == first_amount + to_first_again_amount assert transaction.output[ sender_wallet. address] == sender_wallet.balance - first_amount - next_amount - to_first_again_amount assert Wallet.verfiy(transaction.input['public_key'], transaction.output, transaction.input['signature']) def test_valid_transaction(): Transaction.is_valid_transaction(Transaction(Wallet(), 'recipient', 50)) def test_valid_transaction_invalid_output(): sender_wallet = Wallet() transaction = Transaction(sender_wallet, 'recipient', 50) transaction.output[sender_wallet.address] = 9001 with pytest.raises(Exception, match='Invalid transaction output values'): Transaction.is_valid_transaction(transaction) def test_valid_transaction_invalid_signature(): transaction = Transaction(Wallet(), 'recipient', 50) transaction.input['signature'] = Wallet().sign(transaction.output) with pytest.raises(Exception, match='Invalid signature'): Transaction.is_valid_transaction(transaction) def test_reward_transaction(): miner_wallet = Wallet() transaction = Transaction.reward_transaction(miner_wallet) assert transaction.input == MINING_REWARD_INPUT assert transaction.output[miner_wallet.address] == MINING_REWARD def test_valid_reward_transaction(): reward_transaction = Transaction.reward_transaction(Wallet()) Transaction.is_valid_transaction(reward_transaction) def test_invalid_rt_er(): reward_transaction = Transaction.reward_transaction(Wallet()) reward_transaction.output['extra_recipient'] = 60 with pytest.raises(Exception, match='Invalid mining reward'): Transaction.is_valid_transaction(reward_transaction) def test_invalid_rt_ia(): miner_wallet = Wallet() reward_transaction = Transaction.reward_transaction(miner_wallet) reward_transaction.output[miner_wallet.address] = 9911 with pytest.raises(Exception, match='Invalid mining reward'): Transaction.is_valid_transaction(reward_transaction)
def test_is_valid_transaction_chain_duplicate_transactions( blockchain_three_blocks): transaction = Transaction(Wallet(), "recipient", 1).to_json() blockchain_three_blocks.add_block([transaction, transaction]) with pytest.raises(Exception, match="is not unique"): Blockchain.is_valid_transaction_chain(blockchain_three_blocks.chain)
def test_valid_transaction_with_invalid_signature(): transaction = Transaction(Wallet(), "recipient", 50) transaction.input["signature"] = Wallet().sign(transaction.output) with pytest.raises(Exception, match="Invalid signature"): Transaction.is_valid_transaction(transaction)
def test_is_valid_transaction_chain_bad_transaction(blockchain_three_blocks): bad_transaction = Transaction(Wallet(), "recipient", 1) bad_transaction.input["signature"] = Wallet().sign(bad_transaction.output) blockchain_three_blocks.add_block([bad_transaction.to_json()]) with pytest.raises(Exception): Blockchain.is_valid_transaction_chain(blockchain_three_blocks.chain)
def test_valid_transaction_with_invalid_outputs(): sender_wallet = Wallet() transaction = Transaction(sender_wallet, 'recipient', 50) transaction.output[sender_wallet.address] = 9001 with pytest.raises(Exception, match='Invalid transaction output values'): Transaction.is_valid_transaction(transaction)
def populated_blockchain(): blockchain = Blockchain() for i in range(3): blockchain.add_block([Transaction(Wallet(), 'recipient', i).to_json()]) return blockchain
def test_transaction_when_exceeds_balance(): with pytest.raises(Exception, match="Input amount exceeds balance."): Transaction(Wallet(), "b64e8ac4", 10000)
def test_valid_transaction_chain_bad_transaction(populated_blockchain): bad_transaction = Transaction(Wallet(), 'recipient', 1) bad_transaction.input['signature'] = Wallet().sign(bad_transaction.output) populated_blockchain.add_block([bad_transaction.to_json()]) with pytest.raises(Exception): Blockchain.is_valid_transaction_chain(populated_blockchain.chain)
def test_tx_update_when_exceeds_balance(): sender_wallet = Wallet() transaction = Transaction(sender_wallet, "b64e8ac4", 50) with pytest.raises(Exception, match="Input amount exceeds balance."): transaction.tx_update(sender_wallet, "a13b2bf4", 10000)
def test_transaction_exceeds_balance(): with pytest.raises(Exception, match="The amount exceeds sender's balance"): Transaction(Wallet(), 'recipient', 9000)
def test_is_tx_valid(): Transaction.is_tx_valid(Transaction(Wallet(), "b64e8ac4", 50))
ROOT_PORT = 5000 PORT = ROOT_PORT # peer instance, supports up to 1,000 peers if os.environ.get("PEER") == "True": PORT = random.randint(5001, 6000) # fetch blockchain instance res = requests.get(f"http://localhost:{ROOT_PORT}/blockchain") res_blockchain = Blockchain.deserialize_from_json(res.json()) try: blockchain.surrogate_chain(res_blockchain) print("\n -- Successfully synchronized local blockchain instance.") except Exception as err: print(f"\n -- Error synchronizing local blockchain instance. See: {err}") # seeded test instance - creates 10 blocks w/2 Tx ea if os.environ.get("SEED") == "True": for i in range(10): blockchain.add_block([ Transaction(Wallet(),Wallet().address, random.randint(2, 50)).serialize_to_json(), Transaction(Wallet(),Wallet().address, random.randint(2, 50)).serialize_to_json() ]) # set Tx in pool for i in range(3): transaction_pool.set_transaction( Transaction(Wallet(),Wallet().address, random.randint(2, 50)) ) app.run(port=PORT)
def test_is_tx_valid_when_invalid_sig(): transaction = Transaction(Wallet(), "b64e8ac4", 50) transaction.input["signature"] = Wallet().gen_signature(transaction.output)
def test_transaction_update_exceeds_balance(): sender_wallet = Wallet() transaction = Transaction(sender_wallet, 'recipient', 50) with pytest.raises(Exception, match='Amount exceeds balance'): transaction.update(sender_wallet, 'new_recipient', 9001)
known_addresses.update(transaction['output'].keys()) return jsonify(list(known_addresses)) @app.route('/transactions') @cross_origin(origin='localhost',headers=['Content- Type','Authorization']) def route_transactions(): return jsonify(transactionpool.transaction_data()) PORT=ROOT_PORT if os.environ.get('PEER')=='True': PORT=random.randint(5001,6000) result=requests.get(f'http://localhost:{ROOT_PORT}/blockchain') result_blockchain=Blockchain.from_json(result.json()) try: blockchain.replace_chain(result_blockchain.chain) print('\n successfully synchronised the local chain') except Exception as e: print(f' \n Error synchronising:{e}') if os.environ.get('SEED_DATA')=='True': for i in range(10): blockchain.add_block([ Transaction(Wallet(),Wallet().address,random.randint(2,50)).to_json(), Transaction(Wallet(),Wallet().address,random.randint(2,50)).to_json() ]) for i in range(3): transactionpool.set_transaction(Transaction(Wallet(),Wallet().address,random.randint(2,50))) print(blockchain) app.run(port=PORT)
def test_valid_transaction_with_invalid_signature(): transaction = Transaction(Wallet(), 'recipient', 50) transaction.input['signature'] = Wallet().sign(transaction.output) with pytest.raises(Exception, match='Invalid signature'): Transaction.is_valid_transaction(transaction)
def test_is_valid_transaction_invalid_signature(): sender_wallet = Wallet() transaction = Transaction(sender_wallet, 'recipient', 100) transaction.input['signature'] = Wallet().sign(transaction.output) with pytest.raises(Exception, match='Invalid signature'): Transaction.is_valid_transaction(transaction)