Skip to content

Commit 509b688

Browse files
committed
light: check the hash equality in odr
1 parent f438fc7 commit 509b688

File tree

2 files changed

+19
-3
lines changed

2 files changed

+19
-3
lines changed

light/odr_util.go

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,17 +19,20 @@ package light
1919
import (
2020
"bytes"
2121
"context"
22+
"errors"
2223
"math/big"
2324

2425
"github.com/ethereum/go-ethereum/common"
2526
"github.com/ethereum/go-ethereum/core"
2627
"github.com/ethereum/go-ethereum/core/rawdb"
2728
"github.com/ethereum/go-ethereum/core/types"
28-
"github.com/ethereum/go-ethereum/crypto"
2929
"github.com/ethereum/go-ethereum/rlp"
3030
)
3131

32-
var sha3Nil = crypto.Keccak256Hash(nil)
32+
// errNonCanonicalHash is returned if the requested chain data doesn't belong
33+
// to the canonical chain. ODR can only retrieve the canonical chain data covered
34+
// by the CHT or Bloom trie for verification.
35+
var errNonCanonicalHash = errors.New("hash is not currently canonical")
3336

3437
// GetHeaderByNumber retrieves the canonical block header corresponding to the
3538
// given number. The returned header is proven by local CHT.
@@ -83,10 +86,13 @@ func GetTd(ctx context.Context, odr OdrBackend, hash common.Hash, number uint64)
8386
if td != nil {
8487
return td, nil
8588
}
86-
_, err := GetHeaderByNumber(ctx, odr, number)
89+
header, err := GetHeaderByNumber(ctx, odr, number)
8790
if err != nil {
8891
return nil, err
8992
}
93+
if header.Hash() != hash {
94+
return nil, errNonCanonicalHash
95+
}
9096
// <hash, number> -> td mapping already be stored in db, get it.
9197
return rawdb.ReadTd(odr.Database(), hash, number), nil
9298
}
@@ -101,6 +107,9 @@ func GetBodyRLP(ctx context.Context, odr OdrBackend, hash common.Hash, number ui
101107
if err != nil {
102108
return nil, errNoHeader
103109
}
110+
if header.Hash() != hash {
111+
return nil, errNonCanonicalHash
112+
}
104113
r := &BlockRequest{Hash: hash, Number: number, Header: header}
105114
if err := odr.Retrieve(ctx, r); err != nil {
106115
return nil, err
@@ -148,6 +157,9 @@ func GetBlockReceipts(ctx context.Context, odr OdrBackend, hash common.Hash, num
148157
if err != nil {
149158
return nil, errNoHeader
150159
}
160+
if header.Hash() != hash {
161+
return nil, errNonCanonicalHash
162+
}
151163
r := &ReceiptsRequest{Hash: hash, Number: number, Header: header}
152164
if err := odr.Retrieve(ctx, r); err != nil {
153165
return nil, err

light/trie.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,10 @@ import (
3030
"github.com/ethereum/go-ethereum/trie"
3131
)
3232

33+
var (
34+
sha3Nil = crypto.Keccak256Hash(nil)
35+
)
36+
3337
func NewState(ctx context.Context, head *types.Header, odr OdrBackend) *state.StateDB {
3438
state, _ := state.New(head.Root, NewStateDatabase(ctx, head, odr), nil)
3539
return state

0 commit comments

Comments
 (0)