package consensus import "log" // CheckQuorum verifica se 2/3 dos validadores (por quantidade) assinaram. func CheckQuorum(votes map[string]string, totalValidators int) (bool, string) { voteCounts := make(map[string]int) for _, hash := range votes { voteCounts[hash]++ } quorum := (2 * totalValidators) / 3 for hash, count := range voteCounts { if count > quorum { return true, hash } } return false, "" } // CheckQuorumWeighted verifica se votos representam 2/3 do stake total considerando peers online. func CheckQuorumWeighted(votes map[string]string, valSet *ValidatorSet, liveness *LivenessMonitor) (bool, string) { totalStake := uint64(0) for _, val := range valSet.Validators { if liveness.IsAlive(val.Address) { totalStake += val.Stake } } required := (2 * totalStake) / 3 log.Printf("🔍 Total stake online: %d | Quórum necessário: %d\n", totalStake, required) weighted := make(map[string]uint64) for validator, hash := range votes { val, ok := valSet.ValidatorByAddress(validator) if !ok { log.Printf("⚠️ Validador %s não encontrado no conjunto\n", validator) continue } if !liveness.IsAlive(val.Address) { log.Printf("⚠️ Validador %s está OFFLINE\n", val.Address) continue } log.Printf("✅ Voto de %s para hash %s com %d tokens\n", val.Address, hash, val.Stake) weighted[hash] += val.Stake } for hash, sum := range weighted { log.Printf("📊 Hash %s recebeu %d tokens\n", hash, sum) if sum > required { log.Printf("🎯 Quórum atingido para hash %s\n", hash) return true, hash } } log.Println("❌ Quórum NÃO atingido") return false, "" }