test_verifications.py 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. from .utils import *
  2. errors = 0
  3. def trans_test(fn):
  4. """ Immediately runs a test that requires a blockchain, and a transaction with private key in that blockchain. """
  5. def wrapper():
  6. gen_chain = Blockchain([GENESIS_BLOCK])
  7. assert gen_chain.verify_all()
  8. key = Signing.generate_private_key()
  9. reward_trans = Transaction([], [TransactionTarget(key, gen_chain.compute_blockreward(gen_chain.head))])
  10. chain = extend_blockchain(gen_chain, [reward_trans])
  11. fn(chain, reward_trans)
  12. return wrapper
  13. @trans_test
  14. def test_double_spend1(chain, reward_trans):
  15. trans1 = new_trans(reward_trans)
  16. chain = extend_blockchain(chain, [trans1])
  17. # spending the coin in reward_trans again must fail:
  18. extend_blockchain(chain, [trans1], verify_res=False)
  19. # spending the output of trans1 must work:
  20. assert chain.is_coin_still_valid(trans_as_input(trans1))
  21. @trans_test
  22. def test_double_spend2(chain, reward_trans):
  23. trans1 = new_trans(reward_trans)
  24. trans2 = new_trans(reward_trans)
  25. extend_blockchain(chain, [trans1, trans2], verify_res=False)
  26. @trans_test
  27. def test_double_spend3(chain, reward_trans):
  28. trans1 = Transaction([trans_as_input(reward_trans), trans_as_input(reward_trans)], [])
  29. key = reward_trans.targets[0].recipient_pk
  30. trans1.sign([key, key])
  31. extend_blockchain(chain, [trans1], verify_res=False)
  32. @trans_test
  33. def test_create_money1(chain, reward_trans):
  34. key = reward_trans.targets[0].recipient_pk
  35. # create a transaction where the receiver gets 1 more coin than the sender puts in
  36. target = TransactionTarget(key, reward_trans.targets[0].amount + 1)
  37. trans1 = Transaction([trans_as_input(reward_trans)], [target])
  38. trans1.sign([key])
  39. extend_blockchain(chain, [trans1], verify_res=False)
  40. @trans_test
  41. def test_create_money2(chain, reward_trans):
  42. # create a transaction where we create money by sending a negative amount N to someone
  43. # and the inputs + N to us
  44. key = reward_trans.targets[0].recipient_pk
  45. target1 = TransactionTarget(key, -10)
  46. target2 = TransactionTarget(key, reward_trans.targets[0].amount + 10)
  47. trans1 = Transaction([trans_as_input(reward_trans)], [target1, target2])
  48. trans1.sign([key])
  49. extend_blockchain(chain, [trans1], verify_res=False)