mirror of
https://github.com/ethereum/go-ethereum.git
synced 2026-05-24 08:49:29 +00:00
sort FromExtWitness input to sanitize it
This commit is contained in:
parent
40dc49e8bc
commit
d82790a19a
2 changed files with 10 additions and 18 deletions
|
|
@ -58,9 +58,11 @@ func (w *Witness) FromExtWitness(ext *ExtWitness) error {
|
||||||
return errors.New("witness must contain at least one header")
|
return errors.New("witness must contain at least one header")
|
||||||
}
|
}
|
||||||
w.Headers = slices.Clone(ext.Headers)
|
w.Headers = slices.Clone(ext.Headers)
|
||||||
if headersAscending(w.Headers) {
|
// don't trust the input and sort headers in reverse order
|
||||||
slices.Reverse(w.Headers)
|
// this is only useful for calling `Root`
|
||||||
}
|
slices.SortFunc(w.Headers, func(a, b *types.Header) int {
|
||||||
|
return b.Number.Cmp(a.Number)
|
||||||
|
})
|
||||||
|
|
||||||
w.Codes = make(map[string]struct{}, len(ext.Codes))
|
w.Codes = make(map[string]struct{}, len(ext.Codes))
|
||||||
for _, code := range ext.Codes {
|
for _, code := range ext.Codes {
|
||||||
|
|
@ -73,20 +75,6 @@ func (w *Witness) FromExtWitness(ext *ExtWitness) error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// headersAscending reports whether headers are in the external witness order,
|
|
||||||
// oldest ancestor first and parent last. The internal witness keeps headers in
|
|
||||||
// the opposite order so Root can retrieve the parent root from Headers[0].
|
|
||||||
func headersAscending(headers []*types.Header) bool {
|
|
||||||
if len(headers) < 2 {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
first, last := headers[0], headers[len(headers)-1]
|
|
||||||
if first == nil || last == nil || first.Number == nil || last.Number == nil {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
return first.Number.Cmp(last.Number) < 0
|
|
||||||
}
|
|
||||||
|
|
||||||
// EncodeRLP serializes a witness as RLP.
|
// EncodeRLP serializes a witness as RLP.
|
||||||
func (w *Witness) EncodeRLP(wr io.Writer) error {
|
func (w *Witness) EncodeRLP(wr io.Writer) error {
|
||||||
return rlp.Encode(wr, w.ToExtWitness())
|
return rlp.Encode(wr, w.ToExtWitness())
|
||||||
|
|
|
||||||
|
|
@ -65,7 +65,11 @@ func TestWitnessFromExtWitnessNormalizesHeaderOrder(t *testing.T) {
|
||||||
headers: []*types.Header{testHeader(1), testHeader(2), testHeader(3)},
|
headers: []*types.Header{testHeader(1), testHeader(2), testHeader(3)},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "legacy internal ordered",
|
name: "not ordered",
|
||||||
|
headers: []*types.Header{testHeader(2), testHeader(3), testHeader(1)},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "internal ordered",
|
||||||
headers: []*types.Header{testHeader(3), testHeader(2), testHeader(1)},
|
headers: []*types.Header{testHeader(3), testHeader(2), testHeader(1)},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue