Skip to content

Commit edbc71d

Browse files
feat: require non-zero headers for Verify (#184)
* docs: document trusted header in Verify * stricted verification * Update verify.go Co-authored-by: Hlib Kanunnikov <[email protected]> --------- Co-authored-by: Hlib Kanunnikov <[email protected]>
1 parent 1c1458b commit edbc71d

File tree

2 files changed

+31
-2
lines changed

2 files changed

+31
-2
lines changed

headertest/verify_test.go

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,18 +14,21 @@ import (
1414
func TestVerify(t *testing.T) {
1515
suite := NewTestSuite(t)
1616
trusted := suite.GenDummyHeaders(1)[0]
17+
var zero *DummyHeader
1718

1819
next := func() *DummyHeader {
1920
next := *suite.NextHeader()
2021
return &next
2122
}
2223

2324
tests := []struct {
25+
trusted *DummyHeader
2426
prepare func() *DummyHeader
2527
err error
2628
soft bool
2729
}{
2830
{
31+
trusted: trusted,
2932
prepare: func() *DummyHeader {
3033
untrusted := next()
3134
untrusted.VerifyFailure = true
@@ -34,6 +37,7 @@ func TestVerify(t *testing.T) {
3437
err: ErrDummyVerify,
3538
},
3639
{
40+
trusted: trusted,
3741
prepare: func() *DummyHeader {
3842
untrusted := next()
3943
untrusted.VerifyFailure = true
@@ -43,17 +47,20 @@ func TestVerify(t *testing.T) {
4347
soft: true, // soft because non-adjacent
4448
},
4549
{
50+
trusted: trusted,
4651
prepare: func() *DummyHeader {
4752
return next()
4853
},
4954
},
5055
{
56+
trusted: trusted,
5157
prepare: func() *DummyHeader {
5258
return nil
5359
},
5460
err: header.ErrZeroHeader,
5561
},
5662
{
63+
trusted: trusted,
5764
prepare: func() *DummyHeader {
5865
untrusted := next()
5966
untrusted.Chainid = "gtmb"
@@ -62,6 +69,7 @@ func TestVerify(t *testing.T) {
6269
err: header.ErrWrongChainID,
6370
},
6471
{
72+
trusted: trusted,
6573
prepare: func() *DummyHeader {
6674
untrusted := next()
6775
untrusted.Timestamp = untrusted.Timestamp.Truncate(time.Minute * 10)
@@ -70,6 +78,7 @@ func TestVerify(t *testing.T) {
7078
err: header.ErrUnorderedTime,
7179
},
7280
{
81+
trusted: trusted,
7382
prepare: func() *DummyHeader {
7483
untrusted := next()
7584
untrusted.Timestamp = untrusted.Timestamp.Add(time.Minute)
@@ -78,6 +87,7 @@ func TestVerify(t *testing.T) {
7887
err: header.ErrFromFuture,
7988
},
8089
{
90+
trusted: trusted,
8191
prepare: func() *DummyHeader {
8292
untrusted := next()
8393
untrusted.HeightI = trusted.Height()
@@ -86,18 +96,33 @@ func TestVerify(t *testing.T) {
8696
err: header.ErrKnownHeader,
8797
},
8898
{
99+
trusted: trusted,
89100
prepare: func() *DummyHeader {
90101
untrusted := next()
91102
untrusted.HeightI += 100000
92103
return untrusted
93104
},
94105
err: header.ErrHeightFromFuture,
95106
},
107+
{
108+
trusted: trusted,
109+
prepare: func() *DummyHeader {
110+
return zero
111+
},
112+
err: header.ErrZeroHeader,
113+
},
114+
{
115+
trusted: zero,
116+
prepare: func() *DummyHeader {
117+
return next()
118+
},
119+
err: header.ErrZeroHeader,
120+
},
96121
}
97122

98123
for i, test := range tests {
99124
t.Run(strconv.Itoa(i), func(t *testing.T) {
100-
err := header.Verify(trusted, test.prepare(), 0)
125+
err := header.Verify(test.trusted, test.prepare(), 0)
101126
if test.err != nil {
102127
var verErr *header.VerifyError
103128
assert.ErrorAs(t, err, &verErr)

verify.go

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,9 @@ import (
1111
const DefaultHeightThreshold uint64 = 80000 // ~ 14 days of 15 second headers
1212

1313
// Verify verifies untrusted Header against trusted following general Header checks and
14-
// custom user-specific checks defined in Header.Verify
14+
// custom user-specific checks defined in Header.Verify.
1515
//
16+
// Given headers must be non-zero
1617
// If heightThreshold is zero, uses DefaultHeightThreshold.
1718
// Always returns VerifyError.
1819
func Verify[H Header[H]](trstd, untrstd H, heightThreshold uint64) error {
@@ -50,6 +51,9 @@ func verify[H Header[H]](trstd, untrstd H, heightThreshold uint64) error {
5051
heightThreshold = DefaultHeightThreshold
5152
}
5253

54+
if trstd.IsZero() {
55+
return ErrZeroHeader
56+
}
5357
if untrstd.IsZero() {
5458
return ErrZeroHeader
5559
}

0 commit comments

Comments
 (0)