68 lines
1.5 KiB
Go
68 lines
1.5 KiB
Go
package sync
|
|
|
|
import (
|
|
"encoding/json"
|
|
"fmt"
|
|
"io"
|
|
|
|
"dejo_node/internal/transactions"
|
|
|
|
network "github.com/libp2p/go-libp2p/core/network"
|
|
)
|
|
|
|
type SyncMessage struct {
|
|
Type string `json:"type"`
|
|
Height int64 `json:"height,omitempty"`
|
|
Block *transactions.Block `json:"block,omitempty"`
|
|
}
|
|
|
|
func (s *SyncManager) handleStream(stream network.Stream) {
|
|
fmt.Println("📥 [SYNC] Conexão de:", stream.Conn().RemotePeer())
|
|
defer stream.Close()
|
|
|
|
decoder := json.NewDecoder(stream)
|
|
encoder := json.NewEncoder(stream)
|
|
|
|
for {
|
|
var msg SyncMessage
|
|
if err := decoder.Decode(&msg); err != nil {
|
|
if err == io.EOF {
|
|
return
|
|
}
|
|
fmt.Println("Erro ao decodificar mensagem de sync:", err)
|
|
return
|
|
}
|
|
|
|
switch msg.Type {
|
|
case "RequestHeight":
|
|
latest, err := s.BlockStore.GetLatestBlock()
|
|
if err != nil {
|
|
fmt.Println("Erro ao obter bloco mais recente:", err)
|
|
return
|
|
}
|
|
height := int64(latest.Index)
|
|
resp := SyncMessage{
|
|
Type: "ResponseHeight",
|
|
Height: height,
|
|
}
|
|
_ = encoder.Encode(resp)
|
|
fmt.Println("↩️ Respondendo altura:", height)
|
|
|
|
case "RequestBlock":
|
|
blk, err := s.BlockStore.GetBlockByIndex(int(msg.Height))
|
|
if err != nil {
|
|
fmt.Println("❌ Erro ao buscar bloco:", err)
|
|
return
|
|
}
|
|
resp := SyncMessage{
|
|
Type: "ResponseBlock",
|
|
Block: blk,
|
|
}
|
|
_ = encoder.Encode(resp)
|
|
fmt.Printf("📤 Enviando bloco altura %d\n", msg.Height)
|
|
|
|
default:
|
|
fmt.Println("Mensagem de sync desconhecida:", msg.Type)
|
|
}
|
|
}
|
|
} |