mirror of
https://gitlab.com/pulsechaincom/erigon-pulse.git
synced 2025-01-10 04:51:20 +00:00
43 lines
1.0 KiB
Go
43 lines
1.0 KiB
Go
|
package ssz_snappy
|
||
|
|
||
|
import (
|
||
|
"bufio"
|
||
|
"encoding/binary"
|
||
|
"fmt"
|
||
|
"reflect"
|
||
|
|
||
|
ssz "github.com/ferranbt/fastssz"
|
||
|
"github.com/golang/snappy"
|
||
|
"github.com/ledgerwatch/erigon/cmd/lightclient/clparams"
|
||
|
"github.com/ledgerwatch/erigon/cmd/lightclient/sentinel/proto"
|
||
|
"github.com/libp2p/go-libp2p/core/network"
|
||
|
)
|
||
|
|
||
|
func EncodePacket(pkt proto.Packet, stream network.Stream) ([]byte, *snappy.Writer, error) {
|
||
|
if val, ok := pkt.(ssz.Marshaler); ok {
|
||
|
wr := bufio.NewWriter(stream)
|
||
|
sw := snappy.NewWriter(wr)
|
||
|
p := make([]byte, 10)
|
||
|
|
||
|
vin := binary.PutVarint(p, int64(val.SizeSSZ()))
|
||
|
|
||
|
enc, err := val.MarshalSSZ()
|
||
|
if err != nil {
|
||
|
return nil, nil, fmt.Errorf("marshal ssz: %w", err)
|
||
|
}
|
||
|
|
||
|
if len(enc) > int(clparams.MaxChunkSize) {
|
||
|
return nil, nil, fmt.Errorf("chunk size too big")
|
||
|
}
|
||
|
|
||
|
_, err = wr.Write(p[:vin])
|
||
|
if err != nil {
|
||
|
return nil, nil, fmt.Errorf("write varint: %w", err)
|
||
|
}
|
||
|
|
||
|
return enc, sw, nil
|
||
|
}
|
||
|
|
||
|
return nil, nil, fmt.Errorf("packet %s does not implement ssz.Marshaler", reflect.TypeOf(pkt))
|
||
|
}
|