diff --git a/packages/block/examples/simple.ts b/packages/block/examples/simple.ts index f571d1d63e..c94aaa3f72 100644 --- a/packages/block/examples/simple.ts +++ b/packages/block/examples/simple.ts @@ -1,11 +1,13 @@ -import { BlockHeader } from '@ethereumjs/block' +import { createHeader } from '@ethereumjs/block' import { bytesToHex } from '@ethereumjs/util' -const headerData = { +import type { HeaderData } from '@ethereumjs/block' + +const headerData: HeaderData = { number: 15, parentHash: '0x6bfee7294bf44572b7266358e627f3c35105e1c3851f3de09e6d646f955725a7', gasLimit: 8000000, timestamp: 1562422144, } -const header = BlockHeader.fromHeaderData(headerData) +const header = createHeader(headerData) console.log(`Created block header with hash=${bytesToHex(header.hash())}`) diff --git a/packages/block/src/block.ts b/packages/block/src/block.ts index 82b8597d94..8d302cf687 100644 --- a/packages/block/src/block.ts +++ b/packages/block/src/block.ts @@ -12,7 +12,6 @@ import { } from '@ethereumjs/util' import { keccak256 } from 'ethereum-cryptography/keccak.js' -import { BlockHeader } from './header.js' import { genRequestsTrieRoot, genTransactionsTrieRoot, genWithdrawalsTrieRoot } from './helpers.js' /* eslint-disable */ @@ -21,14 +20,15 @@ import { genRequestsTrieRoot, genTransactionsTrieRoot, genWithdrawalsTrieRoot } // TODO: See if there is an easier way to achieve the same result. // See: https://github.com/microsoft/TypeScript/issues/47558 // (situation will eventually improve on Typescript and/or Eslint update) -import type { - createBlockFromBeaconPayloadJson, - createBlockFromBlockData, - createBlockFromExecutionPayload, - createBlockFromJsonRpcProvider, - createBlockFromRLPSerializedBlock, - createBlockFromRPC, - createBlockFromValuesArray, +import { + BlockHeader, + type createBlockFromBeaconPayloadJson, + type createBlockFromBlockData, + type createBlockFromExecutionPayload, + type createBlockFromJsonRpcProvider, + type createBlockFromRLPSerializedBlock, + type createBlockFromRPC, + type createBlockFromValuesArray, } from './index.js' /* eslint-enable */ import type { BlockBytes, BlockOptions, ExecutionPayload, JsonBlock } from './types.js' @@ -100,7 +100,7 @@ export class Block { requests?: CLRequest[], executionWitness?: VerkleExecutionWitness | null, ) { - this.header = header ?? BlockHeader.fromHeaderData({}, opts) + this.header = header ?? new BlockHeader({}, opts) this.common = this.header.common this.keccakFunction = this.common.customCrypto.keccak256 ?? keccak256 diff --git a/packages/block/src/constructors.ts b/packages/block/src/constructors.ts index dee8d97578..7a5f866009 100644 --- a/packages/block/src/constructors.ts +++ b/packages/block/src/constructors.ts @@ -12,6 +12,7 @@ import { DepositRequest, Withdrawal, WithdrawalRequest, + bigIntToBytes, bigIntToHex, bytesToHex, bytesToUtf8, @@ -24,7 +25,12 @@ import { } from '@ethereumjs/util' import { createBlockFromRpc } from './from-rpc.js' -import { genRequestsTrieRoot, genTransactionsTrieRoot, genWithdrawalsTrieRoot } from './helpers.js' +import { + genRequestsTrieRoot, + genTransactionsTrieRoot, + genWithdrawalsTrieRoot, + valuesArrayToHeaderData, +} from './helpers.js' import { Block, BlockHeader, executionPayloadFromBeaconPayload } from './index.js' @@ -32,6 +38,7 @@ import type { BeaconPayloadJson } from './from-beacon-payload.js' import type { BlockBytes, BlockData, + BlockHeaderBytes, BlockOptions, ExecutionPayload, ExecutionWitnessBytes, @@ -49,6 +56,67 @@ import type { WithdrawalBytes, } from '@ethereumjs/util' +/** + * Static constructor to create a block header from a header data dictionary + * + * @param headerData + * @param opts + */ +export function createHeader(headerData: HeaderData = {}, opts: BlockOptions = {}) { + return new BlockHeader(headerData, opts) +} + +/** + * Static constructor to create a block header from an array of Bytes values + * + * @param values + * @param opts + */ +export function createHeaderFromValuesArray(values: BlockHeaderBytes, opts: BlockOptions = {}) { + const headerData = valuesArrayToHeaderData(values) + const { number, baseFeePerGas, excessBlobGas, blobGasUsed, parentBeaconBlockRoot, requestsRoot } = + headerData + const header = createHeader(headerData, opts) + if (header.common.isActivatedEIP(1559) && baseFeePerGas === undefined) { + const eip1559ActivationBlock = bigIntToBytes(header.common.eipBlock(1559)!) + if ( + eip1559ActivationBlock !== undefined && + equalsBytes(eip1559ActivationBlock, number as Uint8Array) + ) { + throw new Error('invalid header. baseFeePerGas should be provided') + } + } + if (header.common.isActivatedEIP(4844)) { + if (excessBlobGas === undefined) { + throw new Error('invalid header. excessBlobGas should be provided') + } else if (blobGasUsed === undefined) { + throw new Error('invalid header. blobGasUsed should be provided') + } + } + if (header.common.isActivatedEIP(4788) && parentBeaconBlockRoot === undefined) { + throw new Error('invalid header. parentBeaconBlockRoot should be provided') + } + + if (header.common.isActivatedEIP(7685) && requestsRoot === undefined) { + throw new Error('invalid header. requestsRoot should be provided') + } + return header +} + +/** + * Static constructor to create a block header from a RLP-serialized header + * + * @param serializedHeaderData + * @param opts + */ +export function createHeaderFromRLP(serializedHeaderData: Uint8Array, opts: BlockOptions = {}) { + const values = RLP.decode(serializedHeaderData) + if (!Array.isArray(values)) { + throw new Error('Invalid serialized header input. Must be array') + } + return createHeaderFromValuesArray(values as Uint8Array[], opts) +} + /** * Static constructor to create a block from a block data dictionary * @@ -65,7 +133,7 @@ export function createBlockFromBlockData(blockData: BlockData = {}, opts?: Block requests: clRequests, } = blockData - const header = BlockHeader.fromHeaderData(headerData, opts) + const header = createHeader(headerData, opts) // parse transactions const transactions = [] @@ -92,7 +160,7 @@ export function createBlockFromBlockData(blockData: BlockData = {}, opts?: Block uncleOpts.setHardfork = true } for (const uhData of uhsData ?? []) { - const uh = BlockHeader.fromHeaderData(uhData, uncleOpts) + const uh = createHeader(uhData, uncleOpts) uncleHeaders.push(uh) } @@ -126,7 +194,7 @@ export function createBlockFromValuesArray(values: BlockBytes, opts?: BlockOptio // First try to load header so that we can use its common (in case of setHardfork being activated) // to correctly make checks on the hardforks const [headerData, txsData, uhsData, ...valuesTail] = values - const header = BlockHeader.fromValuesArray(headerData, opts) + const header = createHeaderFromValuesArray(headerData, opts) // conditional assignment of rest of values and splicing them out from the valuesTail const withdrawalBytes = header.common.isActivatedEIP(4895) @@ -191,7 +259,7 @@ export function createBlockFromValuesArray(values: BlockBytes, opts?: BlockOptio uncleOpts.setHardfork = true } for (const uncleHeaderData of uhsData ?? []) { - uncleHeaders.push(BlockHeader.fromValuesArray(uncleHeaderData, uncleOpts)) + uncleHeaders.push(createHeaderFromValuesArray(uncleHeaderData, uncleOpts)) } const withdrawals = (withdrawalBytes as WithdrawalBytes[]) diff --git a/packages/block/src/header-from-rpc.ts b/packages/block/src/header-from-rpc.ts index a22678b574..94b5b63659 100644 --- a/packages/block/src/header-from-rpc.ts +++ b/packages/block/src/header-from-rpc.ts @@ -1,6 +1,7 @@ -import { BlockHeader } from './header.js' import { numberToHex } from './helpers.js' +import { BlockHeader } from './index.js' + import type { BlockOptions, JsonRpcBlock } from './types.js' /** @@ -34,7 +35,7 @@ export function blockHeaderFromRpc(blockParams: JsonRpcBlock, options?: BlockOpt requestsRoot, } = blockParams - const blockHeader = BlockHeader.fromHeaderData( + const blockHeader = new BlockHeader( { parentHash, uncleHash: sha3Uncles, diff --git a/packages/block/src/header.ts b/packages/block/src/header.ts index 0c220f07d4..e2b489b244 100644 --- a/packages/block/src/header.ts +++ b/packages/block/src/header.ts @@ -29,7 +29,7 @@ import { import { keccak256 } from 'ethereum-cryptography/keccak.js' import { CLIQUE_EXTRA_SEAL, CLIQUE_EXTRA_VANITY } from './clique.js' -import { fakeExponential, valuesArrayToHeaderData } from './helpers.js' +import { fakeExponential } from './helpers.js' import { paramsBlock } from './params.js' import type { BlockHeaderBytes, BlockOptions, HeaderData, JsonHeader } from './types.js' @@ -89,77 +89,11 @@ export class BlockHeader { return this.mixHash } - /** - * Static constructor to create a block header from a header data dictionary - * - * @param headerData - * @param opts - */ - public static fromHeaderData(headerData: HeaderData = {}, opts: BlockOptions = {}) { - return new BlockHeader(headerData, opts) - } - - /** - * Static constructor to create a block header from a RLP-serialized header - * - * @param serializedHeaderData - * @param opts - */ - public static fromRLPSerializedHeader(serializedHeaderData: Uint8Array, opts: BlockOptions = {}) { - const values = RLP.decode(serializedHeaderData) - if (!Array.isArray(values)) { - throw new Error('Invalid serialized header input. Must be array') - } - return BlockHeader.fromValuesArray(values as Uint8Array[], opts) - } - - /** - * Static constructor to create a block header from an array of Bytes values - * - * @param values - * @param opts - */ - public static fromValuesArray(values: BlockHeaderBytes, opts: BlockOptions = {}) { - const headerData = valuesArrayToHeaderData(values) - const { - number, - baseFeePerGas, - excessBlobGas, - blobGasUsed, - parentBeaconBlockRoot, - requestsRoot, - } = headerData - const header = BlockHeader.fromHeaderData(headerData, opts) - if (header.common.isActivatedEIP(1559) && baseFeePerGas === undefined) { - const eip1559ActivationBlock = bigIntToBytes(header.common.eipBlock(1559)!) - if ( - eip1559ActivationBlock !== undefined && - equalsBytes(eip1559ActivationBlock, number as Uint8Array) - ) { - throw new Error('invalid header. baseFeePerGas should be provided') - } - } - if (header.common.isActivatedEIP(4844)) { - if (excessBlobGas === undefined) { - throw new Error('invalid header. excessBlobGas should be provided') - } else if (blobGasUsed === undefined) { - throw new Error('invalid header. blobGasUsed should be provided') - } - } - if (header.common.isActivatedEIP(4788) && parentBeaconBlockRoot === undefined) { - throw new Error('invalid header. parentBeaconBlockRoot should be provided') - } - - if (header.common.isActivatedEIP(7685) && requestsRoot === undefined) { - throw new Error('invalid header. requestsRoot should be provided') - } - return header - } /** * This constructor takes the values, validates them, assigns them and freezes the object. * * @deprecated Use the public static factory methods to assist in creating a Header object from - * varying data types. For a default empty header, use {@link BlockHeader.fromHeaderData}. + * varying data types. For a default empty header, use {@link createHeader}. * */ constructor(headerData: HeaderData, opts: BlockOptions = {}) { diff --git a/packages/block/test/clique.spec.ts b/packages/block/test/clique.spec.ts index a9ee44e710..63c5becc0c 100644 --- a/packages/block/test/clique.spec.ts +++ b/packages/block/test/clique.spec.ts @@ -2,13 +2,13 @@ import { Chain, Common, Hardfork } from '@ethereumjs/common' import { Address, createZeroAddress, hexToBytes } from '@ethereumjs/util' import { assert, describe, it } from 'vitest' -import { BlockHeader } from '../src/header.js' +import { createHeader } from '../src/constructors.js' describe('[Header]: Clique PoA Functionality', () => { const common = new Common({ chain: Chain.Goerli, hardfork: Hardfork.Chainstart }) it('Header Data', () => { - let header = BlockHeader.fromHeaderData({ number: 1 }) + let header = createHeader({ number: 1 }) assert.throws( () => { header.cliqueIsEpochTransition() @@ -18,13 +18,13 @@ describe('[Header]: Clique PoA Functionality', () => { 'cliqueIsEpochTransition() -> should throw on PoW networks', ) - header = BlockHeader.fromHeaderData({ extraData: new Uint8Array(97) }, { common }) + header = createHeader({ extraData: new Uint8Array(97) }, { common }) assert.ok( header.cliqueIsEpochTransition(), 'cliqueIsEpochTransition() -> should indicate an epoch transition for the genesis block', ) - header = BlockHeader.fromHeaderData({ number: 1, extraData: new Uint8Array(97) }, { common }) + header = createHeader({ number: 1, extraData: new Uint8Array(97) }, { common }) assert.notOk( header.cliqueIsEpochTransition(), 'cliqueIsEpochTransition() -> should correctly identify a non-epoch block', @@ -48,10 +48,7 @@ describe('[Header]: Clique PoA Functionality', () => { 'cliqueEpochTransitionSigners() -> should throw on non-epch block', ) - header = BlockHeader.fromHeaderData( - { number: 60000, extraData: new Uint8Array(137) }, - { common }, - ) + header = createHeader({ number: 60000, extraData: new Uint8Array(137) }, { common }) assert.ok( header.cliqueIsEpochTransition(), 'cliqueIsEpochTransition() -> should correctly identify an epoch block', @@ -92,7 +89,7 @@ describe('[Header]: Clique PoA Functionality', () => { it('Signing', () => { const cliqueSigner = A.privateKey - let header = BlockHeader.fromHeaderData( + let header = createHeader( { number: 1, extraData: new Uint8Array(97) }, { common, freeze: false, cliqueSigner }, ) @@ -101,7 +98,7 @@ describe('[Header]: Clique PoA Functionality', () => { assert.ok(header.cliqueVerifySignature([A.address]), 'should verify signature') assert.ok(header.cliqueSigner().equals(A.address), 'should recover the correct signer address') - header = BlockHeader.fromHeaderData({ extraData: new Uint8Array(97) }, { common }) + header = createHeader({ extraData: new Uint8Array(97) }, { common }) assert.ok( header.cliqueSigner().equals(createZeroAddress()), 'should return zero address on default block', diff --git a/packages/block/test/eip1559block.spec.ts b/packages/block/test/eip1559block.spec.ts index 43cbc2e90c..4390f26fb2 100644 --- a/packages/block/test/eip1559block.spec.ts +++ b/packages/block/test/eip1559block.spec.ts @@ -3,8 +3,7 @@ import { create1559FeeMarketTx } from '@ethereumjs/tx' import { hexToBytes } from '@ethereumjs/util' import { assert, describe, it } from 'vitest' -import { createBlockFromBlockData } from '../src/constructors.js' -import { BlockHeader } from '../src/header.js' +import { createBlockFromBlockData, createHeader } from '../src/constructors.js' // Test data from Besu (retrieved via Discord) // Older version at https://github.com/abdelhamidbakhta/besu/blob/bf54b6c0b40d3015fc85ff9b078fbc26592d80c0/ethereum/core/src/test/resources/org/hyperledger/besu/ethereum/core/fees/basefee-test.json import { paramsBlock } from '../src/params.js' @@ -37,7 +36,7 @@ describe('EIP1559 tests', () => { const common = new Common({ chain: Chain.Mainnet, hardfork: Hardfork.Istanbul }) assert.throws( () => { - BlockHeader.fromHeaderData( + createHeader( { number: BigInt(1), parentHash: genesis.hash(), @@ -58,7 +57,7 @@ describe('EIP1559 tests', () => { it('Header -> genericFormatValidation checks', async () => { try { - BlockHeader.fromHeaderData( + createHeader( { number: BigInt(1), parentHash: genesis.hash(), @@ -82,7 +81,7 @@ describe('EIP1559 tests', () => { } try { - const header = BlockHeader.fromHeaderData( + const header = createHeader( { number: BigInt(1), parentHash: genesis.hash(), @@ -128,7 +127,7 @@ describe('EIP1559 tests', () => { it('Header -> validate()', async () => { try { - BlockHeader.fromHeaderData( + createHeader( { baseFeePerGas: BigInt(1000), number: BigInt(1), @@ -183,7 +182,7 @@ describe('EIP1559 tests', () => { it('Header -> validate() -> gas usage', async () => { try { - BlockHeader.fromHeaderData( + createHeader( { number: BigInt(1), parentHash: genesis.hash(), @@ -206,7 +205,7 @@ describe('EIP1559 tests', () => { }) it('Header -> validate() -> gas usage', async () => { - BlockHeader.fromHeaderData( + createHeader( { number: BigInt(1), parentHash: genesis.hash(), @@ -242,7 +241,7 @@ describe('EIP1559 tests', () => { it('Header -> validate() -> gasLimit -> success cases', async () => { let parentGasLimit = genesis.header.gasLimit * BigInt(2) - BlockHeader.fromHeaderData( + createHeader( { number: BigInt(1), parentHash: genesis.hash(), @@ -258,7 +257,7 @@ describe('EIP1559 tests', () => { assert.ok(true, 'should not throw if gas limit is between bounds (HF transition block)') - BlockHeader.fromHeaderData( + createHeader( { number: BigInt(1), parentHash: genesis.hash(), @@ -275,7 +274,7 @@ describe('EIP1559 tests', () => { assert.ok(true, 'should not throw if gas limit is between bounds (HF transition block)') parentGasLimit = block1.header.gasLimit - BlockHeader.fromHeaderData( + createHeader( { number: BigInt(2), parentHash: block1.hash(), @@ -291,7 +290,7 @@ describe('EIP1559 tests', () => { assert.ok(true, 'should not throw if gas limit is between bounds (post-HF transition block)') - BlockHeader.fromHeaderData( + createHeader( { number: BigInt(2), parentHash: block1.hash(), @@ -310,7 +309,7 @@ describe('EIP1559 tests', () => { it('Header -> validateGasLimit() -> error cases', async () => { let parentGasLimit = genesis.header.gasLimit * BigInt(2) - let header = BlockHeader.fromHeaderData( + let header = createHeader( { number: BigInt(1), parentHash: genesis.hash(), @@ -334,7 +333,7 @@ describe('EIP1559 tests', () => { } parentGasLimit = block1.header.gasLimit - header = BlockHeader.fromHeaderData( + header = createHeader( { number: BigInt(2), parentHash: block1.hash(), @@ -360,7 +359,7 @@ describe('EIP1559 tests', () => { it('Header -> validateGasLimit() -> error cases', async () => { let parentGasLimit = genesis.header.gasLimit * BigInt(2) - let header = BlockHeader.fromHeaderData( + let header = createHeader( { number: BigInt(1), parentHash: genesis.hash(), @@ -384,7 +383,7 @@ describe('EIP1559 tests', () => { } parentGasLimit = block1.header.gasLimit - header = BlockHeader.fromHeaderData( + header = createHeader( { number: BigInt(2), parentHash: block1.hash(), @@ -453,7 +452,7 @@ describe('EIP1559 tests', () => { it('Header -> calcNextBaseFee()', () => { for (let index = 0; index < eip1559BaseFee.length; index++) { const item = eip1559BaseFee[index] - const result = BlockHeader.fromHeaderData( + const result = createHeader( { baseFeePerGas: BigInt(item.parentBaseFee), gasUsed: BigInt(item.parentGasUsed), @@ -467,7 +466,7 @@ describe('EIP1559 tests', () => { }) it('Header -> toJSON()', () => { - const header = BlockHeader.fromHeaderData( + const header = createHeader( { number: BigInt(3), parentHash: genesis.hash(), diff --git a/packages/block/test/eip4788block.spec.ts b/packages/block/test/eip4788block.spec.ts index 7b7a15f00a..b69b5c960c 100644 --- a/packages/block/test/eip4788block.spec.ts +++ b/packages/block/test/eip4788block.spec.ts @@ -2,8 +2,7 @@ import { Chain, Common, Hardfork } from '@ethereumjs/common' import { bytesToHex, zeros } from '@ethereumjs/util' import { assert, describe, it } from 'vitest' -import { createBlockFromBlockData } from '../src/constructors.js' -import { BlockHeader } from '../src/header.js' +import { createBlockFromBlockData, createHeader } from '../src/constructors.js' describe('EIP4788 header tests', () => { it('should work', () => { @@ -12,7 +11,7 @@ describe('EIP4788 header tests', () => { assert.throws( () => { - BlockHeader.fromHeaderData( + createHeader( { parentBeaconBlockRoot: zeros(32), }, @@ -28,7 +27,7 @@ describe('EIP4788 header tests', () => { assert.throws( () => { - BlockHeader.fromHeaderData( + createHeader( { blobGasUsed: 1n, }, @@ -42,7 +41,7 @@ describe('EIP4788 header tests', () => { 'should throw when setting blobGasUsed with EIP4844 not being activated', ) assert.doesNotThrow(() => { - BlockHeader.fromHeaderData( + createHeader( { excessBlobGas: 0n, blobGasUsed: 0n, @@ -57,7 +56,7 @@ describe('EIP4788 header tests', () => { const block = createBlockFromBlockData( { - header: BlockHeader.fromHeaderData({}, { common }), + header: createHeader({}, { common }), }, { common, skipConsensusFormatValidation: true }, ) diff --git a/packages/block/test/eip4844block.spec.ts b/packages/block/test/eip4844block.spec.ts index 6f05554d43..5742f9c274 100644 --- a/packages/block/test/eip4844block.spec.ts +++ b/packages/block/test/eip4844block.spec.ts @@ -9,8 +9,7 @@ import { import { loadKZG } from 'kzg-wasm' import { assert, beforeAll, describe, it } from 'vitest' -import { createBlockFromBlockData } from '../src/constructors.js' -import { BlockHeader } from '../src/header.js' +import { createBlockFromBlockData, createHeader } from '../src/constructors.js' import { fakeExponential, getNumBlobs } from '../src/helpers.js' import { paramsBlock } from '../src/params.js' @@ -37,7 +36,7 @@ describe('EIP4844 header tests', () => { assert.throws( () => { - BlockHeader.fromHeaderData( + createHeader( { excessBlobGas: 1n, }, @@ -53,7 +52,7 @@ describe('EIP4844 header tests', () => { assert.throws( () => { - BlockHeader.fromHeaderData( + createHeader( { blobGasUsed: 1n, }, @@ -67,7 +66,7 @@ describe('EIP4844 header tests', () => { 'should throw when setting blobGasUsed with EIP4844 not being activated', ) - const excessBlobGas = BlockHeader.fromHeaderData( + const excessBlobGas = createHeader( {}, { common, skipConsensusFormatValidation: true }, ).excessBlobGas @@ -77,7 +76,7 @@ describe('EIP4844 header tests', () => { 'instantiates block with reasonable default excess blob gas value when not provided', ) assert.doesNotThrow(() => { - BlockHeader.fromHeaderData( + createHeader( { excessBlobGas: 0n, }, @@ -90,7 +89,7 @@ describe('EIP4844 header tests', () => { const block = createBlockFromBlockData( { - header: BlockHeader.fromHeaderData({}, { common, skipConsensusFormatValidation: true }), + header: createHeader({}, { common, skipConsensusFormatValidation: true }), }, { common, skipConsensusFormatValidation: true }, ) @@ -112,7 +111,7 @@ describe('blob gas tests', () => { blobGasPerBlob = common.param('blobGasPerBlob') }) it('should work', () => { - const preShardingHeader = BlockHeader.fromHeaderData({}) + const preShardingHeader = createHeader({}) let excessBlobGas = preShardingHeader.calcNextExcessBlobGas() assert.equal( @@ -128,7 +127,7 @@ describe('blob gas tests', () => { 'calcDataFee throws when header has no excessBlobGas field', ) - const lowGasHeader = BlockHeader.fromHeaderData( + const lowGasHeader = createHeader( { number: 1, excessBlobGas: 5000 }, { common, skipConsensusFormatValidation: true }, ) @@ -137,7 +136,7 @@ describe('blob gas tests', () => { let blobGasPrice = lowGasHeader.getBlobGasPrice() assert.equal(excessBlobGas, 0n, 'excess blob gas should be 0 for small parent header blob gas') assert.equal(blobGasPrice, 1n, 'blob gas price should be 1n when low or no excess blob gas') - const highGasHeader = BlockHeader.fromHeaderData( + const highGasHeader = createHeader( { number: 1, excessBlobGas: 6291456, blobGasUsed: BigInt(6) * blobGasPerBlob }, { common, skipConsensusFormatValidation: true }, ) @@ -197,7 +196,7 @@ describe('transaction validation tests', () => { { common }, ).sign(randomBytes(32)) - const parentHeader = BlockHeader.fromHeaderData( + const parentHeader = createHeader( { number: 1n, excessBlobGas: 4194304, blobGasUsed: 0 }, { common, skipConsensusFormatValidation: true }, ) @@ -207,7 +206,7 @@ describe('transaction validation tests', () => { function getBlock(transactions: TypedTransaction[]) { const blobs = getNumBlobs(transactions) - const blockHeader = BlockHeader.fromHeaderData( + const blockHeader = createHeader( { number: 2n, parentHash: parentHeader.hash(), diff --git a/packages/block/test/eip4895block.spec.ts b/packages/block/test/eip4895block.spec.ts index fec9262db0..acbad96844 100644 --- a/packages/block/test/eip4895block.spec.ts +++ b/packages/block/test/eip4895block.spec.ts @@ -10,8 +10,11 @@ import { } from '@ethereumjs/util' import { assert, describe, it } from 'vitest' -import { createBlockFromBlockData, createBlockFromRLPSerializedBlock } from '../src/constructors.js' -import { BlockHeader } from '../src/header.js' +import { + createBlockFromBlockData, + createBlockFromRLPSerializedBlock, + createHeader, +} from '../src/constructors.js' import { genWithdrawalsTrieRoot } from '../src/helpers.js' import type { WithdrawalBytes, WithdrawalData } from '@ethereumjs/util' @@ -56,7 +59,7 @@ describe('EIP4895 tests', () => { const earlyCommon = new Common({ chain: Chain.Mainnet, hardfork: Hardfork.Istanbul }) assert.throws( () => { - BlockHeader.fromHeaderData( + createHeader( { withdrawalsRoot: zeros(32), }, @@ -70,7 +73,7 @@ describe('EIP4895 tests', () => { 'should throw when setting withdrawalsRoot with EIP4895 not being activated', ) assert.doesNotThrow(() => { - BlockHeader.fromHeaderData( + createHeader( {}, { common, @@ -78,7 +81,7 @@ describe('EIP4895 tests', () => { ) }, 'should not throw when withdrawalsRoot is undefined with EIP4895 being activated') assert.doesNotThrow(() => { - BlockHeader.fromHeaderData( + createHeader( { withdrawalsRoot: zeros(32), }, @@ -141,7 +144,7 @@ describe('EIP4895 tests', () => { await block.withdrawalsTrieIsValid(), 'should invalidate the empty withdrawals root', ) - const validHeader = BlockHeader.fromHeaderData( + const validHeader = createHeader( { withdrawalsRoot: KECCAK256_RLP, }, diff --git a/packages/block/test/eip7685block.spec.ts b/packages/block/test/eip7685block.spec.ts index 251d172c8a..0de42326c7 100644 --- a/packages/block/test/eip7685block.spec.ts +++ b/packages/block/test/eip7685block.spec.ts @@ -12,9 +12,10 @@ import { createBlockFromBlockData, createBlockFromRPC, createBlockFromValuesArray, + createHeader, } from '../src/constructors.js' import { genRequestsTrieRoot } from '../src/helpers.js' -import { Block, BlockHeader } from '../src/index.js' +import { Block } from '../src/index.js' import type { CLRequest, CLRequestType } from '@ethereumjs/util' @@ -110,12 +111,9 @@ describe('7685 tests', () => { describe('fromValuesArray tests', () => { it('should construct a block with empty requests root', () => { - const block = createBlockFromValuesArray( - [BlockHeader.fromHeaderData({}, { common }).raw(), [], [], [], []], - { - common, - }, - ) + const block = createBlockFromValuesArray([createHeader({}, { common }).raw(), [], [], [], []], { + common, + }) assert.deepEqual(block.header.requestsRoot, KECCAK256_RLP) }) it('should construct a block with a valid requests array', async () => { @@ -127,13 +125,7 @@ describe('fromValuesArray tests', () => { const serializedRequests = [request1.serialize(), request2.serialize(), request3.serialize()] const block = createBlockFromValuesArray( - [ - BlockHeader.fromHeaderData({ requestsRoot }, { common }).raw(), - [], - [], - [], - serializedRequests, - ], + [createHeader({ requestsRoot }, { common }).raw(), [], [], [], serializedRequests], { common, }, @@ -153,13 +145,7 @@ describe('fromRPC tests', () => { const serializedRequests = [request1.serialize(), request2.serialize(), request3.serialize()] const block = createBlockFromValuesArray( - [ - BlockHeader.fromHeaderData({ requestsRoot }, { common }).raw(), - [], - [], - [], - serializedRequests, - ], + [createHeader({ requestsRoot }, { common }).raw(), [], [], [], serializedRequests], { common, }, diff --git a/packages/block/test/from-beacon-payload.spec.ts b/packages/block/test/from-beacon-payload.spec.ts index 778a5c816b..f60df7d846 100644 --- a/packages/block/test/from-beacon-payload.spec.ts +++ b/packages/block/test/from-beacon-payload.spec.ts @@ -3,8 +3,7 @@ import { loadKZG } from 'kzg-wasm' import { assert, beforeAll, describe, it } from 'vitest' import * as shardingJson from '../../client/test/sim/configs/4844-devnet.json' -import { createBlockFromBeaconPayloadJson } from '../src/constructors.js' -import { BlockHeader } from '../src/index.js' +import { createBlockFromBeaconPayloadJson, createHeader } from '../src/constructors.js' import * as payloadKaustinen from './testdata/payload-kaustinen.json' import * as payload87335 from './testdata/payload-slot-87335.json' @@ -35,7 +34,7 @@ describe('[fromExecutionPayloadJson]: 4844 devnet 5', () => { const block = await createBlockFromBeaconPayloadJson(payload as BeaconPayloadJson, { common, }) - const parentHeader = BlockHeader.fromHeaderData( + const parentHeader = createHeader( { excessBlobGas: BigInt(0), blobGasUsed: block.header.excessBlobGas! + BigInt(393216) }, { common }, ) @@ -74,7 +73,7 @@ describe('[fromExecutionPayloadJson]: 4844 devnet 5', () => { } as BeaconPayloadJson, { common }, ) - const parentHeader = BlockHeader.fromHeaderData({ excessBlobGas: BigInt(0) }, { common }) + const parentHeader = createHeader({ excessBlobGas: BigInt(0) }, { common }) block.validateBlobTransactions(parentHeader) assert.fail(`should have failed constructing the block`) } catch (e) { diff --git a/packages/block/test/header.spec.ts b/packages/block/test/header.spec.ts index 29f1beeddb..0e750c9d25 100644 --- a/packages/block/test/header.spec.ts +++ b/packages/block/test/header.spec.ts @@ -12,14 +12,20 @@ import { } from '@ethereumjs/util' import { assert, describe, it } from 'vitest' -import { createBlockFromBlockData, createBlockFromRLPSerializedBlock } from '../src/constructors.js' -import { BlockHeader } from '../src/header.js' +import { + createBlockFromBlockData, + createBlockFromRLPSerializedBlock, + createHeader, + createHeaderFromRLP, + createHeaderFromValuesArray, +} from '../src/constructors.js' import { Block } from '../src/index.js' import * as testData from './testdata/bcBlockGasLimitTest.json' import * as blocksGoerli from './testdata/blocks_goerli.json' import * as blocksMainnet from './testdata/blocks_mainnet.json' +import type { BlockHeader } from '../src/header.js' import type { CliqueConfig } from '@ethereumjs/common' import type { PrefixedHexString } from '@ethereumjs/util' @@ -43,7 +49,7 @@ describe('[Block]: Header functions', () => { assert.ok(equalsBytes(header.nonce, zeros(8))) } - const header = BlockHeader.fromHeaderData() + const header = createHeader() compareDefaultHeader(header) const block = new Block() @@ -52,7 +58,7 @@ describe('[Block]: Header functions', () => { it('Initialization -> fromHeaderData()', () => { const common = new Common({ chain: Chain.Mainnet, hardfork: Hardfork.Chainstart }) - let header = BlockHeader.fromHeaderData(undefined, { common }) + let header = createHeader(undefined, { common }) assert.ok(bytesToHex(header.hash()), 'genesis block should initialize') assert.equal( header.common.hardfork(), @@ -67,15 +73,15 @@ describe('[Block]: Header functions', () => { 'should stay on correct HF if outer common HF changes', ) - header = BlockHeader.fromHeaderData({}, { common }) + header = createHeader({}, { common }) assert.ok(bytesToHex(header.hash()), 'default block should initialize') // test default freeze values // also test if the options are carried over to the constructor - header = BlockHeader.fromHeaderData({}) + header = createHeader({}) assert.ok(Object.isFrozen(header), 'block should be frozen by default') - header = BlockHeader.fromHeaderData({}, { freeze: false }) + header = createHeader({}, { freeze: false }) assert.ok( !Object.isFrozen(header), 'block should not be frozen when freeze deactivated in options', @@ -84,15 +90,15 @@ describe('[Block]: Header functions', () => { it('Initialization -> fromRLPSerializedHeader()', () => { const common = new Common({ chain: Chain.Mainnet, hardfork: Hardfork.London }) - let header = BlockHeader.fromHeaderData({}, { common, freeze: false }) + let header = createHeader({}, { common, freeze: false }) const rlpHeader = header.serialize() - header = BlockHeader.fromRLPSerializedHeader(rlpHeader, { + header = createHeaderFromRLP(rlpHeader, { common, }) assert.ok(Object.isFrozen(header), 'block should be frozen by default') - header = BlockHeader.fromRLPSerializedHeader(rlpHeader, { + header = createHeaderFromRLP(rlpHeader, { common, freeze: false, }) @@ -103,7 +109,7 @@ describe('[Block]: Header functions', () => { assert.throws( () => - BlockHeader.fromRLPSerializedHeader(rlpHeader, { + createHeaderFromRLP(rlpHeader, { common, freeze: false, setHardfork: 1n, // Added to bypass defaulting setHardfork to true in static constructor @@ -113,7 +119,7 @@ describe('[Block]: Header functions', () => { 'throws when RLP serialized block with no base fee on default hardfork (london) and setHardfork left undefined', ) - header = BlockHeader.fromRLPSerializedHeader( + header = createHeaderFromRLP( hexToBytes( '0xf90214a00000000000000000000000000000000000000000000000000000000000000000a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347940000000000000000000000000000000000000000a0d7f8974fb5ac78d9ac099b9ad5018bedc2ce0a72dad1827a1709da30580f0544a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000850400000000808213888080a011bbe8db4e347b4e8c937c1c8370e4b5ed33adb3db69cbdb7a38e1e50b1b82faa00000000000000000000000000000000000000000000000000000000000000000880000000000000042', ), @@ -128,7 +134,7 @@ describe('[Block]: Header functions', () => { it('Initialization -> fromRLPSerializedHeader() -> error cases', () => { try { - BlockHeader.fromRLPSerializedHeader(RLP.encode('a')) + createHeaderFromRLP(RLP.encode('a')) } catch (e: any) { const expectedError = 'Invalid serialized header input. Must be array' assert.ok(e.message.includes(expectedError), 'should throw with header as rlp encoded string') @@ -152,10 +158,10 @@ describe('[Block]: Header functions', () => { headerArray[13] = zeros(32) // mixHash headerArray[14] = zeros(8) // nonce - let header = BlockHeader.fromValuesArray(headerArray, { common }) + let header = createHeaderFromValuesArray(headerArray, { common }) assert.ok(Object.isFrozen(header), 'block should be frozen by default') - header = BlockHeader.fromValuesArray(headerArray, { common, freeze: false }) + header = createHeaderFromValuesArray(headerArray, { common, freeze: false }) assert.ok( !Object.isFrozen(header), 'block should not be frozen when freeze deactivated in options', @@ -175,14 +181,14 @@ describe('[Block]: Header functions', () => { headerArray[14] = zeros(8) // nonce headerArray[15] = zeros(4) // bad data try { - BlockHeader.fromValuesArray(headerArray) + createHeaderFromValuesArray(headerArray) } catch (e: any) { const expectedError = 'invalid header. More values than expected were received' assert.ok(e.message.includes(expectedError), 'should throw on more values than expected') } try { - BlockHeader.fromValuesArray(headerArray.slice(0, 5)) + createHeaderFromValuesArray(headerArray.slice(0, 5)) } catch (e: any) { const expectedError = 'invalid header. Less values than expected were received' assert.ok(e.message.includes(expectedError), 'should throw on less values than expected') @@ -191,7 +197,7 @@ describe('[Block]: Header functions', () => { it('Initialization -> Clique Blocks', () => { const common = new Common({ chain: Chain.Goerli, hardfork: Hardfork.Chainstart }) - const header = BlockHeader.fromHeaderData({ extraData: new Uint8Array(97) }, { common }) + const header = createHeader({ extraData: new Uint8Array(97) }, { common }) assert.ok(bytesToHex(header.hash()), 'default block should initialize') }) @@ -212,7 +218,7 @@ describe('[Block]: Header functions', () => { let extraData = new Uint8Array(32) try { - BlockHeader.fromHeaderData({ ...data, extraData }, opts) + createHeader({ ...data, extraData }, opts) assert.ok(true, testCase) } catch (error: any) { assert.fail(testCase) @@ -223,7 +229,7 @@ describe('[Block]: Header functions', () => { extraData = new Uint8Array(12) try { - BlockHeader.fromHeaderData({ ...data, extraData }, opts) + createHeader({ ...data, extraData }, opts) assert.ok(testCase) } catch (error: any) { assert.fail(testCase) @@ -234,7 +240,7 @@ describe('[Block]: Header functions', () => { extraData = new Uint8Array(42) try { - BlockHeader.fromHeaderData({ ...data, extraData }, opts) + createHeader({ ...data, extraData }, opts) assert.fail(testCase) } catch (error: any) { assert.ok((error.message as string).includes('invalid amount of extra data'), testCase) @@ -254,7 +260,7 @@ describe('[Block]: Header functions', () => { 'clique block should validate with valid number of bytes in extraData: 32 byte vanity + 65 byte seal' extraData = concatBytes(new Uint8Array(32), new Uint8Array(65)) try { - BlockHeader.fromHeaderData({ ...data, extraData }, opts) + createHeader({ ...data, extraData }, opts) assert.ok(true, testCase) } catch (error: any) { assert.fail(testCase) @@ -264,7 +270,7 @@ describe('[Block]: Header functions', () => { testCase = 'clique block should throw on invalid extraData length' extraData = new Uint8Array(32) try { - BlockHeader.fromHeaderData({ ...data, extraData }, opts) + createHeader({ ...data, extraData }, opts) assert.fail(testCase) } catch (error: any) { assert.ok( @@ -285,7 +291,7 @@ describe('[Block]: Header functions', () => { ) const epoch = BigInt((common.consensusConfig() as CliqueConfig).epoch) try { - BlockHeader.fromHeaderData({ ...data, number: epoch, extraData }, opts) + createHeader({ ...data, number: epoch, extraData }, opts) assert.fail(testCase) } catch (error: any) { assert.ok( @@ -302,7 +308,7 @@ describe('[Block]: Header functions', () => { const extraData = concatBytes(new Uint8Array(1)) try { - BlockHeader.fromHeaderData({ extraData }, { common, skipConsensusFormatValidation: true }) + createHeader({ extraData }, { common, skipConsensusFormatValidation: true }) assert.ok( true, 'should instantiate header with invalid extraData when skipConsensusFormatValidation === true', @@ -316,26 +322,26 @@ describe('[Block]: Header functions', () => { const badHash = new Uint8Array(31) assert.throws( - () => BlockHeader.fromHeaderData({ parentHash: badHash }), + () => createHeader({ parentHash: badHash }), 'parentHash must be 32 bytes', undefined, 'throws on invalid parent hash length', ) assert.throws( - () => BlockHeader.fromHeaderData({ stateRoot: badHash }), + () => createHeader({ stateRoot: badHash }), 'stateRoot must be 32 bytes', undefined, 'throws on invalid state root hash length', ) assert.throws( - () => BlockHeader.fromHeaderData({ transactionsTrie: badHash }), + () => createHeader({ transactionsTrie: badHash }), 'transactionsTrie must be 32 bytes', undefined, 'throws on invalid transactionsTrie root hash length', ) assert.throws( - () => BlockHeader.fromHeaderData({ nonce: new Uint8Array(5) }), + () => createHeader({ nonce: new Uint8Array(5) }), 'nonce must be 8 bytes', undefined, 'contains nonce length error message', @@ -360,7 +366,7 @@ describe('[Block]: Header functions', () => { headerData.difficulty = BigInt(2) let testCase = 'should throw on lower than period timestamp diffs' - let header = BlockHeader.fromHeaderData(headerData, { common }) + let header = createHeader(headerData, { common }) try { await header.validate(blockchain) assert.fail(testCase) @@ -370,7 +376,7 @@ describe('[Block]: Header functions', () => { testCase = 'should not throw on timestamp diff equal to period' headerData.timestamp = BigInt(1422494864) - header = BlockHeader.fromHeaderData(headerData, { common }) + header = createHeader(headerData, { common }) try { await header.validate(blockchain) assert.ok(true, testCase) @@ -381,7 +387,7 @@ describe('[Block]: Header functions', () => { testCase = 'should throw on non-zero beneficiary (coinbase) for epoch transition block' headerData.number = common.consensusConfig().epoch headerData.coinbase = createAddressFromString('0x091dcd914fCEB1d47423e532955d1E62d1b2dAEf') - header = BlockHeader.fromHeaderData(headerData, { common }) + header = createHeader(headerData, { common }) try { await header.validate(blockchain) assert.fail('should throw') @@ -397,7 +403,7 @@ describe('[Block]: Header functions', () => { testCase = 'should throw on non-zero mixHash' headerData.mixHash = new Uint8Array(32).fill(1) - header = BlockHeader.fromHeaderData(headerData, { common }) + header = createHeader(headerData, { common }) try { await header.validate(blockchain) assert.fail('should throw') @@ -412,7 +418,7 @@ describe('[Block]: Header functions', () => { testCase = 'should throw on invalid clique difficulty' headerData.difficulty = BigInt(3) - header = BlockHeader.fromHeaderData(headerData, { common }) + header = createHeader(headerData, { common }) try { header.validateCliqueDifficulty(blockchain) assert.fail(testCase) @@ -433,7 +439,7 @@ describe('[Block]: Header functions', () => { const poaBlock = createBlockFromRLPSerializedBlock(genesisRlp, { common, cliqueSigner }) await poaBlockchain.putBlock(poaBlock) - header = BlockHeader.fromHeaderData(headerData, { common, cliqueSigner }) + header = createHeader(headerData, { common, cliqueSigner }) try { const res = header.validateCliqueDifficulty(poaBlockchain) assert.equal(res, true, testCase) @@ -444,7 +450,7 @@ describe('[Block]: Header functions', () => { testCase = 'validateCliqueDifficulty() should return false with INTURN difficulty and one signer' headerData.difficulty = BigInt(1) - header = BlockHeader.fromHeaderData(headerData, { common, cliqueSigner }) + header = createHeader(headerData, { common, cliqueSigner }) try { const res = header.validateCliqueDifficulty(poaBlockchain) assert.equal(res, false, testCase) @@ -473,16 +479,16 @@ describe('[Block]: Header functions', () => { }) it('should test isGenesis()', () => { - const header1 = BlockHeader.fromHeaderData({ number: 1 }) + const header1 = createHeader({ number: 1 }) assert.equal(header1.isGenesis(), false) - const header2 = BlockHeader.fromHeaderData() + const header2 = createHeader() assert.equal(header2.isGenesis(), true) }) it('should test hash() function', () => { let common = new Common({ chain: Chain.Mainnet, hardfork: Hardfork.Chainstart }) - let header = BlockHeader.fromHeaderData((blocksMainnet as any).default[0]['header'], { common }) + let header = createHeader((blocksMainnet as any).default[0]['header'], { common }) assert.equal( bytesToHex(header.hash()), '0x88e96d4537bea4d9c05d12549907b32561d3bf31f45aae734cdc119f13406cb6', @@ -490,7 +496,7 @@ describe('[Block]: Header functions', () => { ) common = new Common({ chain: Chain.Goerli, hardfork: Hardfork.Chainstart }) - header = BlockHeader.fromHeaderData((blocksGoerli as any).default[0]['header'], { common }) + header = createHeader((blocksGoerli as any).default[0]['header'], { common }) assert.equal( bytesToHex(header.hash()), '0x8f5bab218b6bb34476f51ca588e9f4553a3a7ce5e13a66c660a5283e97e9a85a', @@ -500,7 +506,7 @@ describe('[Block]: Header functions', () => { it('should be able to initialize shanghai header with correct hardfork defaults', () => { const common = new Common({ chain: Chain.Mainnet, hardfork: Hardfork.Shanghai }) - const header = BlockHeader.fromHeaderData({}, { common }) + const header = createHeader({}, { common }) assert.equal(header.common.hardfork(), Hardfork.Shanghai, 'hardfork should be set to shanghai') assert.equal(header.baseFeePerGas, BigInt(7), 'baseFeePerGas should be set to minimum default') assert.deepEqual( diff --git a/packages/block/test/mergeBlock.spec.ts b/packages/block/test/mergeBlock.spec.ts index 803dc9fc61..a56ec1d43a 100644 --- a/packages/block/test/mergeBlock.spec.ts +++ b/packages/block/test/mergeBlock.spec.ts @@ -10,8 +10,9 @@ import { import { assert, describe, it } from 'vitest' import { Block } from '../src/block.js' -import { createBlockFromBlockData } from '../src/constructors.js' -import { BlockHeader } from '../src/header.js' +import { createBlockFromBlockData, createHeader } from '../src/constructors.js' + +import type { BlockHeader } from '../src/header.js' const common = new Common({ chain: Chain.Mainnet, @@ -38,7 +39,7 @@ function validateMergeHeader(header: BlockHeader) { describe('[Header]: Casper PoS / The Merge Functionality', () => { it('should construct default blocks with post-merge PoS constants fields', () => { - const header = BlockHeader.fromHeaderData({}, { common }) + const header = createHeader({}, { common }) validateMergeHeader(header) const block = new Block(undefined, undefined, undefined, undefined, { common }, undefined) @@ -51,7 +52,7 @@ describe('[Header]: Casper PoS / The Merge Functionality', () => { const headerData = { uncleHash: hexToBytes('0x123abc'), } - BlockHeader.fromHeaderData(headerData, { common }) + createHeader(headerData, { common }) assert.fail('should throw') } catch (e: any) { assert.ok(true, 'should throw on wrong uncleHash') @@ -62,7 +63,7 @@ describe('[Header]: Casper PoS / The Merge Functionality', () => { difficulty: BigInt(123456), number: 1n, } - BlockHeader.fromHeaderData(headerData, { common }) + createHeader(headerData, { common }) assert.fail('should throw') } catch (e: any) { assert.ok(true, 'should throw on wrong difficulty') @@ -73,7 +74,7 @@ describe('[Header]: Casper PoS / The Merge Functionality', () => { extraData: new Uint8Array(33).fill(1), number: 1n, } - BlockHeader.fromHeaderData(headerData, { common }) + createHeader(headerData, { common }) assert.fail('should throw') } catch (e: any) { assert.ok(true, 'should throw on invalid extraData length') @@ -83,7 +84,7 @@ describe('[Header]: Casper PoS / The Merge Functionality', () => { const headerData = { mixHash: new Uint8Array(30).fill(1), } - BlockHeader.fromHeaderData(headerData, { common }) + createHeader(headerData, { common }) assert.fail('should throw') } catch (e: any) { assert.ok(true, 'should throw on invalid mixHash length') @@ -94,7 +95,7 @@ describe('[Header]: Casper PoS / The Merge Functionality', () => { nonce: new Uint8Array(8).fill(1), number: 1n, } - BlockHeader.fromHeaderData(headerData, { common }) + createHeader(headerData, { common }) assert.fail('should throw') } catch (e: any) { assert.ok(true, 'should throw on wrong nonce') @@ -103,15 +104,9 @@ describe('[Header]: Casper PoS / The Merge Functionality', () => { it('test that a PoS block with uncles cannot be produced', () => { try { - new Block( - undefined, - undefined, - [BlockHeader.fromHeaderData(undefined, { common })], - undefined, - { - common, - }, - ) + new Block(undefined, undefined, [createHeader(undefined, { common })], undefined, { + common, + }) assert.fail('should have thrown') } catch (e: any) { assert.ok(true, 'should throw') diff --git a/packages/blockchain/src/db/manager.ts b/packages/blockchain/src/db/manager.ts index d983fc5fc0..99ec462790 100644 --- a/packages/blockchain/src/db/manager.ts +++ b/packages/blockchain/src/db/manager.ts @@ -1,4 +1,8 @@ -import { BlockHeader, createBlockFromValuesArray, valuesArrayToHeaderData } from '@ethereumjs/block' +import { + createBlockFromValuesArray, + createHeaderFromValuesArray, + valuesArrayToHeaderData, +} from '@ethereumjs/block' import { RLP } from '@ethereumjs/rlp' import { BIGINT_0, @@ -176,7 +180,7 @@ export class DBManager { const parentHash = headerData.parentHash as Uint8Array opts.setHardfork = await this.getTotalDifficulty(parentHash, blockNumber - BIGINT_1) } - return BlockHeader.fromValuesArray(headerValues as Uint8Array[], opts) + return createHeaderFromValuesArray(headerValues as Uint8Array[], opts) } /** diff --git a/packages/blockchain/test/blockValidation.spec.ts b/packages/blockchain/test/blockValidation.spec.ts index 85736948eb..bbe06fe26e 100644 --- a/packages/blockchain/test/blockValidation.spec.ts +++ b/packages/blockchain/test/blockValidation.spec.ts @@ -1,4 +1,4 @@ -import { BlockHeader, createBlockFromBlockData } from '@ethereumjs/block' +import { createBlockFromBlockData, createHeader } from '@ethereumjs/block' import { Chain, Common, ConsensusAlgorithm, Hardfork } from '@ethereumjs/common' import { Ethash } from '@ethereumjs/ethash' import { RLP } from '@ethereumjs/rlp' @@ -224,7 +224,7 @@ describe('[Blockchain]: Block validation tests', () => { return BigInt(0) } - const header = BlockHeader.fromHeaderData( + const header = createHeader( { number: BigInt(1), parentHash: genesis.hash(), @@ -242,7 +242,7 @@ describe('[Blockchain]: Block validation tests', () => { const block = createBlockFromBlockData({ header }, { common }) await blockchain.putBlock(block) try { - const header = BlockHeader.fromHeaderData( + const header = createHeader( { number: BigInt(2), parentHash: block.hash(), @@ -343,7 +343,7 @@ describe('[Blockchain]: Block validation tests', () => { const uncleHeaderData = unclePreFork.header.toJSON() uncleHeaderData.extraData = '0xffff' - const uncleHeader = BlockHeader.fromHeaderData(uncleHeaderData, { + const uncleHeader = createHeader(uncleHeaderData, { common: new Common({ chain: Chain.Mainnet, hardfork: Hardfork.Berlin }), }) diff --git a/packages/blockchain/test/index.spec.ts b/packages/blockchain/test/index.spec.ts index 7192f92852..17a8e15c8d 100644 --- a/packages/blockchain/test/index.spec.ts +++ b/packages/blockchain/test/index.spec.ts @@ -1,7 +1,8 @@ import { - BlockHeader, createBlockFromBlockData, createBlockFromRLPSerializedBlock, + createHeader, + createHeaderFromValuesArray, } from '@ethereumjs/block' import { Chain, Common, Hardfork } from '@ethereumjs/common' import { MapDB, bytesToHex, equalsBytes, hexToBytes, utf8ToBytes } from '@ethereumjs/util' @@ -438,7 +439,7 @@ describe('blockchain test', () => { gasLimit: 8000000, timestamp: BigInt(blocks[14].header.timestamp) + BigInt(1), } - const forkHeader = BlockHeader.fromHeaderData(headerData, { + const forkHeader = createHeader(headerData, { common, calcDifficultyFromHeader: blocks[14].header, }) @@ -463,7 +464,7 @@ describe('blockchain test', () => { //eslint-disable-next-line timestamp: BigInt(blocks[14].header.timestamp) + BigInt(1), } - const forkHeader = BlockHeader.fromHeaderData(headerData, { + const forkHeader = createHeader(headerData, { common, calcDifficultyFromHeader: blocks[14].header, }) @@ -530,7 +531,7 @@ describe('blockchain test', () => { const block2HeaderValuesArray = blocks[2].header.raw() block2HeaderValuesArray[1] = new Uint8Array(32) - const block2Header = BlockHeader.fromValuesArray(block2HeaderValuesArray, { + const block2Header = createHeaderFromValuesArray(block2HeaderValuesArray, { common: blocks[2].common, }) await blockchain.putHeader(block2Header) @@ -628,7 +629,7 @@ describe('blockchain test', () => { gasLimit, timestamp: genesisBlock.header.timestamp + BigInt(1), } - const header = BlockHeader.fromHeaderData(headerData, { + const header = createHeader(headerData, { calcDifficultyFromHeader: genesisBlock.header, common, }) @@ -678,7 +679,7 @@ describe('blockchain test', () => { gasLimit, } opts.calcDifficultyFromHeader = genesisBlock.header - const header1 = BlockHeader.fromHeaderData(headerData1, opts) + const header1 = createHeader(headerData1, opts) const headers = [header1] const headerData2 = { @@ -688,7 +689,7 @@ describe('blockchain test', () => { gasLimit, } opts.calcDifficultyFromHeader = block.header - const header2 = BlockHeader.fromHeaderData(headerData2, opts) + const header2 = createHeader(headerData2, opts) headers.push(header2) await blockchain.putHeaders(headers) diff --git a/packages/blockchain/test/util.ts b/packages/blockchain/test/util.ts index aa1b972b40..893d9d487f 100644 --- a/packages/blockchain/test/util.ts +++ b/packages/blockchain/test/util.ts @@ -1,4 +1,4 @@ -import { Block, BlockHeader, createBlockFromBlockData } from '@ethereumjs/block' +import { Block, createBlockFromBlockData, createHeader } from '@ethereumjs/block' import { Chain, Common, Hardfork } from '@ethereumjs/common' import { RLP } from '@ethereumjs/rlp' import { @@ -13,6 +13,7 @@ import { keccak256 } from 'ethereum-cryptography/keccak.js' import { createBlockchain } from '../src/index.js' +import type { BlockHeader } from '@ethereumjs/block' import type { DB } from '@ethereumjs/util' export const generateBlocks = (numberOfBlocks: number, existingBlocks?: Block[]): Block[] => { @@ -82,14 +83,14 @@ export const generateConsecutiveBlock = ( difficultyChangeFactor = 1 } const common = new Common({ chain: Chain.Mainnet, hardfork: Hardfork.MuirGlacier }) - const tmpHeader = BlockHeader.fromHeaderData( + const tmpHeader = createHeader( { number: parentBlock.header.number + BigInt(1), timestamp: parentBlock.header.timestamp + BigInt(10 + -difficultyChangeFactor * 9), }, { common }, ) - const header = BlockHeader.fromHeaderData( + const header = createHeader( { number: parentBlock.header.number + BigInt(1), parentHash: parentBlock.hash(), diff --git a/packages/client/src/blockchain/chain.ts b/packages/client/src/blockchain/chain.ts index 0164e6bce2..cfe4ab01d0 100644 --- a/packages/client/src/blockchain/chain.ts +++ b/packages/client/src/blockchain/chain.ts @@ -1,4 +1,4 @@ -import { BlockHeader, createBlockFromValuesArray } from '@ethereumjs/block' +import { createBlockFromValuesArray, createHeaderFromValuesArray } from '@ethereumjs/block' import { CliqueConsensus, createBlockchain } from '@ethereumjs/blockchain' import { ConsensusAlgorithm, Hardfork } from '@ethereumjs/common' import { BIGINT_0, BIGINT_1, equalsBytes } from '@ethereumjs/util' @@ -7,7 +7,7 @@ import { LevelDB } from '../execution/level.js' import { Event } from '../types.js' import type { Config } from '../config.js' -import type { Block } from '@ethereumjs/block' +import type { Block, BlockHeader } from '@ethereumjs/block' import type { Blockchain, ConsensusDict } from '@ethereumjs/blockchain' import type { DB, DBObject, GenesisState } from '@ethereumjs/util' import type { AbstractLevel } from 'abstract-level' @@ -504,7 +504,7 @@ export class Chain { } break } - const header = BlockHeader.fromValuesArray(h.raw(), { + const header = createHeaderFromValuesArray(h.raw(), { common: this.config.chainCommon, setHardfork: this.headers.td, }) diff --git a/packages/client/src/miner/miner.ts b/packages/client/src/miner/miner.ts index 5f898b2f8e..9d6437818a 100644 --- a/packages/client/src/miner/miner.ts +++ b/packages/client/src/miner/miner.ts @@ -1,4 +1,4 @@ -import { BlockHeader } from '@ethereumjs/block' +import { type BlockHeader, createHeader } from '@ethereumjs/block' import { ConsensusType, Hardfork } from '@ethereumjs/common' import { Ethash } from '@ethereumjs/ethash' import { BIGINT_0, BIGINT_1, BIGINT_2, bytesToHex, equalsBytes } from '@ethereumjs/util' @@ -209,10 +209,7 @@ export class Miner { if (this.config.chainCommon.consensusType() === ConsensusType.ProofOfAuthority) { // Abort if we have too recently signed const cliqueSigner = this.config.accounts[0][1] - const header = BlockHeader.fromHeaderData( - { number }, - { common: this.config.chainCommon, cliqueSigner }, - ) + const header = createHeader({ number }, { common: this.config.chainCommon, cliqueSigner }) if ( (this.service.chain.blockchain as any).consensus.cliqueCheckRecentlySigned(header) === true ) { diff --git a/packages/client/src/net/protocol/ethprotocol.ts b/packages/client/src/net/protocol/ethprotocol.ts index ed8f811776..c79ccb6144 100644 --- a/packages/client/src/net/protocol/ethprotocol.ts +++ b/packages/client/src/net/protocol/ethprotocol.ts @@ -1,6 +1,6 @@ import { - BlockHeader, createBlockFromValuesArray, + createHeaderFromValuesArray, getDifficulty, valuesArrayToHeaderData, } from '@ethereumjs/block' @@ -34,7 +34,13 @@ import { Protocol } from './protocol.js' import type { Chain } from '../../blockchain/index.js' import type { TxReceiptWithType } from '../../execution/receipt.js' import type { Message, ProtocolOptions } from './protocol.js' -import type { Block, BlockBodyBytes, BlockBytes, BlockHeaderBytes } from '@ethereumjs/block' +import type { + Block, + BlockBodyBytes, + BlockBytes, + BlockHeader, + BlockHeaderBytes, +} from '@ethereumjs/block' import type { Log } from '@ethereumjs/evm' import type { TypedTransaction } from '@ethereumjs/tx' import type { BigIntLike, PrefixedHexString } from '@ethereumjs/util' @@ -173,7 +179,7 @@ export class EthProtocol extends Protocol { const common = this.config.chainCommon // If this is a post merge block, we can still send chainTTD since it would still lead // to correct hardfork choice - const header = BlockHeader.fromValuesArray( + const header = createHeaderFromValuesArray( h, difficulty > 0 ? { common, setHardfork: true } : { common, setHardfork: this.chainTTD }, ) diff --git a/packages/client/src/net/protocol/lesprotocol.ts b/packages/client/src/net/protocol/lesprotocol.ts index bf624f2c2b..82d8d753d3 100644 --- a/packages/client/src/net/protocol/lesprotocol.ts +++ b/packages/client/src/net/protocol/lesprotocol.ts @@ -1,4 +1,4 @@ -import { BlockHeader } from '@ethereumjs/block' +import { createHeaderFromValuesArray } from '@ethereumjs/block' import { BIGINT_0, bigIntToUnpaddedBytes, @@ -13,7 +13,7 @@ import { Protocol } from './protocol.js' import type { Chain } from '../../blockchain/index.js' import type { FlowControl } from './flowcontrol.js' import type { Message, ProtocolOptions } from './protocol.js' -import type { BlockHeaderBytes } from '@ethereumjs/block' +import type { BlockHeader, BlockHeaderBytes } from '@ethereumjs/block' export interface LesProtocolOptions extends ProtocolOptions { /* Blockchain */ @@ -109,7 +109,7 @@ export class LesProtocol extends Protocol { reqId: bytesToBigInt(reqId), bv: bytesToBigInt(bv), headers: headers.map((h: BlockHeaderBytes) => - BlockHeader.fromValuesArray(h, { + createHeaderFromValuesArray(h, { setHardfork: true, common: this.config.chainCommon, // eslint-disable-line no-invalid-this }), diff --git a/packages/client/test/miner/miner.spec.ts b/packages/client/test/miner/miner.spec.ts index ec82090d15..f13db4b436 100644 --- a/packages/client/test/miner/miner.spec.ts +++ b/packages/client/test/miner/miner.spec.ts @@ -1,4 +1,4 @@ -import { BlockHeader, createBlockFromBlockData } from '@ethereumjs/block' +import { BlockHeader, createBlockFromBlockData, createHeader } from '@ethereumjs/block' import { Common, Chain as CommonChain, @@ -53,7 +53,7 @@ class FakeChain { update() {} get headers() { return { - latest: BlockHeader.fromHeaderData(), + latest: createHeader(), height: BigInt(0), } } @@ -64,10 +64,10 @@ class FakeChain { } } getBlock() { - return BlockHeader.fromHeaderData() + return createHeader() } getCanonicalHeadHeader() { - return BlockHeader.fromHeaderData() + return createHeader() } blockchain: any = { putBlock: async () => {}, diff --git a/packages/client/test/miner/pendingBlock.spec.ts b/packages/client/test/miner/pendingBlock.spec.ts index 331c899804..e8d274cbb5 100644 --- a/packages/client/test/miner/pendingBlock.spec.ts +++ b/packages/client/test/miner/pendingBlock.spec.ts @@ -1,4 +1,4 @@ -import { Block, BlockHeader } from '@ethereumjs/block' +import { Block, BlockHeader, createHeader } from '@ethereumjs/block' import { Common, Chain as CommonChain, @@ -75,7 +75,7 @@ const setup = () => { const service: any = { chain: { headers: { height: BigInt(0) }, - getCanonicalHeadHeader: () => BlockHeader.fromHeaderData({}, { common }), + getCanonicalHeadHeader: () => createHeader({}, { common }), }, execution: { vm: { diff --git a/packages/client/test/rpc/debug/getRawBlock.spec.ts b/packages/client/test/rpc/debug/getRawBlock.spec.ts index 8c32a58cc1..b2a0fe7e50 100644 --- a/packages/client/test/rpc/debug/getRawBlock.spec.ts +++ b/packages/client/test/rpc/debug/getRawBlock.spec.ts @@ -1,4 +1,4 @@ -import { BlockHeader, createBlockFromBlockData } from '@ethereumjs/block' +import { createBlockFromBlockData, createHeader } from '@ethereumjs/block' import { createCustomCommon } from '@ethereumjs/common' import { create4844BlobTx, createLegacyTx } from '@ethereumjs/tx' import { bytesToHex, createZeroAddress, hexToBytes } from '@ethereumjs/util' @@ -28,7 +28,7 @@ const block = { header: { number: BigInt(1), hash: () => blockHash, - serialize: () => BlockHeader.fromHeaderData({ number: 1 }).serialize(), + serialize: () => createHeader({ number: 1 }).serialize(), }, toJSON: () => ({ ...createBlockFromBlockData({ header: { number: 1 } }).toJSON(), diff --git a/packages/client/test/rpc/debug/getRawHeader.spec.ts b/packages/client/test/rpc/debug/getRawHeader.spec.ts index 19752304ac..d804abd253 100644 --- a/packages/client/test/rpc/debug/getRawHeader.spec.ts +++ b/packages/client/test/rpc/debug/getRawHeader.spec.ts @@ -1,4 +1,4 @@ -import { BlockHeader, createBlockFromBlockData } from '@ethereumjs/block' +import { createBlockFromBlockData, createHeader } from '@ethereumjs/block' import { createCustomCommon } from '@ethereumjs/common' import { create4844BlobTx, createLegacyTx } from '@ethereumjs/tx' import { bytesToHex, createZeroAddress, hexToBytes } from '@ethereumjs/util' @@ -28,7 +28,7 @@ const block = { header: { number: BigInt(1), hash: () => blockHash, - serialize: () => BlockHeader.fromHeaderData({ number: 1 }).serialize(), + serialize: () => createHeader({ number: 1 }).serialize(), }, toJSON: () => ({ ...createBlockFromBlockData({ header: { number: 1 } }).toJSON(), @@ -47,7 +47,7 @@ const genesisBlock = { hash: () => genesisBlockHash, header: { number: BigInt(0), - serialize: () => BlockHeader.fromHeaderData({ number: 0 }).serialize(), + serialize: () => createHeader({ number: 0 }).serialize(), }, toJSON: () => ({ ...createBlockFromBlockData({ header: { number: 0 } }).toJSON(), transactions }), serialize: () => createBlockFromBlockData({ header: { number: 0 }, transactions }).serialize(), diff --git a/packages/client/test/rpc/engine/getPayloadBodiesByHashV1.spec.ts b/packages/client/test/rpc/engine/getPayloadBodiesByHashV1.spec.ts index eb32e274ac..3d390fec9b 100644 --- a/packages/client/test/rpc/engine/getPayloadBodiesByHashV1.spec.ts +++ b/packages/client/test/rpc/engine/getPayloadBodiesByHashV1.spec.ts @@ -1,4 +1,4 @@ -import { BlockHeader, createBlockFromBlockData } from '@ethereumjs/block' +import { createBlockFromBlockData, createHeader } from '@ethereumjs/block' import { Hardfork } from '@ethereumjs/common' import { DefaultStateManager } from '@ethereumjs/statemanager' import { createTxFromTxData } from '@ethereumjs/tx' @@ -75,7 +75,7 @@ describe(method, () => { const block = createBlockFromBlockData( { transactions: [tx], - header: BlockHeader.fromHeaderData( + header: createHeader( { parentHash: chain.genesis.hash(), number: 1n }, { common, skipConsensusFormatValidation: true }, ), @@ -85,7 +85,7 @@ describe(method, () => { const block2 = createBlockFromBlockData( { transactions: [tx2], - header: BlockHeader.fromHeaderData( + header: createHeader( { parentHash: block.hash(), number: 2n }, { common, skipConsensusFormatValidation: true }, ), @@ -161,7 +161,7 @@ describe(method, () => { const block = createBlockFromBlockData( { transactions: [tx], - header: BlockHeader.fromHeaderData( + header: createHeader( { parentHash: chain.genesis.hash(), number: 1n }, { common, skipConsensusFormatValidation: true }, ), @@ -171,7 +171,7 @@ describe(method, () => { const block2 = createBlockFromBlockData( { transactions: [tx2], - header: BlockHeader.fromHeaderData( + header: createHeader( { parentHash: block.hash(), number: 2n }, { common, skipConsensusFormatValidation: true }, ), diff --git a/packages/client/test/rpc/engine/getPayloadBodiesByRangeV1.spec.ts b/packages/client/test/rpc/engine/getPayloadBodiesByRangeV1.spec.ts index 1d5890fefb..26fcb7a259 100644 --- a/packages/client/test/rpc/engine/getPayloadBodiesByRangeV1.spec.ts +++ b/packages/client/test/rpc/engine/getPayloadBodiesByRangeV1.spec.ts @@ -1,4 +1,4 @@ -import { BlockHeader, createBlockFromBlockData } from '@ethereumjs/block' +import { createBlockFromBlockData, createHeader } from '@ethereumjs/block' import { Hardfork } from '@ethereumjs/common' import { DefaultStateManager } from '@ethereumjs/statemanager' import { createTxFromTxData } from '@ethereumjs/tx' @@ -71,7 +71,7 @@ describe(method, () => { const block = createBlockFromBlockData( { transactions: [tx], - header: BlockHeader.fromHeaderData( + header: createHeader( { parentHash: chain.genesis.hash(), number: 1n }, { common, skipConsensusFormatValidation: true }, ), @@ -81,7 +81,7 @@ describe(method, () => { const block2 = createBlockFromBlockData( { transactions: [tx2], - header: BlockHeader.fromHeaderData( + header: createHeader( { parentHash: block.hash(), number: 2n }, { common, skipConsensusFormatValidation: true }, ), @@ -153,7 +153,7 @@ describe(method, () => { const block = createBlockFromBlockData( { transactions: [tx], - header: BlockHeader.fromHeaderData( + header: createHeader( { parentHash: chain.genesis.hash(), number: 1n }, { common, skipConsensusFormatValidation: true }, ), @@ -163,7 +163,7 @@ describe(method, () => { const block2 = createBlockFromBlockData( { transactions: [tx2], - header: BlockHeader.fromHeaderData( + header: createHeader( { parentHash: block.hash(), number: 2n }, { common, skipConsensusFormatValidation: true }, ), diff --git a/packages/client/test/rpc/eth/estimateGas.spec.ts b/packages/client/test/rpc/eth/estimateGas.spec.ts index c3c7da94c8..5c68aa7e7a 100644 --- a/packages/client/test/rpc/eth/estimateGas.spec.ts +++ b/packages/client/test/rpc/eth/estimateGas.spec.ts @@ -1,4 +1,4 @@ -import { BlockHeader, createBlockFromBlockData } from '@ethereumjs/block' +import { createBlockFromBlockData, createHeader } from '@ethereumjs/block' import { createBlockchain } from '@ethereumjs/blockchain' import { createCommonFromGethGenesis } from '@ethereumjs/common' import { getGenesis } from '@ethereumjs/genesis' @@ -131,7 +131,7 @@ describe( const headBlock = await service.chain.getCanonicalHeadBlock() const londonBlock = createBlockFromBlockData( { - header: BlockHeader.fromHeaderData( + header: createHeader( { baseFeePerGas: 1000000000n, number: 2n, diff --git a/packages/client/test/rpc/helpers.ts b/packages/client/test/rpc/helpers.ts index e25fccdc05..38f9adce19 100644 --- a/packages/client/test/rpc/helpers.ts +++ b/packages/client/test/rpc/helpers.ts @@ -1,4 +1,4 @@ -import { BlockHeader } from '@ethereumjs/block' +import { createHeader } from '@ethereumjs/block' import { createBlockchain } from '@ethereumjs/blockchain' import { Chain as ChainEnum, Common, Hardfork, parseGethGenesis } from '@ethereumjs/common' import { getGenesis } from '@ethereumjs/genesis' @@ -122,7 +122,7 @@ export async function createClient(clientOpts: Partial = {}) { chain.getTd = async (_hash: Uint8Array, _num: bigint) => BigInt(1000) if ((chain as any)._headers !== undefined) { - ;(chain as any)._headers.latest = BlockHeader.fromHeaderData( + ;(chain as any)._headers.latest = createHeader( { withdrawalsRoot: common.isActivatedEIP(4895) ? KECCAK256_RLP : undefined }, { common }, ) diff --git a/packages/client/test/rpc/txpool/content.spec.ts b/packages/client/test/rpc/txpool/content.spec.ts index d62745c125..623a368c64 100644 --- a/packages/client/test/rpc/txpool/content.spec.ts +++ b/packages/client/test/rpc/txpool/content.spec.ts @@ -1,4 +1,4 @@ -import { BlockHeader, createBlockFromBlockData } from '@ethereumjs/block' +import { createBlockFromBlockData, createHeader } from '@ethereumjs/block' import { createBlockchain } from '@ethereumjs/blockchain' import { Chain, Common, Hardfork } from '@ethereumjs/common' import { getGenesis } from '@ethereumjs/genesis' @@ -53,7 +53,7 @@ describe(method, () => { const headBlock = await service.chain.getCanonicalHeadBlock() const londonBlock = createBlockFromBlockData( { - header: BlockHeader.fromHeaderData( + header: createHeader( { baseFeePerGas: 1000000000n, number: 2n, diff --git a/packages/client/test/sync/fetcher/blockfetcher.spec.ts b/packages/client/test/sync/fetcher/blockfetcher.spec.ts index e21c0adeca..5bd9dddf6a 100644 --- a/packages/client/test/sync/fetcher/blockfetcher.spec.ts +++ b/packages/client/test/sync/fetcher/blockfetcher.spec.ts @@ -1,4 +1,4 @@ -import { BlockHeader } from '@ethereumjs/block' +import { createHeader } from '@ethereumjs/block' import { Hardfork } from '@ethereumjs/common' import { KECCAK256_RLP } from '@ethereumjs/util' import { assert, describe, it, vi } from 'vitest' @@ -211,7 +211,7 @@ describe('[BlockFetcher]', async () => { count: BigInt(0), }) - const shanghaiHeader = BlockHeader.fromHeaderData( + const shanghaiHeader = createHeader( { number: 1, withdrawalsRoot: KECCAK256_RLP }, { common: config.chainCommon, setHardfork: true }, ) diff --git a/packages/client/test/sync/lightsync.spec.ts b/packages/client/test/sync/lightsync.spec.ts index b75f4eaff6..93a7dde658 100644 --- a/packages/client/test/sync/lightsync.spec.ts +++ b/packages/client/test/sync/lightsync.spec.ts @@ -1,4 +1,4 @@ -import { BlockHeader } from '@ethereumjs/block' +import { createHeader } from '@ethereumjs/block' import * as td from 'testdouble' import { assert, describe, it, vi } from 'vitest' @@ -8,6 +8,8 @@ import { Peer } from '../../src/net/peer/peer.js' import { HeaderFetcher } from '../../src/sync/fetcher/headerfetcher.js' import { Event } from '../../src/types.js' +import type { BlockHeader } from '@ethereumjs/block' + class PeerPool { open() {} close() {} @@ -180,7 +182,7 @@ describe('import headers', () => { } as any) td.when(HeaderFetcher.prototype.fetch()).thenResolve(true) td.when(HeaderFetcher.prototype.fetch()).thenDo(() => - config.events.emit(Event.SYNC_FETCHED_HEADERS, [BlockHeader.fromHeaderData({})]), + config.events.emit(Event.SYNC_FETCHED_HEADERS, [createHeader({})]), ) config.logger.on('data', async (data) => { if ((data.message as string).includes('Imported headers count=1')) { diff --git a/packages/client/test/sync/snapsync.spec.ts b/packages/client/test/sync/snapsync.spec.ts index 9a311080c4..dec6bc67e8 100644 --- a/packages/client/test/sync/snapsync.spec.ts +++ b/packages/client/test/sync/snapsync.spec.ts @@ -1,4 +1,4 @@ -import { BlockHeader } from '@ethereumjs/block' +import { createHeader } from '@ethereumjs/block' import { assert, describe, it, vi } from 'vitest' import { Chain } from '../../src/blockchain/index.js' @@ -72,12 +72,8 @@ describe('[SnapSynchronizer]', async () => { chain, } as any) ;(sync as any).chain = { blocks: { height: 1 } } - const getBlockHeaders1 = vi - .fn() - .mockReturnValue([BigInt(1), [BlockHeader.fromHeaderData({ number: 1 })]]) - const getBlockHeaders2 = vi - .fn() - .mockReturnValue([BigInt(2), [BlockHeader.fromHeaderData({ number: 2 })]]) + const getBlockHeaders1 = vi.fn().mockReturnValue([BigInt(1), [createHeader({ number: 1 })]]) + const getBlockHeaders2 = vi.fn().mockReturnValue([BigInt(2), [createHeader({ number: 2 })]]) const peers = [ { snap: {}, diff --git a/packages/devp2p/examples/peer-communication-les.ts b/packages/devp2p/examples/peer-communication-les.ts index f173cb44db..7f3257e4ea 100644 --- a/packages/devp2p/examples/peer-communication-les.ts +++ b/packages/devp2p/examples/peer-communication-les.ts @@ -1,11 +1,11 @@ -import { BlockHeader, createBlockFromValuesArray } from '@ethereumjs/block' +import { createBlockFromValuesArray, createHeaderFromValuesArray } from '@ethereumjs/block' import { Chain, Common, Hardfork } from '@ethereumjs/common' import * as devp2p from '@ethereumjs/devp2p' import { bytesToHex, bytesToInt, hexToBytes, intToBytes, randomBytes } from '@ethereumjs/util' import chalk from 'chalk' import ms from 'ms' -import type { Block } from '@ethereumjs/block' +import type { Block, BlockHeader } from '@ethereumjs/block' import type { Peer } from '@ethereumjs/devp2p' const PRIVATE_KEY = randomBytes(32) @@ -109,7 +109,7 @@ rlpx.events.on('peer:added', (peer) => { ) break } - const header = BlockHeader.fromValuesArray(payload[2][0], { common }) + const header = createHeaderFromValuesArray(payload[2][0], { common }) setTimeout(() => { les.sendMessage(devp2p.LES.MESSAGE_CODES.GET_BLOCK_BODIES, [ diff --git a/packages/devp2p/examples/peer-communication.ts b/packages/devp2p/examples/peer-communication.ts index e408062864..03397e5c71 100644 --- a/packages/devp2p/examples/peer-communication.ts +++ b/packages/devp2p/examples/peer-communication.ts @@ -174,7 +174,7 @@ rlpx.events.on('peer:added', (peer) => { } const expectedHash = CHECK_BLOCK - const header = BlockHeader.fromValuesArray(payload[1][0], { common }) + const header = createHeaderFromValuesArray(payload[1][0], { common }) if (bytesToUnprefixedHex(header.hash()) === expectedHash) { console.log(`${addr} verified to be on the same side of the ${CHECK_BLOCK_TITLE}`) clearTimeout(forkDrop) @@ -189,7 +189,7 @@ rlpx.events.on('peer:added', (peer) => { } let isValidPayload = false - const header = BlockHeader.fromValuesArray(payload[1][0], { common }) + const header = createHeaderFromValuesArray(payload[1][0], { common }) while (requests.headers.length > 0) { const blockHash = requests.headers.shift() if (equalsBytes(header.hash(), blockHash)) { diff --git a/packages/ethash/src/index.ts b/packages/ethash/src/index.ts index 0f2f274e48..7146af7203 100644 --- a/packages/ethash/src/index.ts +++ b/packages/ethash/src/index.ts @@ -1,4 +1,4 @@ -import { Block, BlockHeader, createBlockFromBlockData } from '@ethereumjs/block' +import { Block, BlockHeader, createBlockFromBlockData, createHeader } from '@ethereumjs/block' import { RLP } from '@ethereumjs/rlp' import { BIGINT_0, @@ -101,7 +101,7 @@ export class Miner { const data = this.blockHeader.toJSON() data.mixHash = solution.mixHash data.nonce = solution.nonce - return BlockHeader.fromHeaderData(data, { common: this.blockHeader.common }) + return createHeader(data, { common: this.blockHeader.common }) } } } diff --git a/packages/ethash/test/ethash.spec.ts b/packages/ethash/test/ethash.spec.ts index ecbee8e2ca..40caf063f9 100644 --- a/packages/ethash/test/ethash.spec.ts +++ b/packages/ethash/test/ethash.spec.ts @@ -1,4 +1,4 @@ -import { BlockHeader } from '@ethereumjs/block' +import { createHeaderFromRLP } from '@ethereumjs/block' import { Chain, Common, Hardfork } from '@ethereumjs/common' import { bytesToHex, hexToBytes } from '@ethereumjs/util' import { assert, describe, it } from 'vitest' @@ -16,7 +16,7 @@ describe('POW tests', () => { it('should work', async () => { for (const key of tests) { const test = powTests[key] - const header = BlockHeader.fromRLPSerializedHeader(hexToBytes(`0x${test.header}`), { common }) + const header = createHeaderFromRLP(hexToBytes(`0x${test.header}`), { common }) const headerHash = ethash.headerHash(header.raw()) assert.equal(bytesToHex(headerHash), '0x' + test.header_hash, 'generate header hash') diff --git a/packages/vm/test/api/EIPs/eip-4788-beaconroot.spec.ts b/packages/vm/test/api/EIPs/eip-4788-beaconroot.spec.ts index 8ea1f1f1d1..8e84fab200 100644 --- a/packages/vm/test/api/EIPs/eip-4788-beaconroot.spec.ts +++ b/packages/vm/test/api/EIPs/eip-4788-beaconroot.spec.ts @@ -9,7 +9,7 @@ * - Input length < 32 bytes (reverts) */ -import { BlockHeader, createBlockFromBlockData } from '@ethereumjs/block' +import { createBlockFromBlockData, createHeader } from '@ethereumjs/block' import { Chain, Common, Hardfork } from '@ethereumjs/common' import { type TransactionType, type TxData, createTxFromTxData } from '@ethereumjs/tx' import { @@ -56,7 +56,7 @@ function beaconrootBlock( } const root = setLengthLeft(bigIntToBytes(blockroot), 32) - const header = BlockHeader.fromHeaderData( + const header = createHeader( { parentBeaconBlockRoot: root, timestamp, diff --git a/packages/vm/test/api/runTx.spec.ts b/packages/vm/test/api/runTx.spec.ts index a74049fa49..b7b4623c13 100644 --- a/packages/vm/test/api/runTx.spec.ts +++ b/packages/vm/test/api/runTx.spec.ts @@ -1,4 +1,4 @@ -import { BlockHeader, createBlockFromBlockData } from '@ethereumjs/block' +import { createBlockFromBlockData, createHeader } from '@ethereumjs/block' import { Blockchain, createBlockchain } from '@ethereumjs/blockchain' import { Chain, Common, Hardfork, createCommonFromGethGenesis } from '@ethereumjs/common' import { @@ -903,7 +903,7 @@ describe('EIP 4844 transaction tests', () => { Blockchain.prototype.getBlock = async () => { return createBlockFromBlockData( { - header: BlockHeader.fromHeaderData( + header: createHeader( { excessBlobGas: 0n, number: 1, @@ -931,7 +931,7 @@ describe('EIP 4844 transaction tests', () => { const block = createBlockFromBlockData( { - header: BlockHeader.fromHeaderData( + header: createHeader( { excessBlobGas: 1n, number: 2, diff --git a/packages/vm/test/util.ts b/packages/vm/test/util.ts index c2ace8fa1e..6bf1c10d7c 100644 --- a/packages/vm/test/util.ts +++ b/packages/vm/test/util.ts @@ -1,4 +1,4 @@ -import { Block, BlockHeader } from '@ethereumjs/block' +import { Block, createHeader } from '@ethereumjs/block' import { Chain, Common, Hardfork, createCustomCommon } from '@ethereumjs/common' import { RLP } from '@ethereumjs/rlp' import { @@ -326,7 +326,7 @@ export function makeBlockHeader(data: any, opts?: BlockOptions) { if (opts?.common && opts.common.gteHardfork('london')) { headerData['baseFeePerGas'] = currentBaseFee if (currentBaseFee === undefined) { - const parentBlockHeader = BlockHeader.fromHeaderData( + const parentBlockHeader = createHeader( { gasLimit: parentGasLimit, gasUsed: parentGasUsed, @@ -344,7 +344,7 @@ export function makeBlockHeader(data: any, opts?: BlockOptions) { if (opts?.common && opts.common.gteHardfork('cancun')) { headerData['excessBlobGas'] = currentExcessBlobGas } - return BlockHeader.fromHeaderData(headerData, opts) + return createHeader(headerData, opts) } /**