epoch.py 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  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.log = Logger(genesis_time)
  15. @property
  16. def slot(self):
  17. return self.gensis_block.sl
  18. @property
  19. def length(self):
  20. return len(self.blocks)
  21. @property
  22. def index(self):
  23. return self.e
  24. @property
  25. def genesis(self):
  26. if self.length==0:
  27. return None
  28. return self.blocks[0]
  29. @property
  30. def coffee(self):
  31. epoch_fee = 0
  32. for blk in self.blocks:
  33. epoch_fee += blk.data.coffee
  34. return epoch_fee
  35. def __len__(self):
  36. return self.length
  37. def add_block(self, block):
  38. if len(self.blocks)>0 and not block.state==state_hash(self.blocks[-1]):
  39. #TODO we dealing with corrupt stakeholder,
  40. # action to be taken
  41. # the caller of the add_block should execute (corrupt,U)
  42. pass
  43. if self.length>=self.R:
  44. self.log.error(f"epoch length: {self.length} can't exceed Epoch's length: {self.R}")
  45. self.blocks.append(block)
  46. def __iter__(self):
  47. self.n=0
  48. return self
  49. def __next__(self):
  50. blk=None
  51. if self.n <= self.length:
  52. try:
  53. blk=self.blocks[self.n]
  54. self.n+=1
  55. return blk
  56. except IndexError:
  57. raise StopIteration