consensus,core: shortcut uncle validation
This commit is contained in:
parent
78644f0377
commit
d763b49ae3
@ -191,6 +191,9 @@ func (ethash *Ethash) VerifyUncles(chain consensus.ChainReader, block *types.Blo
|
||||
if len(block.Uncles()) > maxUncles {
|
||||
return errTooManyUncles
|
||||
}
|
||||
if len(block.Uncles()) == 0 {
|
||||
return nil
|
||||
}
|
||||
// Gather the set of past uncles and ancestors
|
||||
uncles, ancestors := mapset.NewSet(), make(map[common.Hash]*types.Header)
|
||||
|
||||
|
@ -34,7 +34,7 @@ import (
|
||||
|
||||
var (
|
||||
EmptyRootHash = DeriveSha(Transactions{})
|
||||
EmptyUncleHash = CalcUncleHash(nil)
|
||||
EmptyUncleHash = rlpHash([]*Header(nil))
|
||||
)
|
||||
|
||||
// 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 {
|
||||
if len(uncles) == 0 {
|
||||
return EmptyUncleHash
|
||||
}
|
||||
return rlpHash(uncles)
|
||||
}
|
||||
|
||||
|
@ -68,3 +68,19 @@ func TestBlockEncoding(t *testing.T) {
|
||||
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)
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user