blockchain.py 1.1 KB

123456789101112131415161718192021222324252627282930313233343536373839
  1. from ouroboros.logger import Logger
  2. '''
  3. Non-forkable Blockchain for simplicity
  4. #TODO implement forkable chain
  5. '''
  6. class Blockchain(object):
  7. def __init__(self, R, genesis_time):
  8. self.blocks = []
  9. self.log = Logger(self, genesis_time)
  10. self.R = R # how many slots in single epoch
  11. @property
  12. def epoch_length(self):
  13. return self.R
  14. def __repr__(self):
  15. buff=''
  16. for i in range(len(self.blocks)):
  17. buff+=str(self.blocks[i])
  18. return buff
  19. def __getitem__(self, i):
  20. return self.blocks[i]
  21. def __len__(self):
  22. return len(self.blocks)
  23. def __add_block(self, block):
  24. self.blocks.append(block)
  25. def add_epoch(self, epoch):
  26. assert epoch!=None, 'epoch cant be None'
  27. assert len(epoch)>0 , 'epoch cant be zero-sized'
  28. for idx, block in enumerate(epoch):
  29. if not block.empty:
  30. self.__add_block(block)
  31. else:
  32. self.log.warn(f"an empty block at index of index: {block.index},\nrelative slot:{idx}\nabsolute slot: {self.length*idx+block.slot}")