environment.py 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. import numpy as np
  2. import math
  3. import random
  4. '''
  5. \class Z is the environment
  6. '''
  7. class Z(object):
  8. def __init__(self, stakeholdes, epoch_length=100):
  9. self.epoch_length=epoch_length
  10. self.stakeholders = np.array(stakeholdes)
  11. self.adversary_mask=np.array([True]*len(stakeholdes))
  12. '''
  13. return genesis data of the current epoch
  14. '''
  15. def get_genesis_data(self):
  16. #TODO implement
  17. pass
  18. @property
  19. def current_leader_vrf_pk(self):
  20. #TODO implement
  21. pass
  22. @property
  23. def current_leader_vrf_g(self):
  24. #TODO implement
  25. pass
  26. #TODO complete
  27. def obfuscate_idx(self, i):
  28. return i
  29. #TODO complete
  30. def deobfuscate_idx(self, i):
  31. return i
  32. def corrupt(self, i):
  33. if i<0 or i>len(self.adversary_mask):
  34. return False
  35. self.adversary_mask[self.deobfuscate_idx(i)]=False
  36. return True
  37. '''
  38. return the length of all parties
  39. '''
  40. def __len__(self):
  41. return len(self.stakeholders)
  42. @property
  43. def length(self):
  44. return len(self.stakeholders)
  45. @property
  46. def honest(self):
  47. return len(self.stakeholders[self.adversary_mask])
  48. def select_epoch_leaders(self, sigma):
  49. def leader_selection_hash(sigma):
  50. Y = np.array(sigma)
  51. y_hypotenuse2 = math.ceil(np.sum(Y[1]**2+Y[2]**2))
  52. return y_hypotenuse2
  53. seed = leader_selection_hash(sigma)
  54. random.seed(seed)
  55. leader_idx=seed%self.length
  56. leader = self.stakeholders[leader_idx]
  57. while not self.adversary_mask[leader_idx]:
  58. leader_idx=random.randint(0,self.length)
  59. #TODO select the following leader for this epoch, note,
  60. # under a single condition that no one is able to predict who is next