def test_clear_blockchain_transactions(): transaction_pool = TransactionPool() transaction_1 = Transaction(Wallet(), 'first', 1) transaction_2 = Transaction(Wallet(), 'second', 2) transaction_3 = Transaction(Wallet(), 'three', 3) transaction_pool.set_transaction(transaction_1) transaction_pool.set_transaction(transaction_2) transaction_pool.set_transaction(transaction_3) blockchain = Blockchain() blockchain.add_block([ transaction_1.to_json(), transaction_2.to_json(), transaction_3.to_json() ]) assert transaction_1.id in transaction_pool.transaction_map assert transaction_2.id in transaction_pool.transaction_map assert transaction_3.id in transaction_pool.transaction_map transaction_pool.clear_blockchain_transactions(blockchain) assert not transaction_1.id in transaction_pool.transaction_map assert not transaction_2.id in transaction_pool.transaction_map assert not transaction_3.id in transaction_pool.transaction_map
def test_calculate_balance(): blockchain = Blockchain() wallet = Wallet() assert wallet.calculate_balance(blockchain, wallet.address) == STARTING_BALANCE amount = 34 transaction = Transaction(wallet, 'recipient', amount) blockchain.add_block([transaction.to_json()]) assert wallet.calculate_balance(blockchain, wallet.address) ==\ STARTING_BALANCE - amount received_amount_1 = 40 received_transaction_1 = Transaction(Wallet(), wallet.address, received_amount_1) received_amount_2 = 110 received_transaction_2 = Transaction(Wallet(), wallet.address, received_amount_2) blockchain.add_block( [received_transaction_1.to_json(), received_transaction_2.to_json()]) assert wallet.calculate_balance(blockchain, wallet.address) ==\ STARTING_BALANCE - amount + received_amount_1 +received_amount_2
def test_calculate_balance(): blockchain = Blockchain() wallet = Wallet() assert Wallet.calculate_balance(blockchain, wallet.address) == STARTING_BALANCE amount = 20 transacion = Transaction(wallet, 'recipient', amount) blockchain.add_block([transacion.to_json()]) assert Wallet.calculate_balance( blockchain, wallet.address) == STARTING_BALANCE - amount recieved_amount1 = 10 recieved_transaction1 = Transaction(Wallet(), wallet.address, recieved_amount1) recieved_amount2 = 40 recieved_transaction2 = Transaction(Wallet(), wallet.address, recieved_amount2) blockchain.add_block( [recieved_transaction1.to_json(), recieved_transaction2.to_json()]) assert Wallet.calculate_balance( blockchain, wallet.address ) == STARTING_BALANCE - amount + recieved_amount1 + recieved_amount2
def test_add_block(): blockchain = Blockchain() data = "test-data" blockchain.add_block(data) # Check last block data is equal to test data assert blockchain.chain[-1].data == data
def test_replace_chain_negative_invalid_chain(blockchain): invalid_chain = Blockchain() invalid_chain.add_block('1') invalid_chain.add_block('1') invalid_chain.chain[0].hash = "0xabc" with pytest.raises(Exception, match="The incoming chain is not valid"): blockchain.replace_chain(invalid_chain.chain)
def blockchain_three_blocks(): bc = Blockchain() for i in range(3): bc.add_block([Transaction(Wallet(), 'recipient', i).to_json()]) return bc
def blockchain(): blockchain = Blockchain() for i in range(5): blockchain.add_block(i) return blockchain
def test_calculate_balance(): blockchain = Blockchain() wallet = Wallet() # NEW: new Wallet() `wallet` should have initial balance assert Wallet.calculate_balance(blockchain, wallet.address) == INITIAL_BALANCE sent_amt = 50 outgoing_transaction = Transaction( wallet, "a13b2bf4", sent_amt) # send to `wallet` from "a13b2bf4" blockchain.add_block([outgoing_transaction.serialize_to_json()]) # SEND: `wallet` should have initial balance sans amt assert Wallet.calculate_balance( blockchain, wallet.address) == INITIAL_BALANCE - sent_amt received_amt_1 = 25 incoming_transaction_1 = Transaction( Wallet(), wallet.address, received_amt_1) # receive by `wallet` from new Wallet() received_amt_2 = 77 incoming_transaction_2 = Transaction(Wallet(), wallet.address, received_amt_2) blockchain.add_block([ incoming_transaction_1.serialize_to_json(), incoming_transaction_2.serialize_to_json() ]) # RECEIVE: `wallet` should have initial balance plus incoming amt(s) assert Wallet.calculate_balance( blockchain, wallet.address ) == INITIAL_BALANCE - sent_amt + received_amt_1 + received_amt_2
def test_add_block(): blockchain = Blockchain() data = "test-data" blockchain.add_block(data=data) assert blockchain.chain[-1].data == data
def test_add_block(): blockchain = Blockchain() data = '123' blockchain.add_block(data) assert isinstance(blockchain, Blockchain) assert blockchain.chain[-1].data == data
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 test_blockchain_valid_transaction_duplicate_rewardss(): blockchain = Blockchain() transaction = Transactions(Wallet(), 'recipient', 100).to_json() reward_transaction = Transactions.transaction_reward(Wallet()).to_json() blockchain.add_block([transaction, reward_transaction, reward_transaction]) with pytest.raises(Exception, match="has multiple rewards"): Blockchain.is_chain_transaction_valid(blockchain.chain)
def blockchain_three_blocks(): blockchain = Blockchain() for i in range(3): blockchain.add_block([Transaction(Wallet(), "recipient", i).to_json()]) return blockchain
def test_is_valid_chain(): blockchain = Blockchain() for i in range(3): blockchain.add_block(i) Blockchain.is_valid_chain(blockchain.chain)
def test_is_valid_transaction_chain(): blockchain = Blockchain() blockchain_three_blocks = Blockchain() for i in range(3): blockchain_three_blocks.add_block([Transaction(Wallet(), 'recipient', i).to_json()]) Blockchain.is_valid_transaction_chain(blockchain_three_blocks.chain)
def test_add_block(): blockchain = Blockchain() data = 'foo' blockchain.add_block(data) block = blockchain.chain[-1] assert block.data == data assert block.last_hash == GENESIS_DATA['hash']
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_replace_chain(): blockchain = Blockchain() blockchain_three_blocks = Blockchain() for i in range(3): blockchain_three_blocks.add_block(i) blockchain.replace_chain(blockchain_three_blocks.chain) assert blockchain_three_blocks.chain == blockchain.chain
def test_replace_chain_not_longer(): blockchain_three_blocks = Blockchain() for i in range(3): blockchain_three_blocks.add_block(i) blockchain = Blockchain() with pytest.raises(Exception, match="Cannot replace. The incomming chain must be longer"): blockchain_three_blocks.replace_chain(blockchain.chain)
def test_add_block(): ''' Purpose: Assert that the blockchain added the block and that the data matches. ''' blockchain = Blockchain() data = 'test-data' blockchain.add_block(data) assert(blockchain.chain[-1].data == data)
def test_replace_chain_bad_chain(): blockchain = Blockchain() blockchain_three_blocks = Blockchain() for i in range(3): blockchain_three_blocks.add_block(i) blockchain_three_blocks.chain[1].hash = 'bad-hash' with pytest.raises(Exception, match="Cannot replace. The incomming chain is invalid"): blockchain.replace_chain(blockchain_three_blocks.chain)
def test_is_valid_chain_bad_genesis(): blockchain = Blockchain() for i in range(3): blockchain.add_block(i) blockchain.chain[0].hash = 'bad-hash' with pytest.raises(Exception, match='The genesis block must be valid'): Blockchain.is_valid_chain(blockchain.chain)
def test_is_valid_transaction_chain_duplicate_transactions(): blockchain_three_blocks = Blockchain() for i in range(3): blockchain_three_blocks.add_block([Transaction(Wallet(), 'recipient', i).to_json()]) transaction = Transaction(Wallet(), 'recipient', 10).to_json() blockchain_three_blocks.add_block([transaction, transaction, transaction]) with pytest.raises(Exception, match='is not unique'): Blockchain.is_valid_transaction_chain(blockchain_three_blocks.chain)
def test_is_valid_transaction_chain_bad_transaction(): blockchain_three_blocks = Blockchain() for i in range(3): blockchain_three_blocks.add_block([Transaction(Wallet(), 'recipient', i).to_json()]) 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_is_valid_transaction_chain_multiple_rewards(): blockchain_three_blocks = Blockchain() for i in range(3): blockchain_three_blocks.add_block([Transaction(Wallet(), 'recipient', i).to_json()]) reward1 = Transaction.reward_transaction(Wallet()).to_json() reward2 = Transaction.reward_transaction(Wallet()).to_json() blockchain_three_blocks.add_block([reward1, reward2]) with pytest.raises(Exception, match='one minig reward per block'): Blockchain.is_valid_transaction_chain(blockchain_three_blocks.chain)
def test_clear_blockchain_transactions(): transactionpool=TransactionPool() transaction_1=Transaction(Wallet(),'recipient',40) transaction_2=Transaction(Wallet(),'recipient',41) transactionpool.set_transaction(transaction_1) transactionpool.set_transaction(transaction_2) blockchain=Blockchain() blockchain.add_block([transaction_1.to_json(),transaction_2.to_json()]) assert transaction_1.id in transactionpool.transaction_map assert transaction_2.id in transactionpool.transaction_map transactionpool.clear_blockchain_transactions(blockchain) assert not transaction_1.id in transactionpool.transaction_map assert not transaction_2.id in transactionpool.transaction_map
def test_is_valid_transaction_chain_bad_historic_balance(): blockchain_three_blocks = Blockchain() for i in range(3): blockchain_three_blocks.add_block([Transaction(Wallet(), 'recipient', i).to_json()]) wallet = Wallet() bad_transaction = Transaction(wallet, 'recipient', 5) bad_transaction.output[wallet.address] = 10000 bad_transaction.input['amount'] = 10005 bad_transaction.input['signature'] = wallet.sign(bad_transaction.output) blockchain_three_blocks.add_block([bad_transaction.to_json()]) with pytest.raises(Exception, match="has an invalid input amount"): Blockchain.is_valid_transaction_chain(blockchain_three_blocks.chain)
def test_purge(): tx_pool = TransactionPool() tx_1 = Transaction(Wallet(), "adc193bd", 1) tx_2 = Transaction(Wallet(), "adc193bd", 2) tx_pool.set_transaction(tx_1) tx_pool.set_transaction(tx_2) blockchain = Blockchain() blockchain.add_block([tx_1.serialize_to_json(), tx_2.serialize_to_json()]) assert tx_1.id in tx_pool.transaction_map assert tx_2.id in tx_pool.transaction_map # purge from Pool instance any Txs written to blockchain tx_pool.purge(blockchain) assert not tx_1.id in tx_pool.transaction_map assert not tx_2.id in tx_pool.transaction_map
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'
def test_clear_blockchain_transactions(): transaction_pool = TransactionPool() transaction1 = Transaction(Wallet(), 'recipeint', 1) transaction2 = Transaction(Wallet(), 'recipeint', 2) transaction_pool.set_transaction(transaction1) transaction_pool.set_transaction(transaction2) blockchain = Blockchain() blockchain.add_block([transaction1.to_json(), transaction2.to_json()]) assert transaction1.id in transaction_pool.transaction_map assert transaction2.id in transaction_pool.transaction_map transaction_pool.clear_blockchain_transactions(blockchain) assert transaction1.id not in transaction_pool.transaction_map assert transaction2.id not in transaction_pool.transaction_map