-
Notifications
You must be signed in to change notification settings - Fork 198
/
headerIntegrityVerifier.go
65 lines (53 loc) · 1.76 KB
/
headerIntegrityVerifier.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
package headerCheck
import (
"bytes"
"encoding/hex"
"fmt"
"github.com/ElrondNetwork/elrond-go/core"
"github.com/ElrondNetwork/elrond-go/data"
)
type headerIntegrityVerifier struct {
referenceChainID []byte
}
// TODO: maybe merge this struct and header sig verifier in a single component
// NewHeaderIntegrityVerifier returns a new instance of headerIntegrityVerifier
func NewHeaderIntegrityVerifier(referenceChainID []byte) (*headerIntegrityVerifier, error) {
if len(referenceChainID) == 0 {
return nil, ErrInvalidReferenceChainID
}
return &headerIntegrityVerifier{
referenceChainID: referenceChainID,
}, nil
}
// Verify will check the header's fields such as the chain ID or the software version
func (h *headerIntegrityVerifier) Verify(hdr data.HeaderHandler) error {
err := h.checkSoftwareVersion(hdr)
if err != nil {
return err
}
return h.checkChainID(hdr)
}
// checkSoftwareVersion returns nil if the software version has the correct length
func (h *headerIntegrityVerifier) checkSoftwareVersion(hdr data.HeaderHandler) error {
if len(hdr.GetSoftwareVersion()) == 0 || len(hdr.GetSoftwareVersion()) > core.MaxSoftwareVersionLengthInBytes {
return ErrInvalidSoftwareVersion
}
return nil
}
// checkChainID returns nil if the header's chain ID matches the one provided
// otherwise, it will error
func (h *headerIntegrityVerifier) checkChainID(hdr data.HeaderHandler) error {
if !bytes.Equal(h.referenceChainID, hdr.GetChainID()) {
return fmt.Errorf(
"%w, expected: %s, got %s",
ErrInvalidChainID,
hex.EncodeToString(h.referenceChainID),
hex.EncodeToString(hdr.GetChainID()),
)
}
return nil
}
// IsInterfaceNil returns true if the value under the interface is nil
func (h *headerIntegrityVerifier) IsInterfaceNil() bool {
return h == nil
}