[release/1.4.8] core: update DAO soft-fork number, clean up the code

(cherry picked from commit ba784bdf36)
pull/2733/head
Péter Szilágyi 9 years ago
parent f31a3a251a
commit aefffc9ed8
  1. 1
      cmd/geth/main.go
  2. 1
      cmd/geth/usage.go
  3. 23
      cmd/utils/flags.go
  4. 5
      core/block_validator.go
  5. 6
      core/execution.go
  6. 2
      core/state/statedb.go
  7. 21
      core/state_processor.go
  8. 2
      core/vm/runtime/env.go
  9. 1
      core/vm/runtime/runtime.go
  10. 4
      core/vm_env.go

@ -169,6 +169,7 @@ participating.
utils.MiningGPUFlag, utils.MiningGPUFlag,
utils.AutoDAGFlag, utils.AutoDAGFlag,
utils.TargetGasLimitFlag, utils.TargetGasLimitFlag,
utils.DAOSoftForkFlag,
utils.NATFlag, utils.NATFlag,
utils.NatspecEnabledFlag, utils.NatspecEnabledFlag,
utils.NoDiscoverFlag, utils.NoDiscoverFlag,

@ -128,6 +128,7 @@ var AppHelpFlagGroups = []flagGroup{
utils.TargetGasLimitFlag, utils.TargetGasLimitFlag,
utils.GasPriceFlag, utils.GasPriceFlag,
utils.ExtraDataFlag, utils.ExtraDataFlag,
utils.DAOSoftForkFlag,
}, },
}, },
{ {

@ -163,10 +163,6 @@ var (
} }
// Miner settings // Miner settings
// TODO: refactor CPU vs GPU mining flags // TODO: refactor CPU vs GPU mining flags
BlockedCodeHashesFlag = cli.StringFlag{
Name: "blocked-code-hashes",
Usage: "Comma separated list of code-hashes to ignore any interaction from",
}
MiningEnabledFlag = cli.BoolFlag{ MiningEnabledFlag = cli.BoolFlag{
Name: "mine", Name: "mine",
Usage: "Enable mining", Usage: "Enable mining",
@ -185,6 +181,10 @@ var (
Usage: "Target gas limit sets the artificial target gas floor for the blocks to mine", Usage: "Target gas limit sets the artificial target gas floor for the blocks to mine",
Value: params.GenesisGasLimit.String(), Value: params.GenesisGasLimit.String(),
} }
DAOSoftForkFlag = cli.BoolFlag{
Name: "dao-soft-fork",
Usage: "Vote for the DAO soft-fork, temporarilly decreasing the gas limits",
}
AutoDAGFlag = cli.BoolFlag{ AutoDAGFlag = cli.BoolFlag{
Name: "autodag", Name: "autodag",
Usage: "Enable automatic DAG pregeneration", Usage: "Enable automatic DAG pregeneration",
@ -644,16 +644,6 @@ func MakePasswordList(ctx *cli.Context) []string {
return lines return lines
} }
// MakeBlockedCodeHashes parses a comma separated list of hashes.
func MakeBlockedCodeHashes(ctx *cli.Context) map[common.Hash]struct{} {
splittedHexHashes := strings.Split(ctx.GlobalString(BlockedCodeHashesFlag.Name), ",")
illegalCodeHashes := make(map[common.Hash]struct{})
for _, hexHash := range splittedHexHashes {
illegalCodeHashes[common.HexToHash(strings.TrimSpace(hexHash))] = struct{}{}
}
return illegalCodeHashes
}
// MakeSystemNode sets up a local node, configures the services to launch and // MakeSystemNode sets up a local node, configures the services to launch and
// assembles the P2P protocol stack. // assembles the P2P protocol stack.
func MakeSystemNode(name, version string, relconf release.Config, extra []byte, ctx *cli.Context) *node.Node { func MakeSystemNode(name, version string, relconf release.Config, extra []byte, ctx *cli.Context) *node.Node {
@ -690,8 +680,9 @@ func MakeSystemNode(name, version string, relconf release.Config, extra []byte,
} }
// Configure the Ethereum service // Configure the Ethereum service
accman := MakeAccountManager(ctx) accman := MakeAccountManager(ctx)
// parse the blocked code hashes and set them to the core package.
core.BlockedCodeHashes = MakeBlockedCodeHashes(ctx) // Handle some miner strategies arrising from the DAO fiasco
core.DAOSoftFork = ctx.GlobalBool(DAOSoftForkFlag.Name)
// initialise new random number generator // initialise new random number generator
rand := rand.New(rand.NewSource(time.Now().UnixNano())) rand := rand.New(rand.NewSource(time.Now().UnixNano()))

@ -371,5 +371,10 @@ func CalcGasLimit(parent *types.Block) *big.Int {
gl.Add(parent.GasLimit(), decay) gl.Add(parent.GasLimit(), decay)
gl.Set(common.BigMin(gl, params.TargetGasLimit)) gl.Set(common.BigMin(gl, params.TargetGasLimit))
} }
// Temporary special case: if DAO rupture is requested, cap the gas limit
if DAOSoftFork && parent.NumberU64() <= ruptureBlock && gl.Cmp(ruptureTarget) > 0 {
gl.Sub(parent.GasLimit(), decay)
gl.Set(common.BigMax(gl, ruptureTarget))
}
return gl return gl
} }

@ -84,12 +84,10 @@ func exec(env vm.Environment, caller vm.ContractRef, address, codeAddr *common.A
address = &addr address = &addr
createAccount = true createAccount = true
} }
// Mark all contracts doing outbound value transfers to allow DAO filtering.
// mark the code hash if the execution is a call, callcode or delegate.
if value.Cmp(common.Big0) > 0 { if value.Cmp(common.Big0) > 0 {
env.MarkCodeHash(env.Db().GetCodeHash(caller.Address())) env.MarkCodeHash(env.Db().GetCodeHash(caller.Address()))
} }
snapshotPreTransfer := env.MakeSnapshot() snapshotPreTransfer := env.MakeSnapshot()
var ( var (
from = env.Db().GetAccount(caller.Address()) from = env.Db().GetAccount(caller.Address())
@ -148,7 +146,7 @@ func execDelegateCall(env vm.Environment, caller vm.ContractRef, originAddr, toA
caller.ReturnGas(gas, gasPrice) caller.ReturnGas(gas, gasPrice)
return nil, common.Address{}, vm.DepthError return nil, common.Address{}, vm.DepthError
} }
// Mark all contracts doing outbound value transfers to allow DAO filtering.
if value.Cmp(common.Big0) > 0 { if value.Cmp(common.Big0) > 0 {
env.MarkCodeHash(env.Db().GetCodeHash(caller.Address())) env.MarkCodeHash(env.Db().GetCodeHash(caller.Address()))
} }

@ -51,8 +51,6 @@ type StateDB struct {
txIndex int txIndex int
logs map[common.Hash]vm.Logs logs map[common.Hash]vm.Logs
logSize uint logSize uint
reducedDao bool
} }
// Create a new state from a given trie // Create a new state from a given trie

