Files
dejo-node/internal/consensus/pos.go
2025-05-23 10:44:32 -03:00

53 lines
1.4 KiB
Go

package consensus
import (
"crypto/sha256"
"encoding/hex"
"errors"
"fmt"
"dejo_node/internal/transactions"
)
// PoSEngine é uma implementação simples e fake de um consenso Proof-of-Stake.
type PoSEngine struct {
validators []string
}
// NewPoSEngine cria um novo mecanismo de consenso PoS.
func NewPoSEngine(validators []string) *PoSEngine {
return &PoSEngine{
validators: validators,
}
}
// ValidateBlock verifica se o bloco tem dados válidos.
func (p *PoSEngine) ValidateBlock(block *transactions.Block) error {
if block == nil {
return errors.New("bloco nulo")
}
if block.Index == 0 && block.PrevHash != "" {
return errors.New("bloco gênese não deve ter PrevHash")
}
if len(block.Txns) == 0 {
return errors.New("bloco sem transações")
}
return nil
}
// SelectProposer seleciona pseudo-aleatoriamente um validador com base na altura.
func (p *PoSEngine) SelectProposer(height uint64) (string, error) {
if len(p.validators) == 0 {
return "", errors.New("nenhum validador registrado")
}
hash := sha256.Sum256([]byte(fmt.Sprintf("%d", height)))
index := int(hash[0]) % len(p.validators)
return p.validators[index], nil
}
// FinalizeBlock simula a finalização de bloco assinando seu hash.
func (p *PoSEngine) FinalizeBlock(block *transactions.Block) error {
hash := sha256.Sum256([]byte(fmt.Sprintf("%d:%s:%d", block.Index, block.PrevHash, len(block.Txns))))
block.Hash = hex.EncodeToString(hash[:])
return nil
}