epoch.py 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. from ouroboros.utils import state_hash
  2. from ouroboros.logger import Logger
  3. class Epoch(list):
  4. '''
  5. epoch spans R slots,
  6. maximum number of block in Epoch is R
  7. epoch must start with gensis block B0
  8. '''
  9. def __init__(self, gensis_block, R, epoch_idx, genesis_time):
  10. self.gensis_block=gensis_block
  11. self.blocks = []
  12. self.R = R #maximum epoch legnth, and it's a fixed property of the system
  13. self.e = epoch_idx
  14. self.n=0
  15. self.log = Logger(genesis_time)
  16. @property
  17. def slot(self):
  18. return self.gensis_block.sl
  19. @property
  20. def length(self):
  21. return len(self.blocks)
  22. @property
  23. def index(self):
  24. return self.e
  25. @property
  26. def genesis(self):
  27. if self.length==0:
  28. return None
  29. return self.blocks[0]
  30. def __len__(self):
  31. return self.length
  32. def add_block(self, block):
  33. if len(self.blocks)>0 and not block.state==state_hash(self.blocks[-1]):
  34. #TODO we dealing with corrupt stakeholder,
  35. # action to be taken
  36. # the caller of the add_block should execute (corrupt,U)
  37. pass
  38. if self.length>=self.R:
  39. self.log.error(f"epoch length: {self.length} can't exceed Epoch's length: {self.R}")
  40. self.blocks.append(block)
  41. def __iter__(self):
  42. self.n=0
  43. return self
  44. def __next__(self):
  45. blk=None
  46. for i in range(self.length):
  47. try:
  48. blk=self.blocks[self.n]
  49. except IndexError:
  50. raise StopIteration
  51. self.n+=1
  52. return blk