mirror of
https://github.com/ethereum/go-ethereum.git
synced 2026-08-20 10:52:25 +00:00
internal/era: avoid some repetition
This commit is contained in:
parent
de45fcad5f
commit
235d413c2f
1 changed files with 31 additions and 58 deletions
|
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue