69 lines
1.7 KiB
Go
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"
|
|
} |