blockchain.py 1.1 KB

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