Merge pull request #19411 from holiman/uncle_abort_early

consensus,core: shortcut uncle validation
This commit is contained in:
Péter Szilágyi 2019-04-08 13:02:33 +03:00 committed by GitHub
commit 3996bc1ad9
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 23 additions and 1 deletions

View File

@ -191,6 +191,9 @@ func (ethash *Ethash) VerifyUncles(chain consensus.ChainReader, block *types.Blo
if len(block.Uncles()) > maxUncles { if len(block.Uncles()) > maxUncles {
return errTooManyUncles return errTooManyUncles
} }
if len(block.Uncles()) == 0 {
return nil
}
// Gather the set of past uncles and ancestors // Gather the set of past uncles and ancestors
uncles, ancestors := mapset.NewSet(), make(map[common.Hash]*types.Header) uncles, ancestors := mapset.NewSet(), make(map[common.Hash]*types.Header)

View File

@ -34,7 +34,7 @@ import (
var ( var (
EmptyRootHash = DeriveSha(Transactions{}) EmptyRootHash = DeriveSha(Transactions{})
EmptyUncleHash = CalcUncleHash(nil) EmptyUncleHash = rlpHash([]*Header(nil))
) )
// A BlockNonce is a 64-bit hash which proves (combined with the // A BlockNonce is a 64-bit hash which proves (combined with the
@ -324,6 +324,9 @@ func (c *writeCounter) Write(b []byte) (int, error) {
} }
func CalcUncleHash(uncles []*Header) common.Hash { func CalcUncleHash(uncles []*Header) common.Hash {
if len(uncles) == 0 {
return EmptyUncleHash
}
return rlpHash(uncles) return rlpHash(uncles)
} }

View File

@ -68,3 +68,19 @@ func TestBlockEncoding(t *testing.T) {
t.Errorf("encoded block mismatch:\ngot: %x\nwant: %x", ourBlockEnc, blockEnc) t.Errorf("encoded block mismatch:\ngot: %x\nwant: %x", ourBlockEnc, blockEnc)
} }
} }
func TestUncleHash(t *testing.T) {
uncles := make([]*Header, 0)
h := CalcUncleHash(uncles)
exp := common.HexToHash("1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347")
if h != exp {
t.Fatalf("empty uncle hash is wrong, got %x != %x", h, exp)
}
}
func BenchmarkUncleHash(b *testing.B) {
uncles := make([]*Header, 0)
b.ResetTimer()
for i := 0; i < b.N; i++ {
CalcUncleHash(uncles)
}
}