qplasthop_node.py 3.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. from dht_common import SIZE_OF_HASH, SIZE_OF_IP_ADDRESS, SIZE_OF_OT_VALUE, SIZE_OF_KEY, SIZE_OF_SIGNATURE, SIZE_OF_TIMESTAMP
  2. from qp_node import QP_Quorum
  3. from collections import defaultdict
  4. class QPLastHop_Quorum(QP_Quorum):
  5. def __init__(self, quorumID, documentSize, numNodes, numItems=0, table=[]):
  6. QP_Quorum.__init__(self, quorumID, documentSize, numNodes, numItems, table)
  7. self.databaseAccesses = [defaultdict(lambda: 0) for i in range(self.numNodes)]
  8. def get_database_accesses(self, whichNode):
  9. return self.databaseAccesses[whichNode]
  10. def get_final_table_ranges(self, whichNode, numKeys, numSignatures):
  11. # Asker's ID
  12. sizeOfRequest = SIZE_OF_HASH
  13. # timestamp
  14. sizeOfRequest += SIZE_OF_TIMESTAMP
  15. # keys in request
  16. sizeOfRequest += SIZE_OF_KEY * numKeys
  17. # signatures in request
  18. sizeOfRequest += SIZE_OF_SIGNATURE * numSignatures
  19. # The set of hashes in the item store
  20. sizeOfResponse = SIZE_OF_HASH * self.numItems
  21. # Then the entrywise encrypted item store
  22. sizeOfResponse += self.documentSize * self.numItems
  23. # Then the OT prime values
  24. sizeOfResponse += 2 * SIZE_OF_OT_VALUE * self.numItems
  25. # Then, finally, a signature to tie it together
  26. sizeOfResponse += SIZE_OF_SIGNATURE
  27. self.nodeNumRounds[whichNode] += 1
  28. self.nodeNumMessagesSent[whichNode] += 1
  29. self.nodeNumMessagesRecv[whichNode] += 1
  30. self.nodeNumBytesSent[whichNode] += sizeOfResponse
  31. self.nodeNumBytesRecv[whichNode] += sizeOfRequest
  32. self.databaseAccesses[whichNode][self.numItems] += 1
  33. return self.numItems
  34. # This shouldn't be used, just here to make sure you don't try the RCP_Quorum function it overrides
  35. def retrieve(self):
  36. return None
  37. def OT_retrieve(self, whichNode, numKeys, numSignatures):
  38. # Asker's ID
  39. sizeOfRequest = SIZE_OF_HASH
  40. # timestamp
  41. sizeOfRequest += SIZE_OF_TIMESTAMP
  42. # keys in request
  43. sizeOfRequest += SIZE_OF_KEY * numKeys
  44. # signatures in request
  45. sizeOfRequest += SIZE_OF_SIGNATURE * numSignatures
  46. # actual OT crypto usage
  47. sizeOfRequest += SIZE_OF_OT_VALUE
  48. # signature on whole thing
  49. sizeOfRequest += SIZE_OF_SIGNATURE
  50. sizeOfResponse = SIZE_OF_OT_VALUE + SIZE_OF_SIGNATURE
  51. self.nodeNumRounds[whichNode] += 1
  52. self.nodeNumMessagesSent[whichNode] += 1
  53. self.nodeNumMessagesRecv[whichNode] += 1
  54. self.nodeNumBytesSent[whichNode] += sizeOfResponse
  55. self.nodeNumBytesRecv[whichNode] += sizeOfRequest
  56. # TODO: Add unit tests for size calculations
  57. if __name__ == "__main__":
  58. SIZE_OF_DOCUMENTS_IN_TEST = 1024
  59. NUM_NODES_PER_QUORUM_IN_TEST = 10
  60. test = QPLastHop_Quorum(0, SIZE_OF_DOCUMENTS_IN_TEST, NUM_NODES_PER_QUORUM_IN_TEST)
  61. [test.insert() for x in range(NUM_NODES_PER_QUORUM_IN_TEST)]
  62. [test.get_final_table_ranges(x, 0, 0) for x in range(NUM_NODES_PER_QUORUM_IN_TEST)]
  63. print("Getting final table ranges fires on all nodes correctly.")
  64. [test.OT_retrieve(x) for x in range(NUM_NODES_PER_QUORUM_IN_TEST)]
  65. print("OT retrieval fires on all nodes correctly.")