Skip to content

Commit 31b3334

Browse files
committed
cmd/utils, eth: minor polishes on whitelist code
1 parent 48b70ec commit 31b3334

File tree

2 files changed

+29
-41
lines changed

2 files changed

+29
-41
lines changed

cmd/utils/flags.go

Lines changed: 18 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1077,30 +1077,25 @@ func setEthash(ctx *cli.Context, cfg *eth.Config) {
10771077
}
10781078

10791079
func setWhitelist(ctx *cli.Context, cfg *eth.Config) {
1080-
if ctx.GlobalIsSet(WhitelistFlag.Name) {
1081-
entries := strings.Split(ctx.String(WhitelistFlag.Name), ",")
1082-
whitelist := make(map[uint64]common.Hash)
1083-
for _, entry := range entries {
1084-
split := strings.SplitN(entry, "=", 2)
1085-
if len(split) != 2 {
1086-
Fatalf("invalid whitelist entry: %s", entry)
1087-
}
1088-
1089-
bn, err := strconv.ParseUint(split[0], 0, 64)
1090-
if err != nil {
1091-
Fatalf("Invalid whitelist block number %s: %v", split[0], err)
1092-
}
1093-
1094-
hash := common.Hash{}
1095-
err = hash.UnmarshalText([]byte(split[1]))
1096-
if err != nil {
1097-
Fatalf("Invalid whitelist hash %s: %v", split[1], err)
1098-
}
1099-
1100-
whitelist[bn] = hash
1080+
whitelist := ctx.GlobalString(WhitelistFlag.Name)
1081+
if whitelist == "" {
1082+
return
1083+
}
1084+
cfg.Whitelist = make(map[uint64]common.Hash)
1085+
for _, entry := range strings.Split(whitelist, ",") {
1086+
parts := strings.Split(entry, "=")
1087+
if len(parts) != 2 {
1088+
Fatalf("Invalid whitelist entry: %s", entry)
11011089
}
1102-
1103-
cfg.Whitelist = whitelist
1090+
number, err := strconv.ParseUint(parts[0], 0, 64)
1091+
if err != nil {
1092+
Fatalf("Invalid whitelist block number %s: %v", parts[0], err)
1093+
}
1094+
var hash common.Hash
1095+
if err = hash.UnmarshalText([]byte(parts[1])); err != nil {
1096+
Fatalf("Invalid whitelist hash %s: %v", parts[1], err)
1097+
}
1098+
cfg.Whitelist[number] = hash
11041099
}
11051100
}
11061101

eth/handler.go

Lines changed: 11 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@
1717
package eth
1818

1919
import (
20-
"bytes"
2120
"encoding/json"
2221
"errors"
2322
"fmt"
@@ -311,17 +310,13 @@ func (pm *ProtocolManager) handle(p *peer) error {
311310
}
312311
}()
313312
}
314-
315313
// If we have any explicit whitelist block hashes, request them
316-
for bn := range pm.whitelist {
317-
p.Log().Debug("Requesting whitelist block", "number", bn)
318-
if err := p.RequestHeadersByNumber(bn, 1, 0, false); err != nil {
319-
p.Log().Error("whitelist request failed", "err", err, "number", bn, "peer", p.id)
314+
for number := range pm.whitelist {
315+
if err := p.RequestHeadersByNumber(number, 1, 0, false); err != nil {
320316
return err
321317
}
322318
}
323-
324-
// main loop. handle incoming messages.
319+
// Handle incoming messages until the connection is torn down
325320
for {
326321
if err := pm.handleMsg(p); err != nil {
327322
p.Log().Debug("Ethereum message handling failed", "err", err)
@@ -466,16 +461,6 @@ func (pm *ProtocolManager) handleMsg(p *peer) error {
466461
// Filter out any explicitly requested headers, deliver the rest to the downloader
467462
filter := len(headers) == 1
468463
if filter {
469-
// Check for any responses not matching our whitelist
470-
if expected, ok := pm.whitelist[headers[0].Number.Uint64()]; ok {
471-
actual := headers[0].Hash()
472-
if !bytes.Equal(expected.Bytes(), actual.Bytes()) {
473-
p.Log().Info("Dropping peer with non-matching whitelist block", "number", headers[0].Number.Uint64(), "hash", actual, "expected", expected)
474-
return errors.New("whitelist block mismatch")
475-
}
476-
p.Log().Debug("Whitelist block verified", "number", headers[0].Number.Uint64(), "hash", expected)
477-
}
478-
479464
// If it's a potential DAO fork check, validate against the rules
480465
if p.forkDrop != nil && pm.chainconfig.DAOForkBlock.Cmp(headers[0].Number) == 0 {
481466
// Disable the fork drop timer
@@ -490,6 +475,14 @@ func (pm *ProtocolManager) handleMsg(p *peer) error {
490475
p.Log().Debug("Verified to be on the same side of the DAO fork")
491476
return nil
492477
}
478+
// Otherwise if it's a whitelisted block, validate against the set
479+
if want, ok := pm.whitelist[headers[0].Number.Uint64()]; ok {
480+
if hash := headers[0].Hash(); want != hash {
481+
p.Log().Info("Whitelist mismatch, dropping peer", "number", headers[0].Number.Uint64(), "hash", hash, "want", want)
482+
return errors.New("whitelist block mismatch")
483+
}
484+
p.Log().Debug("Whitelist block verified", "number", headers[0].Number.Uint64(), "hash", want)
485+
}
493486
// Irrelevant of the fork checks, send the header to the fetcher just in case
494487
headers = pm.fetcher.FilterHeaders(p.id, headers, time.Now())
495488
}

0 commit comments

Comments
 (0)