internal/era: avoid some repetition

This commit is contained in:
Martin Holst Swende 2023-05-29 16:47:13 +02:00 committed by lightclient
parent de45fcad5f
commit 235d413c2f
No known key found for this signature in database
GPG key ID: 75C916AFEE20183E

View file

@ -113,7 +113,6 @@ func NewReader(r ReadAtSeeker) (*Reader, error) {
return &Reader{ return &Reader{
r: r, r: r,
e: e2store.NewReader(r), e: e2store.NewReader(r),
buf: [8]byte{},
next: m.start, next: m.start,
length: length, length: length,
metadata: m, metadata: m,
@ -148,27 +147,6 @@ func (r *Reader) Read() (*types.Block, types.Receipts, error) {
return block, receipts, nil return block, receipts, nil
} }
// ReadHeader reads the header number n RLP.
func (r *Reader) ReadHeaderRLP(n uint64) ([]byte, error) {
if n < r.metadata.start || r.metadata.start+r.metadata.count < n {
return nil, fmt.Errorf("request out-of-bounds: want %d, start: %d, count: %d", n, r.metadata.start, r.metadata.count)
}
// Read the specified block's offset from the block index.
off, err := r.readOffset(n)
if err != nil {
return nil, fmt.Errorf("error reading block offset: %w", err)
}
// Read header.
var e e2store.Entry
if _, err := r.e.ReadAt(&e, off); err != nil {
return nil, err
}
if e.Type != TypeCompressedHeader {
return nil, fmt.Errorf("expected header entry, got %x", e.Type)
}
return io.ReadAll(snappy.NewReader(bytes.NewReader(e.Value)))
}
func skipN(r *Reader, off int64, n int) (int64, error) { func skipN(r *Reader, off int64, n int) (int64, error) {
for i := 0; i < n; i++ { for i := 0; i < n; i++ {
length, err := r.e.LengthAt(off) length, err := r.e.LengthAt(off)
@ -180,8 +158,8 @@ func skipN(r *Reader, off int64, n int) (int64, error) {
return off, nil return off, nil
} }
// ReadBodyRLP reads the block body number n RLP. // readBlob reads an entry of data.
func (r *Reader) ReadBodyRLP(n uint64) ([]byte, error) { func (r *Reader) readEntry(n uint64, skip int) (*e2store.Entry, error) {
if n < r.metadata.start || r.metadata.start+r.metadata.count < n { if n < r.metadata.start || r.metadata.start+r.metadata.count < n {
return nil, fmt.Errorf("request out-of-bounds: want %d, start: %d, count: %d", n, r.metadata.start, r.metadata.count) return nil, fmt.Errorf("request out-of-bounds: want %d, start: %d, count: %d", n, r.metadata.start, r.metadata.count)
} }
@ -190,13 +168,34 @@ func (r *Reader) ReadBodyRLP(n uint64) ([]byte, error) {
if err != nil { if err != nil {
return nil, fmt.Errorf("error reading block offset: %w", err) return nil, fmt.Errorf("error reading block offset: %w", err)
} }
// Skip over header entry to get to body. // Skip to the requested entry.
if off, err = skipN(r, off, 1); err != nil { if off, err = skipN(r, off, skip); err != nil {
return nil, err return nil, err
} }
// Read body. // Read entry.
var e e2store.Entry var entry e2store.Entry
if _, err := r.e.ReadAt(&e, off); err != nil { if _, err := r.e.ReadAt(&entry, off); err != nil {
return nil, err
}
return &entry, nil
}
// ReadHeader reads the header number n RLP.
func (r *Reader) ReadHeaderRLP(n uint64) ([]byte, error) {
e, err := r.readEntry(n, 0)
if err != nil {
return nil, err
}
if e.Type != TypeCompressedHeader {
return nil, fmt.Errorf("expected header entry, got %x", e.Type)
}
return io.ReadAll(snappy.NewReader(bytes.NewReader(e.Value)))
}
// ReadBodyRLP reads the block body number n RLP.
func (r *Reader) ReadBodyRLP(n uint64) ([]byte, error) {
e, err := r.readEntry(n, 1)
if err != nil {
return nil, err return nil, err
} }
if e.Type != TypeCompressedBody { if e.Type != TypeCompressedBody {
@ -207,21 +206,8 @@ func (r *Reader) ReadBodyRLP(n uint64) ([]byte, error) {
// ReadReceiptsRLP reads the receipts RLP associated with number n. // ReadReceiptsRLP reads the receipts RLP associated with number n.
func (r *Reader) ReadReceiptsRLP(n uint64) ([]byte, error) { func (r *Reader) ReadReceiptsRLP(n uint64) ([]byte, error) {
if n < r.metadata.start || r.metadata.start+r.metadata.count < n { e, err := r.readEntry(n, 2)
return nil, fmt.Errorf("request out-of-bounds: want %d, start: %d, count: %d", n, r.metadata.start, r.metadata.count)
}
// Read the specified block's offset from the block index.
off, err := r.readOffset(n)
if err != nil { if err != nil {
return nil, fmt.Errorf("error reading block offset: %w", err)
}
// Skip over header entry to get to body.
if off, err = skipN(r, off, 2); err != nil {
return nil, err
}
// Read receipts.
var e e2store.Entry
if _, err := r.e.ReadAt(&e, off); err != nil {
return nil, err return nil, err
} }
if e.Type != TypeCompressedReceipts { if e.Type != TypeCompressedReceipts {
@ -232,25 +218,12 @@ func (r *Reader) ReadReceiptsRLP(n uint64) ([]byte, error) {
// ReadTotalDifficulty reads the total difficulty of block number n. // ReadTotalDifficulty reads the total difficulty of block number n.
func (r *Reader) ReadTotalDifficulty(n uint64) (*big.Int, error) { func (r *Reader) ReadTotalDifficulty(n uint64) (*big.Int, error) {
if n < r.metadata.start || r.metadata.start+r.metadata.count < n { e, err := r.readEntry(n, 3)
return nil, fmt.Errorf("request out-of-bounds: want %d, start: %d, count: %d", n, r.metadata.start, r.metadata.count)
}
// Read the specified block's offset from the block index.
off, err := r.readOffset(n)
if err != nil { if err != nil {
return nil, fmt.Errorf("error reading block offset: %w", err)
}
// Skip over header entry to get to body.
if off, err = skipN(r, off, 3); err != nil {
return nil, err
}
// Read receipts.
var e e2store.Entry
if _, err := r.e.ReadAt(&e, off); err != nil {
return nil, err return nil, err
} }
if e.Type != TypeTotalDifficulty { if e.Type != TypeTotalDifficulty {
return nil, fmt.Errorf("expected receipts entry, got %x", e.Type) return nil, fmt.Errorf("expected TD entry, got %x", e.Type)
} }
return new(big.Int).SetBytes(reverseOrder(e.Value)), nil return new(big.Int).SetBytes(reverseOrder(e.Value)), nil
} }