3.4-protocol.py 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. # Section 3.4 from "Streamlet: Textbook Streamlined Blockchains"
  2. from block import Block
  3. from node import Node
  4. # Genesis block is generated.
  5. genesis_block = Block("⊥", 0, '⊥')
  6. genesis_block.notarized = True
  7. genesis_block.finalized = True
  8. # We create some nodes to participate in the Protocol.
  9. # There are in total n nodes numbered.
  10. node0 = Node(0, "clock", "node_password0", genesis_block)
  11. node1 = Node(1, "clock", "node_password1", genesis_block)
  12. node2 = Node(2, "clock", "node_password2", genesis_block)
  13. node3 = Node(3, "clock", "node_password3", genesis_block)
  14. node4 = Node(4, "clock", "node_password4", genesis_block)
  15. node5 = Node(5, "clock", "node_password5", genesis_block)
  16. nodes = [node0, node1, node2, node3, node4, node5]
  17. # We simulate some rounds to test consistency.
  18. epoch = 1
  19. # Nodes receive transactions and broacasts them between them.
  20. # node0 receives input and broadcasts it to rest nodes.
  21. node0.receive_transaction("tx0")
  22. node0.broadcast_transaction([node1, node2, node3, node4, node5], "tx0")
  23. # node1 receives input and broadcasts it to rest nodes.
  24. node1.receive_transaction("tx2")
  25. node1.broadcast_transaction([node0, node2, node3, node4, node5], "tx2")
  26. # node4 receives input and broadcasts it to rest nodes.
  27. node4.receive_transaction("tx3")
  28. node4.broadcast_transaction([node0, node1, node2, node3, node5], "tx3")
  29. # A random leader is selected.
  30. leader = nodes[hash(str(epoch))%len(nodes)]
  31. # Leader forms a block and broadcasts it.
  32. leader.propose_block(epoch, nodes)
  33. # We verify that all nodes have the same blockchain on round end.
  34. assert(node0.output() == node1.output() == node2.output() == node3.output() == node4.output() == node5.output())
  35. epoch = 2
  36. # node3 receives input and broadcasts it to rest nodes.
  37. node3.receive_transaction("tx4")
  38. node3.broadcast_transaction([node0, node1, node2, node4, node5], "tx4")
  39. # node5 receives input and broadcasts it to rest nodes.
  40. node5.receive_transaction("tx5")
  41. node5.broadcast_transaction([node0, node1, node2, node3, node4], "tx5")
  42. # node2 receives input and broadcasts it to rest nodes.
  43. node2.receive_transaction("tx6")
  44. node2.broadcast_transaction([node0, node1, node3, node4, node5], "tx6")
  45. # A random leader is selected.
  46. leader = nodes[hash(str(epoch))%len(nodes)]
  47. # Leader forms a block and broadcasts it.
  48. leader.propose_block(epoch, nodes)
  49. # We verify that all nodes have the same blockchain on round end.
  50. assert(node0.output() == node1.output() == node2.output() == node3.output() == node4.output() == node5.output())
  51. epoch = 3
  52. # node3 receives input and broadcasts it to rest nodes.
  53. node3.receive_transaction("tx7")
  54. node3.broadcast_transaction([node0, node1, node2, node4, node5], "tx7")
  55. # node5 receives input and broadcasts it to rest nodes.
  56. node5.receive_transaction("tx8")
  57. node5.broadcast_transaction([node0, node1, node2, node3, node4], "tx8")
  58. # node2 receives input and broadcasts it to rest nodes.
  59. node2.receive_transaction("tx9")
  60. node2.broadcast_transaction([node0, node1, node3, node4, node5], "tx9")
  61. # A random leader is selected.
  62. leader = nodes[hash(str(epoch))%len(nodes)]
  63. # Leader forms a block and broadcasts it.
  64. leader.propose_block(epoch, nodes)
  65. # We verify that all nodes have the same blockchain on round end.
  66. assert(node0.output() == node1.output() == node2.output() == node3.output() == node4.output() == node5.output())
  67. epoch = 4
  68. # node3 receives input and broadcasts it to rest nodes.
  69. node3.receive_transaction("tx19")
  70. node3.broadcast_transaction([node0, node1, node2, node4, node5], "tx10")
  71. # node5 receives input and broadcasts it to rest nodes.
  72. node5.receive_transaction("tx11")
  73. node5.broadcast_transaction([node0, node1, node2, node3, node4], "tx11")
  74. # node2 receives input and broadcasts it to rest nodes.
  75. node2.receive_transaction("tx12")
  76. node2.broadcast_transaction([node0, node1, node3, node4, node5], "tx12")
  77. # A random leader is selected.
  78. leader = nodes[hash(str(epoch))%len(nodes)]
  79. # Leader forms a block and broadcasts it.
  80. leader.propose_block(epoch, nodes)
  81. # We verify that all nodes have the same blockchain on round end.
  82. assert(node0.output() == node1.output() == node2.output() == node3.output() == node4.output() == node5.output())