mirror of
https://github.com/ethereum/go-ethereum.git
synced 2026-08-11 14:33:52 +00:00
core/types: deserialize receipt RLP based on list size
This commit is contained in:
parent
a301c75029
commit
50f71a5024
1 changed files with 26 additions and 11 deletions
|
|
@ -87,27 +87,42 @@ func (r *Receipt) DecodeRLP(s *rlp.Stream) error {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
// Attempt to deserialize into a Metropolis format
|
list, _, err := rlp.SplitList(raw)
|
||||||
var metro metropolisReceiptRLP
|
if err != nil {
|
||||||
if err = rlp.DecodeBytes(raw, &metro); err == nil { // Keep the error in the outer scope!
|
return err
|
||||||
|
}
|
||||||
|
items, err := rlp.CountValues(list)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
// Deserialize based on the number of content items
|
||||||
|
switch items {
|
||||||
|
case 3:
|
||||||
|
// Metropolis receipts have 3 components
|
||||||
|
var metro metropolisReceiptRLP
|
||||||
|
if err := rlp.DecodeBytes(raw, &metro); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
r.CumulativeGasUsed = metro.CumulativeGasUsed
|
r.CumulativeGasUsed = metro.CumulativeGasUsed
|
||||||
r.Bloom = metro.Bloom
|
r.Bloom = metro.Bloom
|
||||||
r.Logs = metro.Logs
|
r.Logs = metro.Logs
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
|
||||||
// Metropolis deserialization failed, attempt homestead
|
case 4:
|
||||||
var home homesteadReceiptRLP
|
// Homestead receipts have 4 components
|
||||||
if err = rlp.DecodeBytes(raw, &home); err == nil { // Keep the error in the outer scope!
|
var home homesteadReceiptRLP
|
||||||
|
if err := rlp.DecodeBytes(raw, &home); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
r.PostState = home.PostState[:]
|
r.PostState = home.PostState[:]
|
||||||
r.CumulativeGasUsed = home.CumulativeGasUsed
|
r.CumulativeGasUsed = home.CumulativeGasUsed
|
||||||
r.Bloom = home.Bloom
|
r.Bloom = home.Bloom
|
||||||
r.Logs = home.Logs
|
r.Logs = home.Logs
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
|
|
||||||
|
default:
|
||||||
|
return fmt.Errorf("invalid receipt components: %v", items)
|
||||||
}
|
}
|
||||||
// All decoders failed, return the last error
|
|
||||||
return err
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// String implements the Stringer interface.
|
// String implements the Stringer interface.
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue