Block Header Items For Block Hash Recreation - All Ethereum Eras
There are currently 5 eras, each with a different concoction of block header elements/items needed in an exact order to re-create the exact block hash. Every major update that changed the block header, changed the way the block.hash was made.
Cancun (Current latest era as of May 13th, 2024):
```javascript
// [19426587, Current] inclusive. Cancun --> Now
async function rlpEncodeHeader(blockNumber) {
// 1. Get the full block
const block = await web3.eth.getBlock(blockNumber);
// 2. Make array with only block header items.
const blockHeader = [
block.parentHash,
block.sha3Uncles,
block.miner,
block.stateRoot,
block.transactionsRoot,
block.receiptsRoot,
block.logsBloom,
block.difficulty,
block.number,
block.gasLimit,
block.gasUsed,
block.timestamp,
block.extraData,
block.mixHash,
'0x0000000000000000', //block.nonce
block.baseFeePerGas,
block.withdrawalsRoot,
block.blobGasUsed,
block.excessBlobGas,
block.parentBeaconBlockRoot,
];
// 3. RLP encode the block header, turning it into uint8 array.
const encodedHeader = RLP.encode(blockHeader);
// 4. Convert encoded header to a Buffer and then to hex so we can hash it.
const encodedHeaderHex = '0x' + Buffer.from(encodedHeader).toString('hex');
// 5. Verification: Hash the encodedHeaderHex to check the recreated block hash matches actual block.hash
const recreatedBlockHash = ethers.keccak256(encodedHeaderHex);
console.log("recreated block hash:", recreatedBlockHash);
console.log("actual block hash:", block.hash);
assert.deepStrictEqual(recreatedBlockHash, block.hash);
return encodedHeaderHex;
}
//rlpEncodeHeader(5800000);
```Shanghai -> Cancun:
Paris -> Shanghai
London -> Paris (The Merge)
Genesis -> London
Last updated