relay.py 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. #!/usr/bin/env python3
  2. import nacl.utils
  3. import nacl.signing
  4. import nacl.public
  5. import network
  6. import dirauth
  7. class Relay(network.Server):
  8. """The class representing an onion relay."""
  9. def __init__(self, dirauthaddrs, bw, flags):
  10. self.consensus = None
  11. self.dirauthaddrs = dirauthaddrs
  12. # Create the identity and onion keys
  13. self.idkey = nacl.signing.SigningKey.generate()
  14. self.onionkey = nacl.public.PrivateKey.generate()
  15. self.name = self.idkey.verify_key.encode(encoder=nacl.encoding.HexEncoder).decode("ascii")
  16. # Bind to the network to get a network address
  17. self.netaddr = network.thenetwork.bind(self)
  18. # Our bandwidth and flags
  19. self.bw = bw
  20. self.flags = flags
  21. # Register for epoch change notification
  22. network.thenetwork.wantepochticks(self, True)
  23. self.uploaddesc()
  24. def newepoch(self, epoch):
  25. self.uploaddesc()
  26. def uploaddesc(self):
  27. # Upload the descriptor for the epoch to come
  28. descdict = dict();
  29. descdict["epoch"] = network.thenetwork.getepoch() + 1
  30. descdict["idkey"] = self.idkey.verify_key
  31. descdict["onionkey"] = self.onionkey.public_key
  32. descdict["addr"] = self.netaddr
  33. descdict["bw"] = self.bw
  34. descdict["flags"] = self.flags
  35. desc = dirauth.RelayDescriptor(descdict)
  36. desc.sign(self.idkey)
  37. desc.verify()
  38. descmsg = dirauth.DirAuthUploadDescMsg(desc)
  39. # Upload them
  40. for a in self.dirauthaddrs:
  41. c = network.thenetwork.connect(self, a)
  42. c.sendmsg(descmsg)
  43. c.close()
  44. if __name__ == '__main__':
  45. # Start some dirauths
  46. numdirauths = 9
  47. dirauthaddrs = []
  48. for i in range(numdirauths):
  49. dira = dirauth.DirAuth(i, numdirauths)
  50. dirauthaddrs.append(network.thenetwork.bind(dira))
  51. # Start some relays
  52. numrelays = 10
  53. for i in range(numrelays):
  54. Relay(dirauthaddrs, 500, 0)
  55. # Tick the epoch
  56. network.thenetwork.nextepoch()
  57. dirauth.DirAuth.consensus.verify(network.thenetwork.dirauthkeys())
  58. print('ticked; epoch=', network.thenetwork.getepoch())