Browse Source

cmd/utils, core, params: explicitly pick reprice fork for fast sync

Péter Szilágyi 9 years ago
parent
commit
8639b0fae9
4 changed files with 32 additions and 7 deletions
  1. 7 0
      cmd/utils/flags.go
  2. 9 1
      core/block_validator.go
  3. 3 1
      core/config.go
  4. 13 5
      params/util.go

+ 7 - 0
cmd/utils/flags.go

@@ -804,6 +804,13 @@ func MakeChainConfigFromDb(ctx *cli.Context, db ethdb.Database) *core.ChainConfi
 			config.HomesteadGasRepriceBlock = params.MainNetHomesteadGasRepriceBlock
 		}
 	}
+	if config.HomesteadGasRepriceHash == (common.Hash{}) {
+		if ctx.GlobalBool(TestNetFlag.Name) {
+			config.HomesteadGasRepriceHash = params.TestNetHomesteadGasRepriceHash
+		} else {
+			config.HomesteadGasRepriceHash = params.MainNetHomesteadGasRepriceHash
+		}
+	}
 	// Force override any existing configs if explicitly requested
 	switch {
 	case ctx.GlobalBool(SupportDAOFork.Name):

+ 9 - 1
core/block_validator.go

@@ -248,7 +248,15 @@ func ValidateHeader(config *ChainConfig, pow pow.PoW, header *types.Header, pare
 		}
 	}
 	// If all checks passed, validate the extra-data field for hard forks
-	return ValidateDAOHeaderExtraData(config, header)
+	if err := ValidateDAOHeaderExtraData(config, header); err != nil {
+		return err
+	}
+	if config.HomesteadGasRepriceBlock != nil && config.HomesteadGasRepriceBlock.Cmp(header.Number) == 0 {
+		if config.HomesteadGasRepriceHash != (common.Hash{}) && config.HomesteadGasRepriceHash != header.Hash() {
+			return ValidationError("Homestead gas reprice fork hash mismatch: have 0x%x, want 0x%x", header.Hash(), config.HomesteadGasRepriceBlock)
+		}
+	}
+	return nil
 }
 
 // CalcDifficulty is the difficulty adjustment algorithm. It returns

+ 3 - 1
core/config.go

@@ -20,6 +20,7 @@ import (
 	"errors"
 	"math/big"
 
+	"github.com/ethereum/go-ethereum/common"
 	"github.com/ethereum/go-ethereum/core/vm"
 	"github.com/ethereum/go-ethereum/params"
 )
@@ -36,7 +37,8 @@ type ChainConfig struct {
 	DAOForkBlock   *big.Int `json:"daoForkBlock"`   // TheDAO hard-fork switch block (nil = no fork)
 	DAOForkSupport bool     `json:"daoForkSupport"` // Whether the nodes supports or opposes the DAO hard-fork
 
-	HomesteadGasRepriceBlock *big.Int `json:"homesteadGasRepriceBlock"` // Homestead gas reprice switch block (nil = no fork)
+	HomesteadGasRepriceBlock *big.Int    `json:"homesteadGasRepriceBlock"` // Homestead gas reprice switch block (nil = no fork)
+	HomesteadGasRepriceHash  common.Hash `json:"homesteadGasRepriceHash"`  // Homestead gas reprice switch block hash (fast sync aid)
 
 	VmConfig vm.Config `json:"-"`
 }

+ 13 - 5
params/util.go

@@ -16,11 +16,19 @@
 
 package params
 
-import "math/big"
+import (
+	"math/big"
+
+	"github.com/ethereum/go-ethereum/common"
+)
 
 var (
-	TestNetHomesteadBlock           = big.NewInt(494000)  // Testnet homestead block
-	MainNetHomesteadBlock           = big.NewInt(1150000) // Mainnet homestead block
-	TestNetHomesteadGasRepriceBlock = big.NewInt(1783000) // Test net gas reprice block
-	MainNetHomesteadGasRepriceBlock = big.NewInt(2463000) // Main net gas reprice block
+	TestNetHomesteadBlock = big.NewInt(494000)  // Testnet homestead block
+	MainNetHomesteadBlock = big.NewInt(1150000) // Mainnet homestead block
+
+	TestNetHomesteadGasRepriceBlock = big.NewInt(1783000) // Testnet gas reprice block
+	MainNetHomesteadGasRepriceBlock = big.NewInt(2463000) // Mainnet gas reprice block
+
+	TestNetHomesteadGasRepriceHash = common.HexToHash("0xf376243aeff1f256d970714c3de9fd78fa4e63cf63e32a51fe1169e375d98145") // Testnet gas reprice block hash (used by fast sync)
+	MainNetHomesteadGasRepriceHash = common.HexToHash("0x2086799aeebeae135c246c65021c82b4e15a2c451340993aacfd2751886514f0") // Mainnet gas reprice block hash (used by fast sync)
 )