transaction.py 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. import hashlib
  2. import json
  3. import time
  4. import uuid
  5. from lib.contract import Contract
  6. class Transaction:
  7. def __init__(self):
  8. self.id = None
  9. self.data = None
  10. self.hash_value = None
  11. self.locked = False
  12. self.timestamp = 0
  13. self.sender = None
  14. self.receiver = None
  15. def from_serialized(self, jsonobj: str):
  16. obj = json.loads(jsonobj)
  17. self.id = obj['id']
  18. self.data = obj['data']
  19. self.timestamp = obj['timestamp']
  20. self.sender = obj['sender']
  21. self.receiver = obj['receiver']
  22. def set_serialized_contract(self, serialized):
  23. if not self.locked:
  24. self.id = str(uuid.uuid1())
  25. self.data = serialized
  26. self.log('Serialized contract set')
  27. return True
  28. return False
  29. def set_contract(self, contract: Contract):
  30. if not self.locked:
  31. self.id = str(uuid.uuid1())
  32. self.data = contract.serialize()
  33. self.log(f'Contract set: {contract.id} | {contract.title}')
  34. return True
  35. return False
  36. def serialize(self, out_json=False):
  37. obj = {
  38. 'id': self.id,
  39. 'timestamp': self.timestamp,
  40. 'data': self.data,
  41. 'sender': self.sender,
  42. 'receiver': self.receiver
  43. }
  44. self.log(f'Serialized')
  45. if out_json:
  46. return json.dumps(obj, sort_keys=True)
  47. return obj
  48. def lock_hash_finish(self):
  49. if not self.locked:
  50. self.timestamp = int(time.time())
  51. self.locked = True
  52. self.hash()
  53. self.log('Locked')
  54. return True
  55. return False
  56. def hash(self):
  57. string_object = json.dumps(self.data, sort_keys=True)
  58. block_string = string_object.encode()
  59. raw_hash = hashlib.sha256(block_string)
  60. hex_hash = raw_hash.hexdigest()
  61. self.hash_value = hex_hash
  62. self.log(f'Hashed: {self.hash_value}')
  63. return hex_hash
  64. def log(self, text):
  65. print(f'[ TRANS ] {text}')