diff --git a/block_manager.go b/block_manager.go index 04d45f434c..21162f36b5 100644 --- a/block_manager.go +++ b/block_manager.go @@ -114,30 +114,34 @@ func (bm *BlockManager) CalculateTD(block *ethutil.Block) bool { } // Validates the current block. Returns an error if the block was invalid, -// an uncle or anything that isn't on the current block chain +// an uncle or anything that isn't on the current block chain. +// Validation validates easy over difficult (dagger takes longer time = difficult) func (bm *BlockManager) ValidateBlock(block *ethutil.Block) error { // TODO - // 1. Check if the nonce of the block is valid // 2. Check if the difficulty is correct // Check if we have the parent hash, if it isn't known we discard it // Reasons might be catching up or simply an invalid block - if bm.bc.HasBlock(block.PrevHash) { - // Check each uncle's previous hash. In order for it to be valid - // is if it has the same block hash as the current - for _, uncle := range block.Uncles { - if uncle.PrevHash != block.PrevHash { - if Debug { - log.Printf("Uncle prvhash mismatch %x %x\n", block.PrevHash, uncle.PrevHash) - } - - return errors.New("Mismatching Prvhash from uncle") + if !bm.bc.HasBlock(block.PrevHash) { + return errors.New("Block's parent unknown") + } + + // Check each uncle's previous hash. In order for it to be valid + // is if it has the same block hash as the current + for _, uncle := range block.Uncles { + if uncle.PrevHash != block.PrevHash { + if Debug { + log.Printf("Uncle prvhash mismatch %x %x\n", block.PrevHash, uncle.PrevHash) } + + return errors.New("Mismatching Prvhash from uncle") } - } else { - return errors.New("Block's parent unknown") } + // Verify the nonce of the block. Return an error if it's not valid + if !DaggerVerify(block.Hash(), block.Nonce) { + return errors.New("Block's nonce is invalid") + } return nil }