neo-go/pkg/network/payload/headers.go
Roman Khimov 9f9cf4ae3f network: add getheaders message processing
This one is essential for the consensus nodes as otherwise they won't give out
the blocks they generate making their generation almost useless. It also makes
our networking part more complete.
2019-11-29 11:08:22 +03:00

41 lines
896 B
Go

package payload
import (
"github.com/CityOfZion/neo-go/pkg/core"
"github.com/CityOfZion/neo-go/pkg/io"
log "github.com/sirupsen/logrus"
)
// Headers payload.
type Headers struct {
Hdrs []*core.Header
}
// Users can at most request 2k header.
const (
MaxHeadersAllowed = 2000
)
// DecodeBinary implements Serializable interface.
func (p *Headers) DecodeBinary(br *io.BinReader) {
lenHeaders := br.ReadVarUint()
// C# node does it silently
if lenHeaders > MaxHeadersAllowed {
log.Warnf("received %d headers, capping to %d", lenHeaders, MaxHeadersAllowed)
lenHeaders = MaxHeadersAllowed
}
p.Hdrs = make([]*core.Header, lenHeaders)
for i := 0; i < int(lenHeaders); i++ {
header := &core.Header{}
header.DecodeBinary(br)
p.Hdrs[i] = header
}
}
// EncodeBinary implements Serializable interface.
func (p *Headers) EncodeBinary(bw *io.BinWriter) {
bw.WriteArray(p.Hdrs)
}