In class exercises, November 4, 2014. Exercise 1: Byzantine Agreement 1) Split into 6 groups. Each group is labeled 1 through 6. 2) I will designate groups as "honest" or "Byzantine". (We'll iterate, so don't worry if you're compelled to be honest!) 3) We will carry out a Byzantine agreement protocol (synchronous, unicast, preserving order, bounded communication delay). 4) At the end of the exercise, each group will announce its verdict on who seems to be "honest". 5) "Byzantine" groups may collaborate (assuming there is more than one). Their (joint) goal is to cause "honest" groups to reach incorrect verdicts. For reference, here is the Byzantine agreement algorithm (from Tannenbaum): Step 1: Each process sends a specific value to each other process (reliable unicast) Honest processes send the same value to everyone. Byzantine processes can send whatever they want. Step 2: Each process assembles the values of each process in an ordered vector. Include your own value - result is 6 values. Step 3: Each process sends this vector to each other process (reliable unicast) Honest processes send the same vector to everyone. Byzantine processes can send whatever they want. Step 4: Each process assembles a final value for each other process from the received vectors. (Ignore your own vector at this point). The final value is either a majority value or the special value "UNKNOWN". -------------------- Exercise 2: RPC semantics in the presence of failure (see RA 4) What should happen in each of the following cases? What does this mean for the computation? 1) Client cannot locate service 2) Request from client to server is lost 3) Server crashes after receiving request 4) Reply from server is lost 5) Client crashes after sending request