test_proto.py 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. from time import sleep
  2. import logging
  3. #logging.basicConfig(level=logging.DEBUG)
  4. from src.protocol import Protocol
  5. from src.mining import Miner
  6. from src.block import GENESIS_BLOCK
  7. from src.crypto import Key
  8. from src.transaction import Transaction, TransactionInput, TransactionTarget
  9. from datetime import datetime
  10. def test_proto():
  11. reward_key = Key.generate_private_key()
  12. proto1 = Protocol([], GENESIS_BLOCK, 1337)
  13. proto2 = Protocol([("127.0.0.1", 1337)], GENESIS_BLOCK, 1338)
  14. miner1 = Miner(proto1, reward_key)
  15. miner2 = Miner(proto2, reward_key)
  16. miner2.start_mining()
  17. miner1.start_mining()
  18. try:
  19. sleep(5)
  20. target_key = Key.generate_private_key()
  21. chain = miner1.chainbuilder.primary_block_chain
  22. reward_trans = chain.blocks[20].transactions[0]
  23. trans_in = TransactionInput(reward_trans.get_hash(), 0)
  24. trans_targ = TransactionTarget(target_key, reward_trans.targets[0].amount)
  25. trans = Transaction([trans_in], [trans_targ], datetime.utcnow())
  26. trans.sign([reward_key])
  27. assert trans.verify(chain, set()), "transaction should be valid"
  28. proto1.received('transaction', trans.to_json_compatible(), None)
  29. print("============Transaction=============")
  30. sleep(10)
  31. chain_len1 = len(miner1.chainbuilder.primary_block_chain.blocks)
  32. chain_len2 = len(miner2.chainbuilder.primary_block_chain.blocks)
  33. print("Length of chain of miner 1: {}".format(chain_len1))
  34. print("Length of chain of miner 2: {}".format(chain_len2))
  35. finally:
  36. miner1.shutdown()
  37. miner2.shutdown()
  38. assert max(chain_len1, chain_len2) * 90 // 100 < min(chain_len1, chain_len2), "chain lengths are VERY different"
  39. chain1 = miner1.chainbuilder.primary_block_chain
  40. hashes1 = [b.hash for b in chain1.blocks[:chain_len1 * 90 // 100]]
  41. hashes2 = [b.hash for b in miner2.chainbuilder.primary_block_chain.blocks[:chain_len1 * 90 // 100]]
  42. assert hashes1 == hashes2, "first 90% of chains should be identical"
  43. assert not trans.verify(miner1.chainbuilder.primary_block_chain, set()), "inserted transaction should be spent and therefore invalid"
  44. assert TransactionInput(trans.get_hash(), 0) in chain1.unspent_coins, "someone spent our coins?"