diff options
author | Péter Szilágyi <peterke@gmail.com> | 2016-07-14 16:22:58 +0800 |
---|---|---|
committer | Péter Szilágyi <peterke@gmail.com> | 2016-07-15 21:52:55 +0800 |
commit | 2c2e389b778b490fcaf14d9cc45a750647ca5c68 (patch) | |
tree | 0534f50f26ce5f62b1acaf0c18667b6cc0998103 /core | |
parent | 3291235711082759cd7b70253c02150a80d57011 (diff) | |
download | go-tangerine-2c2e389b778b490fcaf14d9cc45a750647ca5c68.tar.gz go-tangerine-2c2e389b778b490fcaf14d9cc45a750647ca5c68.tar.zst go-tangerine-2c2e389b778b490fcaf14d9cc45a750647ca5c68.zip |
cmd, core, eth, miner, params, tests: finalize the DAO fork
Diffstat (limited to 'core')
-rw-r--r-- | core/block_validator.go | 29 | ||||
-rw-r--r-- | core/dao.go | 74 | ||||
-rw-r--r-- | core/state_processor.go | 17 |
3 files changed, 75 insertions, 45 deletions
diff --git a/core/block_validator.go b/core/block_validator.go index 3b597310e..e5bc6178b 100644 --- a/core/block_validator.go +++ b/core/block_validator.go @@ -17,7 +17,6 @@ package core import ( - "bytes" "fmt" "math/big" "time" @@ -249,33 +248,7 @@ func ValidateHeader(config *ChainConfig, pow pow.PoW, header *types.Header, pare } } // If all checks passed, validate the extra-data field for hard forks - return ValidateHeaderExtraData(config, header) -} - -// ValidateHeaderExtraData validates the extra-data field of a block header to -// ensure it conforms to hard-fork rules. -func ValidateHeaderExtraData(config *ChainConfig, header *types.Header) error { - // DAO hard-fork extension to the header validity: a) if the node is no-fork, - // do not accept blocks in the [fork, fork+10) range with the fork specific - // extra-data set; b) if the node is pro-fork, require blocks in the specific - // range to have the unique extra-data set. - if daoBlock := config.DAOForkBlock; daoBlock != nil { - // Check whether the block is among the fork extra-override range - limit := new(big.Int).Add(daoBlock, params.DAOForkExtraRange) - if daoBlock.Cmp(header.Number) <= 0 && header.Number.Cmp(limit) < 0 { - // Depending whether we support or oppose the fork, verrift the extra-data contents - if config.DAOForkSupport { - if bytes.Compare(header.Extra, params.DAOForkBlockExtra) != 0 { - return ValidationError("DAO pro-fork bad block extra-data: 0x%x", header.Extra) - } - } else { - if bytes.Compare(header.Extra, params.DAOForkBlockExtra) == 0 { - return ValidationError("DAO no-fork bad block extra-data: 0x%x", header.Extra) - } - } - } - } - return nil + return ValidateDAOHeaderExtraData(config, header) } // CalcDifficulty is the difficulty adjustment algorithm. It returns diff --git a/core/dao.go b/core/dao.go new file mode 100644 index 000000000..e315c9884 --- /dev/null +++ b/core/dao.go @@ -0,0 +1,74 @@ +// Copyright 2016 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>. + +package core + +import ( + "bytes" + "math/big" + + "github.com/ethereum/go-ethereum/core/state" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/params" +) + +// ValidateDAOHeaderExtraData validates the extra-data field of a block header to +// ensure it conforms to DAO hard-fork rules. +// +// DAO hard-fork extension to the header validity: +// a) if the node is no-fork, do not accept blocks in the [fork, fork+10) range +// with the fork specific extra-data set +// b) if the node is pro-fork, require blocks in the specific range to have the +// unique extra-data set. +func ValidateDAOHeaderExtraData(config *ChainConfig, header *types.Header) error { + // Short circuit validation if the node doesn't care about the DAO fork + if config.DAOForkBlock == nil { + return nil + } + // Make sure the block is within the fork's modified extra-data range + limit := new(big.Int).Add(config.DAOForkBlock, params.DAOForkExtraRange) + if header.Number.Cmp(config.DAOForkBlock) < 0 || header.Number.Cmp(limit) >= 0 { + return nil + } + // Depending whether we support or oppose the fork, validate the extra-data contents + if config.DAOForkSupport { + if bytes.Compare(header.Extra, params.DAOForkBlockExtra) != 0 { + return ValidationError("DAO pro-fork bad block extra-data: 0x%x", header.Extra) + } + } else { + if bytes.Compare(header.Extra, params.DAOForkBlockExtra) == 0 { + return ValidationError("DAO no-fork bad block extra-data: 0x%x", header.Extra) + } + } + // All ok, header has the same extra-data we expect + return nil +} + +// ApplyDAOHardFork modifies the state database according to the DAO hard-fork +// rules, transferring all balances of a set of DAO accounts to a single refund +// contract. +func ApplyDAOHardFork(statedb *state.StateDB) { + // Retrieve the contract to refund balances into + refund := statedb.GetOrNewStateObject(params.DAORefundContract) + + // Move every DAO account and extra-balance account funds into the refund contract + for _, addr := range params.DAODrainList { + if account := statedb.GetStateObject(addr); account != nil { + refund.AddBalance(account.Balance()) + account.SetBalance(new(big.Int)) + } + } +} diff --git a/core/state_processor.go b/core/state_processor.go index 6a418a62d..fd8e9762e 100644 --- a/core/state_processor.go +++ b/core/state_processor.go @@ -25,7 +25,6 @@ import ( "github.com/ethereum/go-ethereum/crypto" "github.com/ethereum/go-ethereum/logger" "github.com/ethereum/go-ethereum/logger/glog" - "github.com/ethereum/go-ethereum/params" ) var ( @@ -134,19 +133,3 @@ func AccumulateRewards(statedb *state.StateDB, header *types.Header, uncles []*t } statedb.AddBalance(header.Coinbase, reward) } - -// ApplyDAOHardFork modifies the state database according to the DAO hard-fork -// rules, transferring all balances of a set of DAO accounts to a single refund -// contract. -func ApplyDAOHardFork(statedb *state.StateDB) { - // Retrieve the contract to refund balances into - refund := statedb.GetOrNewStateObject(params.DAORefundContract) - - // Move every DAO account and extra-balance account funds into the refund contract - for _, addr := range params.DAODrainList { - if account := statedb.GetStateObject(addr); account != nil { - refund.AddBalance(account.Balance()) - account.SetBalance(new(big.Int)) - } - } -} |