| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657 |
- import math
- from ouroboros.logger import Logger
- '''
- Non-forkable Blockchain for simplicity
- #TODO implement forkable chain
- '''
- class Blockchain(object):
- def __init__(self, R, genesis_time):
- self.blocks = []
- self.log = Logger(self, genesis_time)
- self.R = R # how many slots in single epoch
- self.epochs = []
-
- @property
- def epoch_length(self):
- return self.R
- def __repr__(self):
- buff=''
- for e in range(len(self.epochs)):
- for b in range(len(e)):
- buff+=str(b)+'\n'
- return buff
- '''
- @return: epoch reference
- '''
- def __getitem__(self, i):
- e_idx = math.floor(i/self.epoch_length)
- e_blk_idx = i%self.epoch_length
- return self.epochs[e_idx][e_blk_idx]
- '''
- @return: number of blocks
- '''
- def __len__(self):
- return len(self.epochs*self.epoch_length)
- '''
- def __add_block(self, block):
- self.blocks.append(block)
-
- def add_epoch(self, epoch):
- assert epoch!=None, 'epoch cant be None'
- assert len(epoch)>0 , 'epoch cant be zero-sized'
- for idx, block in enumerate(epoch):
- if not block.empty:
- self.__add_block(block)
- else:
- self.log.warn(f"an empty block at index of index: {block.index},\nrelative slot:{idx}\nabsolute slot: {self.length*idx+block.slot}")
- '''
- def append(self, epoch):
- assert epoch!=None, 'epoch cant be None'
- assert len(epoch)>0 , 'epoch cant be zero-sized'
- assert len(epoch)==self.epoch_length
- self.append(epoch)
|