// Update the state according to the information presented in the heartbeat // processHeartbeat uses return codes for testing purposes func (s *State) processHeartbeat(hb *heartbeat, i byte) (err error) { print("Confirming Participant ") println(i) // Add the entropy to UpcomingEntropy th, err := crypto.CalculateTruncatedHash(append(s.upcomingEntropy[:], hb.entropy[:]...)) s.upcomingEntropy = common.Entropy(th) return }
// Update the state according to the information presented in the heartbeat // processHeartbeat uses return codes for testing purposes func (s *State) processHeartbeat(hb *heartbeat, i participantIndex) int { // compare EntropyStage2 to the hash from the previous heartbeat expectedHash, err := crypto.CalculateTruncatedHash(hb.entropyStage2[:]) if err != nil { log.Fatalln(err) } if expectedHash != s.previousEntropyStage1[i] { s.tossParticipant(i) return 1 } // Add the EntropyStage2 to UpcomingEntropy th, err := crypto.CalculateTruncatedHash(append(s.upcomingEntropy[:], hb.entropyStage2[:]...)) s.upcomingEntropy = common.Entropy(th) // store entropyStage1 to compare with next heartbeat from this participant s.previousEntropyStage1[i] = hb.entropyStage1 return 0 }
// Use the entropy stored in the state to generate a random integer [low, high) // randInt only runs during compile(), when the mutexes are already locked // // needs to be converted to return uint64 func (s *State) randInt(low int, high int) (randInt int, err error) { // verify there's a gap between the numbers if low == high { err = fmt.Errorf("low and high cannot be the same number") return } // Convert CurrentEntropy into an int rollingInt := 0 for i := 0; i < 4; i++ { rollingInt = rollingInt << 8 rollingInt += int(s.currentEntropy[i]) } randInt = (rollingInt % (high - low)) + low // Convert random number seed to next value truncatedHash, err := crypto.CalculateTruncatedHash(s.currentEntropy[:]) s.currentEntropy = common.Entropy(truncatedHash) return }