commit inicial do projeto
This commit is contained in:
45
internal/oracle/validator.go
Normal file
45
internal/oracle/validator.go
Normal file
@ -0,0 +1,45 @@
|
||||
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")
|
||||
}
|
||||
Reference in New Issue
Block a user