Files
2025-05-23 10:44:32 -03:00

69 lines
1.7 KiB
Go

package simple
import (
"dejo_node/internal/consensus"
"dejo_node/internal/transactions"
"errors"
"fmt"
"go.uber.org/zap"
)
// SimpleEngine é uma implementação básica do mecanismo de consenso.
type SimpleEngine struct {
logger *zap.SugaredLogger
}
// New cria uma nova instância do SimpleEngine
func New() consensus.Engine {
logger, _ := zap.NewProduction()
return &SimpleEngine{
logger: logger.Sugar().Named("consensus.simple"),
}
}
// CanPropose retorna true para permitir que qualquer nó proponha blocos.
func (s *SimpleEngine) CanPropose() bool {
s.logger.Debug("verificando permissão para propor bloco: permitido")
return true
}
// Finalize aplica validações de integridade ao bloco antes de ser aceito.
func (s *SimpleEngine) Finalize(block *transactions.Block) error {
if block == nil {
s.logger.Error("bloco recebido é nulo")
return errors.New("bloco nulo")
}
s.logger.Infow("finalizando bloco",
"index", block.Index,
"txns", len(block.Txns),
"hash", block.Hash,
)
if len(block.Txns) == 0 {
s.logger.Warn("bloco sem transações")
return fmt.Errorf("bloco sem transações não é permitido")
}
if block.Timestamp == 0 {
s.logger.Warn("timestamp ausente")
return fmt.Errorf("timestamp ausente no bloco")
}
hashRecalculado := block.CalculateHash()
if block.Hash != hashRecalculado {
s.logger.Errorw("hash inconsistente",
"esperado", hashRecalculado,
"recebido", block.Hash,
)
return fmt.Errorf("hash inconsistente: esperado %s, calculado %s", block.Hash, hashRecalculado)
}
s.logger.Infow("bloco finalizado com sucesso", "index", block.Index)
return nil
}
// Name retorna o identificador deste mecanismo de consenso.
func (s *SimpleEngine) Name() string {
return "SimpleEngine"
}