utils.py 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142
  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_chain = chain.try_append(new_block)
  14. assert (new_chain is not None) == verify_res
  15. return new_chain
  16. def create_block(chain, **manipulate_fields):
  17. block = Block.create(chain, [], chain.head.time)
  18. block.hash = b""
  19. obj = block.to_json_compatible()
  20. for k, v in manipulate_fields.items():
  21. assert k != "hash", "manipulating hash not supported"
  22. assert k in obj, "setting an unknown field is useless"
  23. obj[k] = v
  24. block = Block.from_json_compatible(obj)
  25. return block
  26. def trans_as_input(trans, out_idx=0):
  27. assert len(trans.targets) > out_idx
  28. return TransactionInput(trans.get_hash(), out_idx)
  29. def new_trans(old_trans, out_idx=0, fee=0):
  30. amount = old_trans.targets[out_idx].amount - fee
  31. key = Key.generate_private_key()
  32. trans = Transaction([trans_as_input(old_trans, out_idx)],
  33. [TransactionTarget(key, amount)],datetime.now())
  34. trans.sign([old_trans.targets[out_idx].recipient_pk])
  35. return trans