git / moonbite-network / tests/test_block.py · raw
"""Tests for Milestone 2 — Block structure, header hashing, genesis."""import sysfrom pathlib import Pathsys.path.insert(0, str(Path(__file__).resolve().parent.parent))from block import ( # noqa: E402 Block, build_block, coinbase_height, create_coinbase, genesis_block,)from transaction import pubkey_hash, generate_keypair # noqa: E402def _pkh(): _, pub = generate_keypair() return pubkey_hash(pub)def test_genesis_is_deterministic(): assert genesis_block().hash == genesis_block().hashdef test_header_hash_changes_with_nonce(): g = genesis_block() h0 = g.hash g.header.nonce += 1 assert g.hash != h0def test_merkle_root_matches_transactions(): txs = [create_coinbase(1, _pkh())] block = build_block(prev_hash="00" * 32, transactions=txs, bits=8, timestamp=1) assert block.has_valid_merkle_root() block.transactions[0].outputs[0].amount += 1 # mutate after building assert not block.has_valid_merkle_root()def test_coinbase_uniqueness_by_height_and_nonce(): pkh = _pkh() c1 = create_coinbase(1, pkh) c2 = create_coinbase(2, pkh) c3 = create_coinbase(1, pkh, extra_nonce="x") assert c1.txid != c2.txid # different height assert c1.txid != c3.txid # different extra-nonce assert coinbase_height(c1) == 1 and coinbase_height(c2) == 2def test_block_serialization_round_trip(): txs = [create_coinbase(1, _pkh())] block = build_block(prev_hash="00" * 32, transactions=txs, bits=8, timestamp=1) restored = Block.from_dict(block.to_dict()) assert restored.hash == block.hash assert restored.has_valid_merkle_root()