or run

npx @tessl/cli init
Log in

Version

Tile

Overview

Evals

Files

docs

block-operations.mdconsensus-operations.mdheader-operations.mdindex.mdutility-functions.md
tile.json

block-operations.mddocs/

Block Operations

Core block functionality for creating, validating, and manipulating complete Ethereum blocks with transactions, uncles, and withdrawals.

Capabilities

Block Class

The main Block class represents a complete Ethereum block including header, transactions, uncles, and withdrawals.

/**
 * Class representing a block in the Ethereum network
 */
class Block {
  readonly header: BlockHeader;
  readonly transactions: TypedTransaction[];
  readonly uncleHeaders: BlockHeader[];
  readonly withdrawals?: Withdrawal[];
  readonly common: Common;
  readonly executionWitness?: VerkleExecutionWitness | null;

  /**
   * Returns the hash of the block
   * @returns Block hash as Uint8Array
   */
  hash(): Uint8Array;

  /**
   * Returns the RLP serialization of the block
   * @returns RLP-encoded block as Uint8Array
   */
  serialize(): Uint8Array;

  /**
   * Checks if the block is the genesis block
   * @returns True if this is the genesis block
   */
  isGenesis(): boolean;

  /**
   * Returns raw bytes array representation of the block
   * @returns Array of raw bytes arrays
   */
  raw(): BlockBytes;

  /**
   * Validates the entire block including header and transactions
   * @param onlyHeader - Only validate header if true
   * @param verifyTxs - Verify transaction signatures if true
   */
  async validateData(onlyHeader?: boolean, verifyTxs?: boolean): Promise<void>;

  /**
   * Validates all transactions in the block
   * @returns True if all transactions are valid
   */
  transactionsAreValid(): boolean;

  /**
   * Gets detailed validation errors for transactions
   * @returns Array of validation error strings
   */
  getTransactionsValidationErrors(): string[];

  /**
   * Generates the transaction trie root for this block
   * @returns Transaction trie root hash
   */
  async genTxTrie(): Promise<Uint8Array>;

  /**
   * Validates that the transaction trie root matches the calculated value
   * @returns True if transaction trie is valid
   */
  async transactionsTrieIsValid(): Promise<boolean>;

  /**
   * Validates uncle hash against calculated value
   * @returns True if uncle hash is valid
   */
  uncleHashIsValid(): boolean;

  /**
   * Validates uncle headers
   */
  validateUncles(): void;

  /**
   * Validates withdrawals trie root (EIP-4895)
   * @returns True if withdrawals trie is valid
   */
  async withdrawalsTrieIsValid(): Promise<boolean>;

  /**
   * Validates gas limit against parent block
   * @param parentBlock - Parent block for validation
   */
  validateGasLimit(parentBlock: Block): void;

  /**
   * Validates blob transactions against parent header (EIP-4844)
   * @param parentHeader - Parent block header
   */
  validateBlobTransactions(parentHeader: BlockHeader): void;

  /**
   * Returns JSON representation of the block
   * @returns Block as JSON object
   */
  toJSON(): JSONBlock;

  /**
   * Converts block to execution payload format
   * @returns ExecutionPayload structure
   */
  toExecutionPayload(): ExecutionPayload;

  /**
   * Returns compact error string representation
   * @returns Error string
   */
  errorStr(): string;
}

Block Constructor Functions

Tree-shakeable factory methods for creating Block instances from various data sources.

/**
 * Creates a block from block data dictionary
 * @param blockData - Block data object
 * @param opts - Block options
 * @returns Block instance
 */
function createBlock(blockData?: BlockData, opts?: BlockOptions): Block;

/**
 * Creates an empty block with only header data (optimized for tree shaking)
 * @param headerData - Header data for the empty block
 * @param opts - Block options
 * @returns Block instance with no transactions or uncles
 */
function createEmptyBlock(headerData: HeaderData, opts?: BlockOptions): Block;

/**
 * Creates a block from raw bytes array
 * @param values - Block bytes array
 * @param opts - Block options
 * @returns Block instance
 */
function createBlockFromBytesArray(values: BlockBytes, opts?: BlockOptions): Block;

/**
 * Creates a block from RLP-serialized data
 * @param serialized - RLP-encoded block data
 * @param opts - Block options
 * @returns Block instance
 */
function createBlockFromRLP(serialized: Uint8Array, opts?: BlockOptions): Block;

/**
 * Creates a block from JSON-RPC response format
 * @param blockParams - JSON-RPC block object
 * @param uncles - Optional uncle headers
 * @param options - Block options
 * @returns Block instance
 */
function createBlockFromRPC(
  blockParams: JSONRPCBlock, 
  uncles?: JSONHeader[], 
  options?: BlockOptions
): Block;

/**
 * Creates a block from JSON-RPC provider by fetching block data
 * @param provider - JSON-RPC provider URL or EthersProvider instance
 * @param blockTag - Block number or tag ("latest", "pending", etc.)
 * @param opts - Block options
 * @returns Promise resolving to Block instance
 */
