// propagateConfig handles propagation of all configuration-proposals in the identity-service. func (s *Service) propagateConfigHandler(msg network.Body) { log.Lvlf4("Got msg %+v %v", msg, reflect.TypeOf(msg).String()) id := ID(nil) switch msg.(type) { case *ProposeSend: id = msg.(*ProposeSend).ID case *ProposeVote: id = msg.(*ProposeVote).ID default: log.Errorf("Got an unidentified propagation-request: %v", msg) return } if id != nil { sid := s.getIdentityStorage(id) if sid == nil { log.Error("Didn't find entity in", s) return } sid.Lock() defer sid.Unlock() switch msg.(type) { case *ProposeSend: p := msg.(*ProposeSend) sid.Proposed = p.Config sid.Votes = make(map[string]*crypto.SchnorrSig) case *ProposeVote: v := msg.(*ProposeVote) sid.Votes[v.Signer] = v.Signature } } }
// handleCommitChallenge will verify the signature + check if no more than 1/3 // of participants refused to sign. func (bz *ByzCoin) handleChallengeCommit(ch *ChallengeCommit) error { // marshal the block marshalled, err := json.Marshal(bz.tempBlock) if err != nil { return err } ch.Challenge = bz.commit.Challenge(ch.Challenge) // verify if the signature is correct if err := cosi.VerifyCosiSignatureWithException(bz.suite, bz.aggregatedPublic, marshalled, ch.Signature, ch.Exceptions); err != nil { log.Error(bz.Name(), "Verification of the signature failed:", err) bz.signRefusal = true } // Verify if we have no more than 1/3 failed nodes if len(ch.Exceptions) > int(bz.threshold) { log.Errorf("More than 1/3 (%d/%d) refused to sign ! ABORT", len(ch.Exceptions), len(bz.Roster().List)) bz.signRefusal = true } // store the exceptions for later usage bz.tempExceptions = ch.Exceptions log.Lvl3("ByzCoin handle Challenge COMMIT") if bz.IsLeaf() { return bz.startResponseCommit() } // send it down for _, tn := range bz.Children() { err = bz.SendTo(tn, ch) } return nil }