diff options
author | Péter Szilágyi <peterke@gmail.com> | 2016-07-08 23:48:17 +0800 |
---|---|---|
committer | Péter Szilágyi <peterke@gmail.com> | 2016-07-15 21:52:55 +0800 |
commit | a87089fd2dc08a69a4a4f1ef93db9a2871d819a3 (patch) | |
tree | b1634faefc24ee8b80b9ad9c06ac8df7f409558b /core/block_validator.go | |
parent | 1e24c2e4f428c85c2f83272af2696469cb8f5bed (diff) | |
download | go-tangerine-a87089fd2dc08a69a4a4f1ef93db9a2871d819a3.tar go-tangerine-a87089fd2dc08a69a4a4f1ef93db9a2871d819a3.tar.gz go-tangerine-a87089fd2dc08a69a4a4f1ef93db9a2871d819a3.tar.bz2 go-tangerine-a87089fd2dc08a69a4a4f1ef93db9a2871d819a3.tar.lz go-tangerine-a87089fd2dc08a69a4a4f1ef93db9a2871d819a3.tar.xz go-tangerine-a87089fd2dc08a69a4a4f1ef93db9a2871d819a3.tar.zst go-tangerine-a87089fd2dc08a69a4a4f1ef93db9a2871d819a3.zip |
cmd, core, miner: add extradata validation to consensus rules
Diffstat (limited to 'core/block_validator.go')
-rw-r--r-- | core/block_validator.go | 21 |
1 files changed, 21 insertions, 0 deletions
diff --git a/core/block_validator.go b/core/block_validator.go index c3f959324..73d581328 100644 --- a/core/block_validator.go +++ b/core/block_validator.go @@ -17,6 +17,7 @@ package core import ( + "bytes" "fmt" "math/big" "time" @@ -247,6 +248,26 @@ func ValidateHeader(config *ChainConfig, pow pow.PoW, header *types.Header, pare return &BlockNonceErr{header.Number, header.Hash(), header.Nonce.Uint64()} } } + // 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 } |