async function createBlockFromJSONRPCProvider(
  provider: string | EthersProvider, 
  blockTag: string | bigint, 
  opts: BlockOptions
): Promise<Block>;

/**
 * Creates a block from execution payload (Engine API)
 * @param payload - Execution payload object
 * @param opts - Block options
 * @returns Promise resolving to Block instance
 */
async function createBlockFromExecutionPayload(
  payload: ExecutionPayload, 
  opts?: BlockOptions
): Promise<Block>;

/**
 * Creates a block from beacon payload JSON format
 * @param payload - Beacon payload JSON object
 * @param opts - Block options
 * @returns Promise resolving to Block instance
 */
async function createBlockFromBeaconPayloadJSON(
  payload: BeaconPayloadJSON, 
  opts?: BlockOptions
): Promise<Block>;

/**
 * Creates a sealed Clique PoA block with signature
 * @param blockData - Block data object
 * @param cliqueSigner - Signer private key (32 bytes)
 * @param opts - Block options
 * @returns Sealed Block instance
 */
function createSealedCliqueBlock(
  blockData?: BlockData, 
  cliqueSigner: Uint8Array, 
  opts?: BlockOptions
): Block;

Usage Examples:

import { 
  createBlock, 
  createBlockFromRLP, 
  createBlockFromRPC,
  createBlockFromExecutionPayload 
} from "@ethereumjs/block";

// Create from data object
const block = createBlock({
  header: {
    number: 1n,
    gasLimit: 8000000n,
    timestamp: Math.floor(Date.now() / 1000),
  },
  transactions: [],
});

// Create from RLP data
const rlpData = new Uint8Array([/* RLP bytes */]);
const blockFromRLP = createBlockFromRLP(rlpData);

// Create from JSON-RPC response
const jsonRpcBlock = {
  number: "0x1",
  hash: "0x...",
  parentHash: "0x...",
  // ... other JSON-RPC fields
};
const blockFromRPC = createBlockFromRPC(jsonRpcBlock);

// Create from execution payload (Engine API)
const payload = {
  parentHash: "0x...",
  feeRecipient: "0x...",
  stateRoot: "0x...",
  // ... other payload fields
};
const blockFromPayload = await createBlockFromExecutionPayload(payload);

// Validate the created block
await block.validateData();
console.log("Block hash:", block.hash());
console.log("Is genesis:", block.isGenesis());
console.log("Transactions valid:", block.transactionsAreValid());

Block Validation

Comprehensive validation methods for ensuring block integrity.

/**
 * Validates the entire block
 * Checks header validity, transaction trie, uncle hash, and withdrawals trie
 */
async function validateBlockData(
  block: Block, 
  onlyHeader?: boolean, 
  verifyTxs?: boolean
): Promise<void>;

/**
 * Validates all transactions in the block
 * Returns detailed error information if any transaction is invalid
 */
function validateBlockTransactions(block: Block): {
  valid: boolean;
  errors: string[];
};

/**
 * Validates blob transactions against parent header (EIP-4844)
 * Ensures blob gas usage and pricing compliance
 */
function validateBlobTransactions(
  block: Block, 
  parentHeader: BlockHeader
): void;

Usage Examples:

import { createBlock } from "@ethereumjs/block";

const block = createBlock(blockData);

try {
  // Full validation including transaction signatures
  await block.validateData(false, true);
  console.log("Block is valid");
} catch (error) {
  console.error("Validation failed:", error.message);
}

// Check specific validation aspects
const transactionsValid = block.transactionsAreValid();
const uncleHashValid = block.uncleHashIsValid();
const txTrieValid = await block.transactionsTrieIsValid();

if (!transactionsValid) {
  const errors = block.getTransactionsValidationErrors();
  console.log("Transaction errors:", errors);
}

Block Serialization

Methods for converting blocks to various formats.

/**
 * Block serialization methods
 */
interface BlockSerialization {
  /** Returns RLP-encoded block as Uint8Array */
  serialize(): Uint8Array;
  
  /** Returns raw bytes array representation */
  raw(): BlockBytes;
  
  /** Returns JSON representation */
  toJSON(): JSONBlock;
  
  /** Converts to execution payload format (Engine API) */
  toExecutionPayload(): ExecutionPayload;
}

Usage Examples:

import { createBlock } from "@ethereumjs/block";

const block = createBlock(blockData);

// Get different serialization formats
const rlpBytes = block.serialize();
const rawBytes = block.raw();
const jsonFormat = block.toJSON();
const executionPayload = block.toExecutionPayload();

// Block hash and basic info
const blockHash = block.hash();
const isGenesis = block.isGenesis();

console.log("Block hash:", blockHash);
console.log("RLP size:", rlpBytes.length);
console.log("JSON format:", JSON.stringify(jsonFormat, null, 2));