streamlet.py 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. from tinysmpc import VirtualMachine, PrivateScalar, SharedScalar
  2. # Generating generals
  3. general0 = VirtualMachine('general0')
  4. general1 = VirtualMachine('general1')
  5. general2 = VirtualMachine('general2')
  6. general3 = VirtualMachine('general3')
  7. # Using a simple number to represent the block for testing purposes
  8. print('General 0 is the leader and shares block 42...')
  9. block = PrivateScalar(42, general0)
  10. shared_block = block.share([general0, general1, general2, general3])
  11. print(general0)
  12. print(general1)
  13. print(general2)
  14. print(general3)
  15. print()
  16. # 1 Stands for vote for, 0 for vote against
  17. print('Generals vote on the block...')
  18. general0_vote = PrivateScalar(1, general0)
  19. general1_vote = PrivateScalar(1, general1)
  20. general2_vote = PrivateScalar(1, general2)
  21. general3_vote = PrivateScalar(0, general3)
  22. shared_general0_vote = general0_vote.share([general0, general1, general2, general3])
  23. shared_general1_vote = general1_vote.share([general0, general1, general2, general3])
  24. shared_general2_vote = general2_vote.share([general0, general1, general2, general3])
  25. shared_general3_vote = general3_vote.share([general0, general1, general2, general3])
  26. print(general0)
  27. print(general1)
  28. print(general2)
  29. print(general3)
  30. print()
  31. # Each general sums votes to notarize block if votes exceed 2n/3
  32. print('Generals check votes...')
  33. votes_thresshold = (2*4)/3
  34. generals_votes_sum = shared_general0_vote + shared_general1_vote + shared_general2_vote + shared_general3_vote
  35. general0_votes_sum = generals_votes_sum.reconstruct(general0)
  36. print('General 0 votes sum: {0}'.format(general0_votes_sum.value))
  37. if (general0_votes_sum.value > votes_thresshold):
  38. print('General 0 will notarize block')
  39. else:
  40. print('General 0 will not notarize block')
  41. general1_votes_sum = generals_votes_sum.reconstruct(general1)
  42. print('General 1 votes sum: {0}'.format(general1_votes_sum.value))
  43. if (general1_votes_sum.value > votes_thresshold):
  44. print('General 1 will notarize block')
  45. else:
  46. print('General 1 will not notarize block')
  47. general2_votes_sum = generals_votes_sum.reconstruct(general2)
  48. print('General 2 votes sum: {0}'.format(general2_votes_sum.value))
  49. if (general2_votes_sum.value > votes_thresshold):
  50. print('General 2 will notarize block')
  51. else:
  52. print('General 2 will not notarize block')
  53. general3_votes_sum = generals_votes_sum.reconstruct(general3)
  54. print('General 3 votes sum: {0}'.format(general3_votes_sum.value))
  55. if (general3_votes_sum.value > votes_thresshold):
  56. print('General 3 will notarize block')
  57. else:
  58. print('General 3 will not notarize block')