utils.py 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344
  1. from datetime import datetime
  2. import src.proof_of_work
  3. import src.block
  4. from src.block import *
  5. from src.blockchain import *
  6. from src.crypto import *
  7. from src.transaction import *
  8. import logging
  9. logging.basicConfig(level=logging.INFO, format="%(asctime)s %(levelname)-8s %(message)s")
  10. def extend_blockchain(chain, trans:list=None, verify_res=True):
  11. ts = datetime.utcfromtimestamp(0)
  12. new_block = Block.create(chain, trans, ts)
  13. new_block.hash = new_block.get_hash()
  14. new_chain = chain.try_append(new_block)
  15. assert (new_chain is not None) == verify_res
  16. return new_chain
  17. def create_block(chain, **manipulate_fields):
  18. block = Block.create(chain, [], chain.head.time)
  19. block.hash = b""
  20. obj = block.to_json_compatible()
  21. for k, v in manipulate_fields.items():
  22. assert k != "hash", "manipulating hash not supported"
  23. assert k in obj, "setting an unknown field is useless"
  24. obj[k] = v
  25. block = Block.from_json_compatible(obj)
  26. block.hash = block.get_hash()
  27. return block
  28. def trans_as_input(trans, out_idx=0):
  29. assert len(trans.targets) > out_idx
  30. return TransactionInput(trans.get_hash(), out_idx)
  31. def new_trans(old_trans, out_idx=0, fee=0):
  32. amount = old_trans.targets[out_idx].amount - fee
  33. key = Signing.generate_private_key()
  34. trans = Transaction([trans_as_input(old_trans, out_idx)],
  35. [TransactionTarget(key, amount)])
  36. trans.sign([old_trans.targets[out_idx].recipient_pk])
  37. return trans