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 {
|
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)
|
||||||
|
|
||||||
|
|
|
@ -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)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue