53 lines
1.4 KiB
Go
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
|
|
} |