45 lines
1.0 KiB
Go
45 lines
1.0 KiB
Go
package oracle
|
|
|
|
import (
|
|
"fmt"
|
|
"math"
|
|
"time"
|
|
)
|
|
|
|
// ValidateMajority recebe múltiplas leituras e tenta achar um consenso baseado na maioria simples.
|
|
func ValidateMajority(data []*OracleData, tolerance float64) (*OracleData, error) {
|
|
if len(data) == 0 {
|
|
return nil, fmt.Errorf("nenhum dado recebido para validar")
|
|
}
|
|
|
|
count := make(map[float64]int)
|
|
latest := make(map[float64]time.Time)
|
|
|
|
for _, d := range data {
|
|
rounded := math.Round(d.Value/tolerance) * tolerance // agrupar valores similares
|
|
count[rounded]++
|
|
if d.Time.After(latest[rounded]) {
|
|
latest[rounded] = d.Time
|
|
}
|
|
}
|
|
|
|
// Encontrar o valor com mais votos
|
|
var maxVal float64
|
|
var maxCount int
|
|
for val, c := range count {
|
|
if c > maxCount {
|
|
maxVal = val
|
|
maxCount = c
|
|
}
|
|
}
|
|
|
|
// Retornar o OracleData mais recente com esse valor
|
|
for _, d := range data {
|
|
rounded := math.Round(d.Value/tolerance) * tolerance
|
|
if rounded == maxVal && d.Time.Equal(latest[maxVal]) {
|
|
return d, nil
|
|
}
|
|
}
|
|
|
|
return nil, fmt.Errorf("nenhum consenso válido encontrado")
|
|
} |