diff options
author | Péter Szilágyi <peterke@gmail.com> | 2015-09-16 15:44:09 +0800 |
---|---|---|
committer | Péter Szilágyi <peterke@gmail.com> | 2015-09-16 15:46:28 +0800 |
commit | 821619e1c356df092f2d82cea0d98996765f3933 (patch) | |
tree | 6b7b637c41f6f20c2c78ab484cf37ed5e2c58f97 /core | |
parent | e9a80518c72e0d5b2da7246a865f4dc4baab2cf9 (diff) | |
download | dexon-821619e1c356df092f2d82cea0d98996765f3933.tar.gz dexon-821619e1c356df092f2d82cea0d98996765f3933.tar.zst dexon-821619e1c356df092f2d82cea0d98996765f3933.zip |
core, eth, miner: use pure header validation
Diffstat (limited to 'core')
-rw-r--r-- | core/block_processor.go | 46 | ||||
-rw-r--r-- | core/block_processor_test.go | 4 |
2 files changed, 24 insertions, 26 deletions
diff --git a/core/block_processor.go b/core/block_processor.go index 1238fda7b..b480948a0 100644 --- a/core/block_processor.go +++ b/core/block_processor.go @@ -213,7 +213,7 @@ func (sm *BlockProcessor) processWithParent(block, parent *types.Block) (logs st txs := block.Transactions() // Block validation - if err = ValidateHeader(sm.Pow, header, parent, false, false); err != nil { + if err = ValidateHeader(sm.Pow, header, parent.Header(), false, false); err != nil { return } @@ -337,7 +337,7 @@ func (sm *BlockProcessor) VerifyUncles(statedb *state.StateDB, block, parent *ty return UncleError("uncle[%d](%x)'s parent is not ancestor (%x)", i, hash[:4], uncle.ParentHash[0:4]) } - if err := ValidateHeader(sm.Pow, uncle, ancestors[uncle.ParentHash], true, true); err != nil { + if err := ValidateHeader(sm.Pow, uncle, ancestors[uncle.ParentHash].Header(), true, true); err != nil { return ValidationError(fmt.Sprintf("uncle[%d](%x) header invalid: %v", i, hash[:4], err)) } } @@ -367,52 +367,50 @@ func (sm *BlockProcessor) GetLogs(block *types.Block) (logs state.Logs, err erro } // See YP section 4.3.4. "Block Header Validity" -// Validates a block. Returns an error if the block is invalid. -func ValidateHeader(pow pow.PoW, block *types.Header, parent *types.Block, checkPow, uncle bool) error { - if big.NewInt(int64(len(block.Extra))).Cmp(params.MaximumExtraDataSize) == 1 { - return fmt.Errorf("Block extra data too long (%d)", len(block.Extra)) +// Validates a header. Returns an error if the header is invalid. +func ValidateHeader(pow pow.PoW, header *types.Header, parent *types.Header, checkPow, uncle bool) error { + if big.NewInt(int64(len(header.Extra))).Cmp(params.MaximumExtraDataSize) == 1 { + return fmt.Errorf("Header extra data too long (%d)", len(header.Extra)) } if uncle { - if block.Time.Cmp(common.MaxBig) == 1 { + if header.Time.Cmp(common.MaxBig) == 1 { return BlockTSTooBigErr } } else { - if block.Time.Cmp(big.NewInt(time.Now().Unix())) == 1 { + if header.Time.Cmp(big.NewInt(time.Now().Unix())) == 1 { return BlockFutureErr } } - if block.Time.Cmp(parent.Time()) != 1 { + if header.Time.Cmp(parent.Time) != 1 { return BlockEqualTSErr } - expd := CalcDifficulty(block.Time.Uint64(), parent.Time().Uint64(), parent.Number(), parent.Difficulty()) - if expd.Cmp(block.Difficulty) != 0 { - return fmt.Errorf("Difficulty check failed for block %v, %v", block.Difficulty, expd) + expd := CalcDifficulty(header.Time.Uint64(), parent.Time.Uint64(), parent.Number, parent.Difficulty) + if expd.Cmp(header.Difficulty) != 0 { + return fmt.Errorf("Difficulty check failed for header %v, %v", header.Difficulty, expd) } - var a, b *big.Int - a = parent.GasLimit() - a = a.Sub(a, block.GasLimit) + a := new(big.Int).Set(parent.GasLimit) + a = a.Sub(a, header.GasLimit) a.Abs(a) - b = parent.GasLimit() + b := new(big.Int).Set(parent.GasLimit) b = b.Div(b, params.GasLimitBoundDivisor) - if !(a.Cmp(b) < 0) || (block.GasLimit.Cmp(params.MinGasLimit) == -1) { - return fmt.Errorf("GasLimit check failed for block %v (%v > %v)", block.GasLimit, a, b) + if !(a.Cmp(b) < 0) || (header.GasLimit.Cmp(params.MinGasLimit) == -1) { + return fmt.Errorf("GasLimit check failed for header %v (%v > %v)", header.GasLimit, a, b) } - num := parent.Number() - num.Sub(block.Number, num) + num := new(big.Int).Set(parent.Number) + num.Sub(header.Number, num) if num.Cmp(big.NewInt(1)) != 0 { return BlockNumberErr } if checkPow { - // Verify the nonce of the block. Return an error if it's not valid - if !pow.Verify(types.NewBlockWithHeader(block)) { - return ValidationError("Block's nonce is invalid (= %x)", block.Nonce) + // Verify the nonce of the header. Return an error if it's not valid + if !pow.Verify(types.NewBlockWithHeader(header)) { + return ValidationError("Header's nonce is invalid (= %x)", header.Nonce) } } - return nil } diff --git a/core/block_processor_test.go b/core/block_processor_test.go index e0b2d3313..538cf4ee5 100644 --- a/core/block_processor_test.go +++ b/core/block_processor_test.go @@ -48,13 +48,13 @@ func TestNumber(t *testing.T) { statedb := state.New(chain.Genesis().Root(), chain.chainDb) header := makeHeader(chain.Genesis(), statedb) header.Number = big.NewInt(3) - err := ValidateHeader(pow, header, chain.Genesis(), false, false) + err := ValidateHeader(pow, header, chain.Genesis().Header(), false, false) if err != BlockNumberErr { t.Errorf("expected block number error, got %q", err) } header = makeHeader(chain.Genesis(), statedb) - err = ValidateHeader(pow, header, chain.Genesis(), false, false) + err = ValidateHeader(pow, header, chain.Genesis().Header(), false, false) if err == BlockNumberErr { t.Errorf("didn't expect block number error") } |