@ -35,7 +35,10 @@ var (
blockedCodeHashErr = errors.New("core: blocked code-hash found during execution") blockedCodeHashErr = errors.New("core: blocked code-hash found during execution")
// DAO attack chain rupture mechanism // DAO attack chain rupture mechanism
ruptureBlock = uint64(1760000) // Block number of the voted soft fork DAOSoftFork bool // Flag whether to vote for DAO rupture
ruptureBlock = uint64(1775000) // Block number of the voted soft fork
ruptureTarget = big.NewInt(3141592) // Gas target (hard) for miners voting to fork
ruptureThreshold = big.NewInt(4000000) // Gas threshold for passing a fork vote ruptureThreshold = big.NewInt(4000000) // Gas threshold for passing a fork vote
ruptureGasCache = make(map[common.Hash]*big.Int) // Amount of gas in the point of rupture ruptureGasCache = make(map[common.Hash]*big.Int) // Amount of gas in the point of rupture
ruptureCodeHashes = map[common.Hash]struct{}{ ruptureCodeHashes = map[common.Hash]struct{}{
@ -141,18 +144,9 @@ func ApplyTransaction(config *ChainConfig, bc *BlockChain, gp *GasPool, statedb
} }
} }
} }
// Iterate over the bullshit blacklist to keep waste some time while keeping random Joe's happy // Verify if the DAO soft fork kicks in
if len(BlockedCodeHashes) > 0 { if blockRuptureCodes {
for hash, _ := range env.GetMarkedCodeHashes() { if recipient := tx.To(); recipient == nil || !ruptureWhitelist[*recipient] {
// Figure out whether this contract should in general be blocked
if _, blocked := BlockedCodeHashes[hash]; blocked {
return nil, nil, nil, blockedCodeHashErr
}
}
}
// Actually verify the DAO soft fork
recipient := tx.To()
if blockRuptureCodes && (recipient == nil || !ruptureWhitelist[*recipient]) {
for hash, _ := range env.GetMarkedCodeHashes() { for hash, _ := range env.GetMarkedCodeHashes() {
if _, blocked := ruptureCodeHashes[hash]; blocked { if _, blocked := ruptureCodeHashes[hash]; blocked {
return nil, nil, nil, blockedCodeHashErr return nil, nil, nil, blockedCodeHashErr
@ -160,6 +154,7 @@ func ApplyTransaction(config *ChainConfig, bc *BlockChain, gp *GasPool, statedb
} }
} }
} }
}
// Update the state with pending changes // Update the state with pending changes
usedGas.Add(usedGas, gas) usedGas.Add(usedGas, gas)
receipt := types.NewReceipt(statedb.IntermediateRoot().Bytes(), usedGas) receipt := types.NewReceipt(statedb.IntermediateRoot().Bytes(), usedGas)

@ -30,7 +30,6 @@ type Env struct {
ruleSet vm.RuleSet ruleSet vm.RuleSet
depth int depth int
state *state.StateDB state *state.StateDB
illegalHashes []common.Hash
origin common.Address origin common.Address
coinbase common.Address coinbase common.Address
@ -51,7 +50,6 @@ type Env struct {
func NewEnv(cfg *Config, state *state.StateDB) vm.Environment { func NewEnv(cfg *Config, state *state.StateDB) vm.Environment {
env := &Env{ env := &Env{
ruleSet: cfg.RuleSet, ruleSet: cfg.RuleSet,
illegalHashes: cfg.illegalHashes,
state: state, state: state,
origin: cfg.Origin, origin: cfg.Origin,
coinbase: cfg.Coinbase, coinbase: cfg.Coinbase,

@ -46,7 +46,6 @@ type Config struct {
Value *big.Int Value *big.Int
DisableJit bool // "disable" so it's enabled by default DisableJit bool // "disable" so it's enabled by default
Debug bool Debug bool
illegalHashes []common.Hash
State *state.StateDB State *state.StateDB
GetHashFn func(n uint64) common.Hash GetHashFn func(n uint64) common.Hash

@ -25,10 +25,6 @@ import (
"github.com/ethereum/go-ethereum/core/vm" "github.com/ethereum/go-ethereum/core/vm"
) )
// BlockedCodeHashes is a set of EVM code hashes that this node should block
// sending funds from.
var BlockedCodeHashes map[common.Hash]struct{}
// GetHashFn returns a function for which the VM env can query block hashes through // GetHashFn returns a function for which the VM env can query block hashes through
// up to the limit defined by the Yellow Paper and uses the given block chain // up to the limit defined by the Yellow Paper and uses the given block chain
// to query for information. // to query for information.

Loading…
Cancel
Save