def test_transaction_chain(clone_blockchain): Blockchain.is_tx_chain_valid(clone_blockchain.chain)
def test_valid_transaction_chain(blockchain_three_blocks): Blockchain.is_valid_transaction_chain(blockchain_three_blocks.chain)
def test_blockchain_instance(): blockchain = Blockchain() assert blockchain.chain[0].hash == GENESIS_DATA['hash']
def test_is_valid_chain_bad_genesis(blockchain_three_blocks): blockchain_three_blocks.chain[0].hash = 'evil_hash' with pytest.raises(Exception, match='genesis block must be valid'): Blockchain.is_valid_chain(blockchain_three_blocks.chain)
def test_replace_chain_not_longer(blockchain_three_blocks): blockchain = Blockchain() with pytest.raises(Exception, match='The incoming chain must be longer'): blockchain_three_blocks.replace_chain(blockchain.chain)
def test_replace_chain_bad_chain(blockchain): old_blockchain = Blockchain() blockchain.chain[1].data = 'evil_hash' with raises(Exception, match='Invalid incoming chain'): old_blockchain.replace_chain(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_with_blocks): Blockchain.is_valid_chain(blockchain_with_blocks.chain)
def test_is_valid_chain_invalid_genesis(blockchain_with_blocks): blockchain_with_blocks.chain[0].hash = 3000 with pytest.raises(Exception, match="genesis block is invalid"): Blockchain.is_valid_chain(blockchain_with_blocks.chain)
def test_add_block(): blockchain = Blockchain() data = "test data" blockchain.add_block(data) assert blockchain.chain[-1].data == data
def blockchain_with_blocks(): blockchain = Blockchain() for i in range(5): blockchain.add_block(f"block #{i}") return blockchain
def test_wallet_starting_balance(): wallet = Wallet() blockchain = Blockchain() assert Wallet.calculate_balance(blockchain, wallet.address) == STARTING_BALANCE
import os import requests import random from flask import Flask, jsonify from backend.blockchain.blockchain import Blockchain from backend.pubsub import PubSub app = Flask(__name__) blockchain = Blockchain() pubsub = PubSub(blockchain) @app.route('/') def route_default(): return 'Welcome to the blockchain' @app.route('/blockchain') def route_blockchain(): return jsonify(blockchain.to_json()) @app.route('/blockchain/mine') def route_blockchain_mine(): transaction_data = 'stubbed_transcation_data' blockchain.add_block(transaction_data) block = blockchain.chain[-1] pubsub.broadcast_block(block) return jsonify(block.to_json())
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 test_replace_chain(blockchain): old_blockchain = Blockchain() old_blockchain.replace_chain(blockchain.chain) assert old_blockchain.chain == blockchain.chain
def test_blockchain(): blockchain = Blockchain() assert blockchain.chain[0].hash == GENESIS_DATA["hash"]
def test_replace_chain_too_short(blockchain): old_blockchain = Blockchain() with raises(Exception, match='Incoming chain must be longer'): blockchain.replace_chain(old_blockchain.chain)
def test_replace_chain_invalid_chain(blockchain_with_blocks): blockchain = Blockchain() blockchain_with_blocks.chain[2].hash = "tampered_hash" with pytest.raises(Exception, match="chain is not valid"): blockchain.replace_chain(blockchain_with_blocks.chain)
def test_add_block(): blockchain = Blockchain() data = 'test-data' blockchain.add_block(data) assert blockchain.chain[-1].data == data
import os import requests import random from flask import Flask, jsonify, request from flask_cors import CORS from backend.blockchain.blockchain import Blockchain from backend.wallet.transaction import Transaction from backend.wallet.transaction_pool import TransactionPool from backend.wallet.wallet import Wallet from backend.pubsub import PubSub app = Flask(__name__) CORS(app, resources={r'/*': {'origins': 'http://*****:*****@app.route('/') def route_default(): return 'Welcome to the blockchain' @app.route('/blockchain') def route_blockchain(): return jsonify(blockchain.to_json())
def test_is_valid_chain(blockchain_three_blocks): Blockchain.is_valid_chain(blockchain_three_blocks.chain)
def blockchain_three_blocks(): blockchain = Blockchain() for i in range(3): blockchain.add_block(i) return blockchain
def test_replace_chain(blockchain_three_blocks): blockchain = Blockchain() blockchain.replace_chain(blockchain_three_blocks.chain) assert blockchain.chain == blockchain_three_blocks.chain
import time from backend.blockchain.blockchain import Blockchain from backend.config import TIME_S blockchain = Blockchain() times = [] for i in range(1000): start_time = time.time_ns() / TIME_S blockchain.add_block(i) end_time = time.time_ns() / TIME_S mine_time = end_time - start_time times.append(mine_time) average_time = sum(times) / len(times) print(f"Block No: {i}") print(f"last_block_difficulty: {blockchain.chain[-1].difficulty}") print(f"last_block_nonce: {blockchain.chain[-1].nonce}") print(f"last_block_hash: {blockchain.chain[-1].hash}") print(f"Time to mine block: {mine_time} seconds") print(f"Average_time: {average_time} seconds\n\n")
def test_replace_chain_bad_chain(blockchain_three_blocks): blockchain = Blockchain() blockchain_three_blocks.chain[1].hash = 'evil-hash' with pytest.raises(Exception, match='The incoming chain is invalid'): blockchain.replace_chain(blockchain_three_blocks.chain)
def test_is_valid_chain(blockchain): Blockchain.is_valid_chain(blockchain.chain)
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_is_valid_chain_bad_genesis(blockchain): blockchain.chain[0].hash = 'evil_hash' with raises(Exception, match='Invalid genesis block'): Blockchain.is_valid_chain(blockchain.chain)
def test_is_valid_transaction_chain_multiple_rewards(blockchain_three_blocks): reward_1 = Transaction.reward_transaction(Wallet()).to_json() reward_2 = Transaction.reward_transaction(Wallet()).to_json() blockchain_three_blocks.add_block([reward_1, reward_2]) with pytest.raises(Exception, match='one mining reward per block'): Blockchain.is_valid_transaction_chain(blockchain_three_blocks.chain)
def test_surrogate_chain_when_invalid_chain(clone_blockchain): blockchain = Blockchain() clone_blockchain.chain[1].hash = "invalidate" with pytest.raises(Exception, match="Invalid chain."): blockchain.surrogate_chain(clone_blockchain.chain)