Skip to content

Commit 3d520fa

Browse files
ScottyPoiholgerd77
andauthored
Rename era pack to e2store & add support for E2HS file format (#3954)
* reorganize package into directory per format * redefine Version and BlockIndex as CommonTypes * define e2hs types * move blockIndex functions to shared blockIndex.ts file * write createBlockIndex function and replace code in era1 * implement e2hs format * rename parse to decompress * write parse function * fix up blockTuple functions * update blockTuple calls in e2hs code * log better error on type mismatch * test using reference file * fix imports in tests * rename era package to e2store --------- Co-authored-by: Holger Drewes <[email protected]>
1 parent cdf601c commit 3d520fa

36 files changed

+396
-108
lines changed

Dockerfile

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ COPY packages/blockchain/dist packages/blockchain/dist
1313
COPY packages/client/dist packages/client/dist
1414
COPY packages/common/dist packages/common/dist
1515
COPY packages/devp2p/dist packages/devp2p/dist
16-
COPY packages/era/dist packages/era/dist
16+
COPY packages/e2store/dist packages/e2store/dist
1717
COPY packages/ethash/dist packages/ethash/dist
1818
COPY packages/evm/dist packages/evm/dist
1919
COPY packages/genesis/dist packages/genesis/dist
@@ -33,7 +33,7 @@ COPY packages/blockchain/package.json packages/blockchain/package.json
3333
COPY packages/client/package.json packages/client/package.json
3434
COPY packages/common/package.json packages/common/package.json
3535
COPY packages/devp2p/package.json packages/devp2p/package.json
36-
COPY packages/era/package.json packages/era/package.json
36+
COPY packages/e2store/package.json packages/e2store/package.json
3737
COPY packages/ethash/package.json packages/ethash/package.json
3838
COPY packages/evm/package.json packages/evm/package.json
3939
COPY packages/genesis/package.json packages/genesis/package.json

package-lock.json

Lines changed: 20 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
File renamed without changes.
Lines changed: 27 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,43 +1,48 @@
1-
# @ethereumjs/era `v10`
1+
# @ethereumjs/e2store `v10`
22

3-
[![NPM Package][era-npm-badge]][era-npm-link]
4-
[![GitHub Issues][era-issues-badge]][era-issues-link]
5-
[![Actions Status][era-actions-badge]][era-actions-link]
6-
[![Code Coverage][era-coverage-badge]][era-coverage-link]
3+
[![NPM Package][e2store-npm-badge]][e2store-npm-link]
4+
[![GitHub Issues][e2store-issues-badge]][e2store-issues-link]
5+
[![Actions Status][e2store-actions-badge]][e2store-actions-link]
6+
[![Code Coverage][e2store-coverage-badge]][e2store-coverage-link]
77
[![Discord][discord-badge]][discord-link]
88

99
| A collection of utility functions for Ethereum. |
1010
| ----------------------------------------------- |
1111

1212
## Table of Contents
1313

14-
- [Installation](#installation)
15-
- [Usage](#usage)
16-
- [EthereumJS](#ethereumjs)
17-
- [License](#license)
14+
- [@ethereumjs/e2store `v10`](#ethereumjse2store-v10)
15+
- [Table of Contents](#table-of-contents)
16+
- [Installation](#installation)
17+
- [Usage](#usage)
18+
- [Export History as Era1](#export-history-as-era1)
19+
- [Read Era1 file](#read-era1-file)
20+
- [Read Era file](#read-era-file)
21+
- [EthereumJS](#ethereumjs)
22+
- [License](#license)
1823

1924
## Installation
2025

2126
To obtain the latest version, simply require the project using `npm`:
2227

2328
```shell
24-
npm install @ethereumjs/era
29+
npm install @ethereumjs/e2store
2530
```
2631

2732
## Usage
2833

2934
All helpers are re-exported from the root level and deep imports are not necessary. So an import can be done like this:
3035

3136
```ts
32-
import { formatEntry } from "@ethereumjs/era"
37+
import { formatEntry } from "@ethereumjs/e2store"
3338
```
3439

3540
### Export History as Era1
3641

3742
Export history in epochs of 8192 blocks as Era1 files
3843

3944
```ts
40-
import { exportEpochAsEra1 } from "@ethereumjs/era"
45+
import { exportEpochAsEra1 } from "@ethereumjs/e2store"
4146

4247
const dataDir = PATH_TO_ETHEREUMJS_CLIENT_DB
4348
const epoch = 0
@@ -59,7 +64,7 @@ import {
5964
blockFromTuple,
6065
getHeaderRecords,
6166
EpochAccumulator,
62-
} from "@ethereumjs/era"
67+
} from "@ethereumjs/e2store"
6368

6469
const era1File = readBinaryFile(PATH_TO_ERA1_FILE)
6570

@@ -84,7 +89,7 @@ const epochAccumulatorRoot = EpochAccumulator.merkleRoot(headerRecords)
8489
### Read Era file
8590

8691
```ts
87-
import { readBeaconState } from "@ethereumjs/era"
92+
import { readBeaconState } from "@ethereumjs/e2store"
8893

8994
const eraFile = readBinaryFile(PATH_TO_ERA_FILE)
9095

@@ -109,13 +114,13 @@ See our organizational [documentation](https://ethereumjs.readthedocs.io) for an
109114

110115
[MPL-2.0](<https://tldrlegal.com/license/mozilla-public-license-2.0-(mpl-2)>)
111116

112-
[era-npm-badge]: https://img.shields.io/npm/v/@ethereumjs/era.svg
113-
[era-npm-link]: https://www.npmjs.org/package/@ethereumjs/era
114-
[era-issues-badge]: https://img.shields.io/github/issues/ethereumjs/ethereumjs-monorepo/package:%20era?label=issues
115-
[era-issues-link]: https://github.com/ethereumjs/ethereumjs-monorepo/issues?q=is%3Aopen+is%3Aissue+label%3A"package%3A+era"
116-
[era-actions-badge]: https://github.com/ethereumjs/ethereumjs-monorepo/workflows/Era/badge.svg
117-
[era-actions-link]: https://github.com/ethereumjs/ethereumjs-monorepo/actions?query=workflow%3A%22Era%22
118-
[era-coverage-badge]: https://codecov.io/gh/ethereumjs/ethereumjs-monorepo/branch/master/graph/badge.svg?flag=era
119-
[era-coverage-link]: https://codecov.io/gh/ethereumjs/ethereumjs-monorepo/tree/master/packages/era
117+
[e2store-npm-badge]: https://img.shields.io/npm/v/@ethereumjs/e2store.svg
118+
[e2store-npm-link]: https://www.npmjs.org/package/@ethereumjs/e2store
119+
[e2store-issues-badge]: https://img.shields.io/github/issues/ethereumjs/ethereumjs-monorepo/package:%20e2store?label=issues
120+
[e2store-issues-link]: https://github.com/ethereumjs/ethereumjs-monorepo/issues?q=is%3Aopen+is%3Aissue+label%3A"package%3A+e2store"
121+
[e2store-actions-badge]: https://github.com/ethereumjs/ethereumjs-monorepo/workflows/E2Store/badge.svg
122+
[e2store-actions-link]: https://github.com/ethereumjs/ethereumjs-monorepo/actions?query=workflow%3A%22E2Store%22
123+
[e2store-coverage-badge]: https://codecov.io/gh/ethereumjs/ethereumjs-monorepo/branch/master/graph/badge.svg?flag=e2store
124+
[e2store-coverage-link]: https://codecov.io/gh/ethereumjs/ethereumjs-monorepo/tree/master/packages/e2store
120125
[discord-badge]: https://img.shields.io/static/v1?logo=discord&label=discord&message=Join&color=blue
121126
[discord-link]: https://discord.gg/TNwARpR
Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
{
2-
"name": "@ethereumjs/era",
2+
"name": "@ethereumjs/e2store",
33
"version": "10.0.0-dev-rc.1",
4-
"description": "Era file support for EthereumJS",
5-
"keywords": ["ethereum", "era", "era1"],
6-
"homepage": "https://github.com/ethereumjs/ethereumjs-monorepo/tree/master/packages/era#readme",
4+
"description": "E2Store support for EthereumJS",
5+
"keywords": ["ethereum", "e2store", "e2hs", "era", "era1", "era2", "storage", "snappy"],
6+
"homepage": "https://github.com/ethereumjs/ethereumjs-monorepo/tree/master/packages/e2store#readme",
77
"bugs": {
8-
"url": "https://github.com/ethereumjs/ethereumjs-monorepo/issues?q=is%3Aissue+label%3A%22package%3A+era%22"
8+
"url": "https://github.com/ethereumjs/ethereumjs-monorepo/issues?q=is%3Aissue+label%3A%22package%3A+e2store%22"
99
},
1010
"repository": {
1111
"type": "git",

packages/e2store/src/blockIndex.ts

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
import { EthereumJSErrorWithoutCode } from '@ethereumjs/rlp'
2+
import { bigInt64ToBytes, bytesToBigInt64, concatBytes, equalsBytes } from '@ethereumjs/util'
3+
import { formatEntry, readEntry } from './e2store.ts'
4+
import { CommonTypes, VERSION } from './types.ts'
5+
6+
export function getBlockIndex(bytes: Uint8Array) {
7+
const count = Number(bytesToBigInt64(bytes.slice(-8), true))
8+
const recordLength = 8 * count + 24
9+
const recordEnd = bytes.length
10+
const recordStart = recordEnd - recordLength
11+
const { data, type } = readEntry(bytes.subarray(recordStart, recordEnd))
12+
if (!equalsBytes(type, CommonTypes.BlockIndex)) {
13+
throw EthereumJSErrorWithoutCode(
14+
`Expected block index (type: ${CommonTypes.BlockIndex}) but got ${type}`,
15+
)
16+
}
17+
return { data, type, count, recordStart }
18+
}
19+
20+
export function readBlockIndex(data: Uint8Array, count: number) {
21+
const startingNumber = Number(bytesToBigInt64(data.slice(0, 8), true))
22+
const offsets: number[] = []
23+
for (let i = 0; i < count; i++) {
24+
const slotEntry = data.subarray((i + 1) * 8, (i + 2) * 8)
25+
const offset = Number(new DataView(slotEntry.slice(0, 8).buffer).getBigInt64(0, true))
26+
offsets.push(offset)
27+
}
28+
return {
29+
startingNumber,
30+
offsets,
31+
}
32+
}
33+
34+
export async function createBlockIndex(blockTuples: Uint8Array[], startingNumber: bigint) {
35+
const version = await formatEntry(VERSION)
36+
const tuplesLength = blockTuples.reduce((acc, b) => acc + b.length, 0)
37+
const count = bigInt64ToBytes(BigInt(blockTuples.length), true)
38+
const blockIndexLength = 8 * blockTuples.length + 24
39+
const e2hsLength = version.length + tuplesLength + count.length + blockIndexLength
40+
const recordStart = e2hsLength - blockIndexLength
41+
const offsetBigInt: bigint[] = []
42+
for (let i = 0; i < blockTuples.length; i++) {
43+
if (i === 0) {
44+
const offset = 8 - recordStart
45+
offsetBigInt.push(BigInt(offset))
46+
} else {
47+
const offset = offsetBigInt[i - 1] + BigInt(blockTuples[i - 1].length)
48+
offsetBigInt.push(offset)
49+
}
50+
}
51+
const offsets: Uint8Array[] = offsetBigInt.map((o) => bigInt64ToBytes(o, true))
52+
const blockIndex = await formatEntry({
53+
type: CommonTypes.BlockIndex,
54+
data: concatBytes(bigInt64ToBytes(startingNumber, true), ...offsets, count),
55+
})
56+
return blockIndex
57+
}

0 commit comments

Comments
 (0)