Skip to content

feat: add BlockInput for Gloas#8790

Draft
ensi321 wants to merge 1 commit intounstablefrom
nc/epbs-block-input
Draft

feat: add BlockInput for Gloas#8790
ensi321 wants to merge 1 commit intounstablefrom
nc/epbs-block-input

Conversation

@ensi321
Copy link
Contributor

@ensi321 ensi321 commented Jan 27, 2026

In Gloas, blocks, execution payloads, and data columns arrive separately and must be assembled correctly to verify data availability.

Key Changes

1. New BlockInputEpbs Class (~540 lines)

Added packages/beacon-node/src/chain/blocks/blockInput/blockInput.ts:

export class BlockInputEpbs extends AbstractBlockInput<ForkPostGloas, GloasDAData | null>

Features:

  • Handles 4 distinct states based on hasBlock × hasAllData combinations
  • Supports 3 creation paths: createFromBlock(), createFromPayload(), createFromColumn()
  • Core methods:
    • addPayloadEnvelope() - Add execution payload envelope
    • addColumn() - Add data column sidecars
    • markPayloadUnavailable() - Mark payload as unavailable based on PTC votes
    • getPayloadEnvelope() / getSampledColumns() / getCustodyColumns()
  • Validates block root matching across blocks, payloads, and columns
  • Extracts versioned hashes from payload envelope (not available in block)
  • Completes data promise when either:
    • Both payload envelope AND all sampled columns are received
    • Payload is marked unavailable (no data needed)

2. SeenBlockInput Cache Updates

Modified packages/beacon-node/src/chain/seenCache/seenGossipBlockInput.ts:

  • New method: getByPayloadEnvelope() - Cache and retrieve BlockInputEpbs by payload envelope
  • Refactored: getByColumn() - Now dispatches to fork-specific handlers:
    • getByColumnFulu() - Handles Fulu data columns (unchanged logic)
    • getByColumnGloas() - Handles Gloas data columns (new)
  • Updated: getByBlock() - Creates BlockInputEpbs for Gloas blocks
  • New error code: GOSSIP_PAYLOAD_ALREADY_KNOWN for duplicate payloads

3. Type System Updates

New types (packages/beacon-node/src/chain/blocks/blockInput/types.ts):

export enum DAType {
  Epbs = "epbs",  // New
}

export type GloasDAData = {
  payloadEnvelope: gloas.SignedExecutionPayloadEnvelope;
  columns: gloas.DataColumnSidecars;
};

export type ColumnConfig = {
  sampledColumns: ColumnIndex[];
  custodyColumns: ColumnIndex[];
};

export type LogMetaEpbs = LogMetaBasic & {
  hasPayload: boolean;
  payloadAvailable: boolean;
  expectedColumns: number;
  receivedColumns: number;
};

New error codes (packages/beacon-node/src/chain/blocks/blockInput/errors.ts):

  • PAYLOAD_ENVELOPE_ALREADY_SET
  • PAYLOAD_UNAVAILABLE_MARKED

4. Utility Updates

packages/beacon-node/src/util/blobs.ts:

  • Added isGloasDataColumnSidecar() type guard
  • Updated dataColumnMatrixRecovery() to support both Fulu and Gloas columns
  • Constructs appropriate column sidecar structure based on fork

packages/beacon-node/src/util/dataColumns.ts:

  • Updated recoverDataColumnSidecars() signature to accept BlockInputColumns | BlockInputEpbs

5. Integration Points

  • Gossip handlers: Updated to handle both BlockInputColumns and BlockInputEpbs
  • Column reconstruction: Supports Gloas column types
  • Validation: computeSubnetForDataColumnSidecar() works with both fork types

Testing

Added unit tests in packages/beacon-node/test/unit/chain/seenCache/seenBlockInput.test.ts:

  • Basic creation test for BlockInputEpbs via getByBlock()
  • Validates correct type guard (isBlockInputEpbs())

@gemini-code-assist
Copy link
Contributor

Summary of Changes

Hello @ensi321, I'm Gemini Code Assist1! I'm currently reviewing this pull request and will post my feedback shortly. In the meantime, here's a summary to help you and other reviewers quickly get up to speed!

This pull request introduces comprehensive support for the upcoming Gloas fork's Execution Payload-Based Sharding (ePBS) mechanism. It refactors the core logic for handling block data availability, enabling the beacon node to correctly process and verify blocks where execution payloads and data columns arrive separately. The changes ensure that the system can assemble and validate all necessary components for Gloas blocks, maintaining compatibility with the new ePBS architecture.

Highlights

  • Introduction of BlockInputEpbs: A new BlockInputEpbs class has been added to handle the assembly of blocks, execution payloads, and data columns specifically for the Gloas fork. This class manages four distinct states based on data availability and supports creation from blocks, payloads, or columns, including methods for adding data and validating block roots.
  • SeenBlockInput Cache Enhancements: The SeenBlockInput cache (seenGossipBlockInput.ts) has been updated to support Gloas. A new getByPayloadEnvelope() method is introduced, and the getByColumn() method now dispatches to fork-specific handlers (getByColumnFulu() and getByColumnGloas()). The getByBlock() method is also updated to create BlockInputEpbs for Gloas blocks, and a new error code GOSSIP_PAYLOAD_ALREADY_KNOWN is added.
  • New Types and Error Codes for Gloas: The type system has been extended with new types in types.ts to support Gloas ePBS, including DAType.Epbs, GloasDAData, ColumnConfig, and LogMetaEpbs. Additionally, errors.ts now includes PAYLOAD_ENVELOPE_ALREADY_SET and PAYLOAD_UNAVAILABLE_MARKED error codes to manage Gloas-specific data availability states.
  • Utility Function Adaptations: Utility functions in blobs.ts and dataColumns.ts have been updated for Gloas compatibility. blobs.ts gains an isGloasDataColumnSidecar() type guard and its dataColumnMatrixRecovery() function now supports both Fulu and Gloas column types. dataColumns.ts's recoverDataColumnSidecars() signature is updated to accept BlockInputColumns | BlockInputEpbs.
  • Integration with Gossip Handlers and Unit Tests: Gossip handlers are updated to correctly process both BlockInputColumns and BlockInputEpbs. Column reconstruction and validation functions, such as computeSubnetForDataColumnSidecar(), are adapted for Gloas. Unit tests have been added to verify the basic creation and type guarding of BlockInputEpbs.

🧠 New Feature in Public Preview: You can now enable Memory to help Gemini Code Assist learn from your team's feedback. This makes future code reviews more consistent and personalized to your project's style. Click here to enable Memory in your admin console.

Using Gemini Code Assist

The full guide for Gemini Code Assist can be found on our documentation page, here are some quick tips.

Invoking Gemini

You can request assistance from Gemini at any point by creating a comment using either /gemini <command> or @gemini-code-assist <command>. Below is a summary of the supported commands on the current page.

Feature Command Description
Code Review /gemini review Performs a code review for the current pull request in its current state.
Pull Request Summary /gemini summary Provides a summary of the current pull request in its current state.
Comment @gemini-code-assist Responds in comments when explicitly tagged, both in pull request comments and review comments.
Help /gemini help Displays a list of available commands.

Customization

To customize Gemini Code Assist for GitHub experience, repository maintainers can create a configuration file and/or provide a custom code review style guide (such as PEP-8 for Python) by creating and adding files to a .gemini/ folder in the base of the repository. Detailed instructions can be found here.

Limitations & Feedback

Gemini Code Assist may make mistakes. Please leave feedback on any instances where its feedback is incorrect or counter productive. You can react with 👍 and 👎 on @gemini-code-assist comments. If you're interested in giving your feedback about your experience with Gemini Code Assist for Github and other Google products, sign up here.

You can also get AI-powered code generation, chat, as well as code reviews directly in the IDE at no cost with the Gemini Code Assist IDE Extension.

Footnotes

  1. Review the Privacy Notices, Generative AI Prohibited Use Policy, Terms of Service, and learn how to configure Gemini Code Assist in GitHub here. Gemini can make mistakes, so double check it and use code with caution.

Copy link
Contributor

@gemini-code-assist gemini-code-assist bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

This pull request introduces support for the new 'Gloas' fork, specifically for Execution Payload Bid (ePBS) and its associated data columns. The changes involve adding a new BlockInputEpbs class to manage the distinct states of Gloas blocks, payloads, and data columns. The SeenBlockInput cache has been updated to handle Gloas-specific block inputs and payload envelopes, and the dataColumnMatrixRecovery utility now supports both Fulu and Gloas data column types. Overall, the implementation is well-structured and integrates smoothly with the existing data availability (DA) handling mechanisms.

Comment on lines +324 to +325
// TODO: Add metrics for payload envelope creation
// this.metrics?.seenCache.blockInput.createdByPayload.inc();
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

This TODO indicates that metrics for payload envelope creation are missing. Implementing these metrics would provide valuable insights into the system's behavior and performance, especially for new functionality like Gloas ePBS.

Comment on lines +410 to +411
// TODO GLOAS: Address all data column side car types in the codebase
sidecarsToPublish.push(columnSidecar as fulu.DataColumnSidecar);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

The TODO GLOAS comment here suggests that the handling of data column sidecar types in the sidecarsToPublish array might be incomplete for Gloas. Currently, it's explicitly cast to fulu.DataColumnSidecar. This could lead to issues if publishDataColumns expects a generic or gloas.DataColumnSidecar type, or if there are specific properties of gloas.DataColumnSidecar that need to be preserved during publishing. It's important to ensure that all data column sidecar types are correctly addressed throughout the codebase to maintain data integrity and compatibility.

Comment on lines 324 to +325
blockInput.addBlock({
block: block as SignedBeaconBlock<ForkPostFulu & ForkPreGloas>,
block: block as any,
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

Using as any and disabling the no-unsafe-assignment ESLint rule, even in a test file, can reduce type safety and make the code harder to maintain or refactor in the future. While it might be a pragmatic workaround for complex type intersections in tests, consider if there's a more type-safe way to achieve the same testing goal, perhaps by creating a mock object that strictly adheres to the expected interface or by narrowing the type more precisely.

@github-actions
Copy link
Contributor

Performance Report

✔️ no performance regression detected

Full benchmark results
Benchmark suite Current: 3da16b7 Previous: a210743 Ratio
getPubkeys - index2pubkey - req 1000 vs - 250000 vc 1.5231 ms/op 1.0625 ms/op 1.43
getPubkeys - validatorsArr - req 1000 vs - 250000 vc 44.149 us/op 36.388 us/op 1.21
BLS verify - blst 968.37 us/op 1.0021 ms/op 0.97
BLS verifyMultipleSignatures 3 - blst 1.2833 ms/op 1.3513 ms/op 0.95
BLS verifyMultipleSignatures 8 - blst 1.9583 ms/op 2.0375 ms/op 0.96
BLS verifyMultipleSignatures 32 - blst 6.0357 ms/op 4.4702 ms/op 1.35
BLS verifyMultipleSignatures 64 - blst 11.355 ms/op 8.7462 ms/op 1.30
BLS verifyMultipleSignatures 128 - blst 19.336 ms/op 17.205 ms/op 1.12
BLS deserializing 10000 signatures 723.19 ms/op 646.34 ms/op 1.12
BLS deserializing 100000 signatures 7.1132 s/op 6.4297 s/op 1.11
BLS verifyMultipleSignatures - same message - 3 - blst 1.5627 ms/op 920.14 us/op 1.70
BLS verifyMultipleSignatures - same message - 8 - blst 1.0368 ms/op 1.0403 ms/op 1.00
BLS verifyMultipleSignatures - same message - 32 - blst 1.7125 ms/op 1.7109 ms/op 1.00
BLS verifyMultipleSignatures - same message - 64 - blst 2.6093 ms/op 2.4480 ms/op 1.07
BLS verifyMultipleSignatures - same message - 128 - blst 4.3998 ms/op 4.1733 ms/op 1.05
BLS aggregatePubkeys 32 - blst 19.428 us/op 17.874 us/op 1.09
BLS aggregatePubkeys 128 - blst 69.181 us/op 63.733 us/op 1.09
getSlashingsAndExits - default max 69.060 us/op 53.841 us/op 1.28
getSlashingsAndExits - 2k 330.67 us/op 353.76 us/op 0.93
isKnown best case - 1 super set check 203.00 ns/op 409.00 ns/op 0.50
isKnown normal case - 2 super set checks 198.00 ns/op 400.00 ns/op 0.49
isKnown worse case - 16 super set checks 195.00 ns/op 391.00 ns/op 0.50
InMemoryCheckpointStateCache - add get delete 2.0750 us/op 2.0570 us/op 1.01
validate api signedAggregateAndProof - struct 1.8665 ms/op 1.8572 ms/op 1.00
validate gossip signedAggregateAndProof - struct 1.6716 ms/op 2.1560 ms/op 0.78
batch validate gossip attestation - vc 640000 - chunk 32 116.40 us/op 113.91 us/op 1.02
batch validate gossip attestation - vc 640000 - chunk 64 103.31 us/op 93.983 us/op 1.10
batch validate gossip attestation - vc 640000 - chunk 128 94.609 us/op 89.520 us/op 1.06
batch validate gossip attestation - vc 640000 - chunk 256 91.499 us/op 86.672 us/op 1.06
bytes32 toHexString 353.00 ns/op 524.00 ns/op 0.67
bytes32 Buffer.toString(hex) 267.00 ns/op 414.00 ns/op 0.64
bytes32 Buffer.toString(hex) from Uint8Array 312.00 ns/op 483.00 ns/op 0.65
bytes32 Buffer.toString(hex) + 0x 230.00 ns/op 408.00 ns/op 0.56
Return object 10000 times 0.23120 ns/op 0.23400 ns/op 0.99
Throw Error 10000 times 3.9942 us/op 3.6371 us/op 1.10
toHex 155.57 ns/op 101.27 ns/op 1.54
Buffer.from 113.06 ns/op 90.665 ns/op 1.25
shared Buffer 78.126 ns/op 60.841 ns/op 1.28
fastMsgIdFn sha256 / 200 bytes 1.8560 us/op 1.9560 us/op 0.95
fastMsgIdFn h32 xxhash / 200 bytes 259.00 ns/op 374.00 ns/op 0.69
fastMsgIdFn h64 xxhash / 200 bytes 305.00 ns/op 435.00 ns/op 0.70
fastMsgIdFn sha256 / 1000 bytes 5.9780 us/op 5.1810 us/op 1.15
fastMsgIdFn h32 xxhash / 1000 bytes 283.00 ns/op 534.00 ns/op 0.53
fastMsgIdFn h64 xxhash / 1000 bytes 334.00 ns/op 704.00 ns/op 0.47
fastMsgIdFn sha256 / 10000 bytes 53.067 us/op 52.240 us/op 1.02
fastMsgIdFn h32 xxhash / 10000 bytes 1.6670 us/op 1.5310 us/op 1.09
fastMsgIdFn h64 xxhash / 10000 bytes 942.00 ns/op 1.0770 us/op 0.87
send data - 1000 256B messages 13.702 ms/op 14.977 ms/op 0.91
send data - 1000 512B messages 15.833 ms/op 13.461 ms/op 1.18
send data - 1000 1024B messages 22.788 ms/op 18.290 ms/op 1.25
send data - 1000 1200B messages 27.466 ms/op 21.508 ms/op 1.28
send data - 1000 2048B messages 25.019 ms/op 21.634 ms/op 1.16
send data - 1000 4096B messages 30.085 ms/op 20.857 ms/op 1.44
send data - 1000 16384B messages 116.39 ms/op 140.96 ms/op 0.83
send data - 1000 65536B messages 300.99 ms/op 430.66 ms/op 0.70
enrSubnets - fastDeserialize 64 bits 896.00 ns/op 1.0840 us/op 0.83
enrSubnets - ssz BitVector 64 bits 379.00 ns/op 516.00 ns/op 0.73
enrSubnets - fastDeserialize 4 bits 135.00 ns/op 317.00 ns/op 0.43
enrSubnets - ssz BitVector 4 bits 354.00 ns/op 525.00 ns/op 0.67
prioritizePeers score -10:0 att 32-0.1 sync 2-0 261.37 us/op 264.53 us/op 0.99
prioritizePeers score 0:0 att 32-0.25 sync 2-0.25 334.81 us/op 238.93 us/op 1.40
prioritizePeers score 0:0 att 32-0.5 sync 2-0.5 389.54 us/op 451.33 us/op 0.86
prioritizePeers score 0:0 att 64-0.75 sync 4-0.75 706.22 us/op 844.69 us/op 0.84
prioritizePeers score 0:0 att 64-1 sync 4-1 844.65 us/op 939.23 us/op 0.90
array of 16000 items push then shift 1.6032 us/op 1.2680 us/op 1.26
LinkedList of 16000 items push then shift 7.3340 ns/op 8.9880 ns/op 0.82
array of 16000 items push then pop 78.773 ns/op 74.771 ns/op 1.05
LinkedList of 16000 items push then pop 7.1930 ns/op 7.8150 ns/op 0.92
array of 24000 items push then shift 2.3816 us/op 1.9870 us/op 1.20
LinkedList of 24000 items push then shift 7.4940 ns/op 7.8020 ns/op 0.96
array of 24000 items push then pop 105.60 ns/op 101.92 ns/op 1.04
LinkedList of 24000 items push then pop 7.1770 ns/op 8.0570 ns/op 0.89
intersect bitArray bitLen 8 5.7110 ns/op 4.9750 ns/op 1.15
intersect array and set length 8 33.490 ns/op 30.799 ns/op 1.09
intersect bitArray bitLen 128 27.490 ns/op 26.469 ns/op 1.04
intersect array and set length 128 549.52 ns/op 505.54 ns/op 1.09
bitArray.getTrueBitIndexes() bitLen 128 1.0920 us/op 1.2100 us/op 0.90
bitArray.getTrueBitIndexes() bitLen 248 1.7530 us/op 2.0170 us/op 0.87
bitArray.getTrueBitIndexes() bitLen 512 3.8800 us/op 3.7540 us/op 1.03
Full columns - reconstruct all 6 blobs 281.68 us/op 258.95 us/op 1.09
Full columns - reconstruct half of the blobs out of 6 105.30 us/op 105.65 us/op 1.00
Full columns - reconstruct single blob out of 6 32.310 us/op 39.100 us/op 0.83
Half columns - reconstruct all 6 blobs 299.92 ms/op 302.92 ms/op 0.99
Half columns - reconstruct half of the blobs out of 6 179.02 ms/op 175.73 ms/op 1.02
Half columns - reconstruct single blob out of 6 73.126 ms/op 48.024 ms/op 1.52
Full columns - reconstruct all 10 blobs 850.69 us/op 342.85 us/op 2.48
Full columns - reconstruct half of the blobs out of 10 217.59 us/op 140.81 us/op 1.55
Full columns - reconstruct single blob out of 10 36.343 us/op 38.474 us/op 0.94
Half columns - reconstruct all 10 blobs 451.47 ms/op 409.04 ms/op 1.10
Half columns - reconstruct half of the blobs out of 10 229.87 ms/op 209.28 ms/op 1.10
Half columns - reconstruct single blob out of 10 50.599 ms/op 46.101 ms/op 1.10
Full columns - reconstruct all 20 blobs 809.05 us/op 1.0816 ms/op 0.75
Full columns - reconstruct half of the blobs out of 20 281.64 us/op 290.60 us/op 0.97
Full columns - reconstruct single blob out of 20 32.819 us/op 27.370 us/op 1.20
Half columns - reconstruct all 20 blobs 900.19 ms/op 809.78 ms/op 1.11
Half columns - reconstruct half of the blobs out of 20 450.77 ms/op 400.24 ms/op 1.13
Half columns - reconstruct single blob out of 20 50.662 ms/op 44.930 ms/op 1.13
Set add up to 64 items then delete first 2.0611 us/op 1.6485 us/op 1.25
OrderedSet add up to 64 items then delete first 3.1087 us/op 2.5808 us/op 1.20
Set add up to 64 items then delete last 2.4637 us/op 1.8066 us/op 1.36
OrderedSet add up to 64 items then delete last 3.5801 us/op 2.6685 us/op 1.34
Set add up to 64 items then delete middle 2.3574 us/op 1.8039 us/op 1.31
OrderedSet add up to 64 items then delete middle 5.1137 us/op 4.3010 us/op 1.19
Set add up to 128 items then delete first 4.7581 us/op 3.9877 us/op 1.19
OrderedSet add up to 128 items then delete first 6.8698 us/op 6.1563 us/op 1.12
Set add up to 128 items then delete last 4.7509 us/op 3.7299 us/op 1.27
OrderedSet add up to 128 items then delete last 9.0621 us/op 5.4829 us/op 1.65
Set add up to 128 items then delete middle 4.6006 us/op 3.6974 us/op 1.24
OrderedSet add up to 128 items then delete middle 13.403 us/op 11.274 us/op 1.19
Set add up to 256 items then delete first 9.9346 us/op 7.6810 us/op 1.29
OrderedSet add up to 256 items then delete first 14.626 us/op 11.980 us/op 1.22
Set add up to 256 items then delete last 9.5629 us/op 7.3776 us/op 1.30
OrderedSet add up to 256 items then delete last 14.482 us/op 11.326 us/op 1.28
Set add up to 256 items then delete middle 9.5222 us/op 7.2988 us/op 1.30
OrderedSet add up to 256 items then delete middle 41.219 us/op 35.474 us/op 1.16
pass gossip attestations to forkchoice per slot 3.0152 ms/op 2.1440 ms/op 1.41
forkChoice updateHead vc 100000 bc 64 eq 0 497.58 us/op 475.98 us/op 1.05
forkChoice updateHead vc 600000 bc 64 eq 0 2.9542 ms/op 2.7360 ms/op 1.08
forkChoice updateHead vc 1000000 bc 64 eq 0 4.8994 ms/op 4.6687 ms/op 1.05
forkChoice updateHead vc 600000 bc 320 eq 0 2.9744 ms/op 2.7659 ms/op 1.08
forkChoice updateHead vc 600000 bc 1200 eq 0 2.9658 ms/op 2.9430 ms/op 1.01
forkChoice updateHead vc 600000 bc 7200 eq 0 3.2949 ms/op 2.9792 ms/op 1.11
forkChoice updateHead vc 600000 bc 64 eq 1000 3.3889 ms/op 3.4555 ms/op 0.98
forkChoice updateHead vc 600000 bc 64 eq 10000 3.5327 ms/op 3.5639 ms/op 0.99
forkChoice updateHead vc 600000 bc 64 eq 300000 8.9585 ms/op 7.3647 ms/op 1.22
computeDeltas 1400000 validators 0% inactive 14.556 ms/op 13.297 ms/op 1.09
computeDeltas 1400000 validators 10% inactive 13.660 ms/op 13.436 ms/op 1.02
computeDeltas 1400000 validators 20% inactive 12.802 ms/op 12.618 ms/op 1.01
computeDeltas 1400000 validators 50% inactive 10.062 ms/op 8.7875 ms/op 1.14
computeDeltas 2100000 validators 0% inactive 21.956 ms/op 19.266 ms/op 1.14
computeDeltas 2100000 validators 10% inactive 20.596 ms/op 19.926 ms/op 1.03
computeDeltas 2100000 validators 20% inactive 19.283 ms/op 17.932 ms/op 1.08
computeDeltas 2100000 validators 50% inactive 15.128 ms/op 9.5659 ms/op 1.58
altair processAttestation - 250000 vs - 7PWei normalcase 1.8851 ms/op 1.8474 ms/op 1.02
altair processAttestation - 250000 vs - 7PWei worstcase 2.8673 ms/op 2.5159 ms/op 1.14
altair processAttestation - setStatus - 1/6 committees join 114.43 us/op 83.599 us/op 1.37
altair processAttestation - setStatus - 1/3 committees join 218.92 us/op 168.16 us/op 1.30
altair processAttestation - setStatus - 1/2 committees join 305.30 us/op 237.35 us/op 1.29
altair processAttestation - setStatus - 2/3 committees join 394.28 us/op 330.19 us/op 1.19
altair processAttestation - setStatus - 4/5 committees join 544.40 us/op 486.72 us/op 1.12
altair processAttestation - setStatus - 100% committees join 655.70 us/op 552.39 us/op 1.19
altair processBlock - 250000 vs - 7PWei normalcase 3.6170 ms/op 3.9026 ms/op 0.93
altair processBlock - 250000 vs - 7PWei normalcase hashState 16.402 ms/op 15.357 ms/op 1.07
altair processBlock - 250000 vs - 7PWei worstcase 23.954 ms/op 22.749 ms/op 1.05
altair processBlock - 250000 vs - 7PWei worstcase hashState 67.959 ms/op 60.045 ms/op 1.13
phase0 processBlock - 250000 vs - 7PWei normalcase 1.8829 ms/op 1.2892 ms/op 1.46
phase0 processBlock - 250000 vs - 7PWei worstcase 20.392 ms/op 22.430 ms/op 0.91
altair processEth1Data - 250000 vs - 7PWei normalcase 354.97 us/op 278.74 us/op 1.27
getExpectedWithdrawals 250000 eb:1,eth1:1,we:0,wn:0,smpl:16 8.9860 us/op 6.5680 us/op 1.37
getExpectedWithdrawals 250000 eb:0.95,eth1:0.1,we:0.05,wn:0,smpl:220 57.346 us/op 37.202 us/op 1.54
getExpectedWithdrawals 250000 eb:0.95,eth1:0.3,we:0.05,wn:0,smpl:43 9.6960 us/op 9.6350 us/op 1.01
getExpectedWithdrawals 250000 eb:0.95,eth1:0.7,we:0.05,wn:0,smpl:19 10.361 us/op 7.0880 us/op 1.46
getExpectedWithdrawals 250000 eb:0.1,eth1:0.1,we:0,wn:0,smpl:1021 250.51 us/op 155.23 us/op 1.61
getExpectedWithdrawals 250000 eb:0.03,eth1:0.03,we:0,wn:0,smpl:11778 1.8596 ms/op 1.4219 ms/op 1.31
getExpectedWithdrawals 250000 eb:0.01,eth1:0.01,we:0,wn:0,smpl:16384 2.3181 ms/op 1.8207 ms/op 1.27
getExpectedWithdrawals 250000 eb:0,eth1:0,we:0,wn:0,smpl:16384 2.2636 ms/op 1.8165 ms/op 1.25
getExpectedWithdrawals 250000 eb:0,eth1:0,we:0,wn:0,nocache,smpl:16384 4.4478 ms/op 4.1324 ms/op 1.08
getExpectedWithdrawals 250000 eb:0,eth1:1,we:0,wn:0,smpl:16384 2.2892 ms/op 1.8441 ms/op 1.24
getExpectedWithdrawals 250000 eb:0,eth1:1,we:0,wn:0,nocache,smpl:16384 4.4377 ms/op 4.0028 ms/op 1.11
Tree 40 250000 create 350.98 ms/op 329.45 ms/op 1.07
Tree 40 250000 get(125000) 123.21 ns/op 89.386 ns/op 1.38
Tree 40 250000 set(125000) 1.1924 us/op 996.56 ns/op 1.20
Tree 40 250000 toArray() 12.389 ms/op 16.465 ms/op 0.75
Tree 40 250000 iterate all - toArray() + loop 12.479 ms/op 16.267 ms/op 0.77
Tree 40 250000 iterate all - get(i) 41.182 ms/op 40.291 ms/op 1.02
Array 250000 create 2.4220 ms/op 2.1616 ms/op 1.12
Array 250000 clone - spread 798.08 us/op 634.69 us/op 1.26
Array 250000 get(125000) 0.46500 ns/op 0.50800 ns/op 0.92
Array 250000 set(125000) 0.35100 ns/op 0.51000 ns/op 0.69
Array 250000 iterate all - loop 60.703 us/op 57.143 us/op 1.06
phase0 afterProcessEpoch - 250000 vs - 7PWei 39.171 ms/op 38.750 ms/op 1.01
Array.fill - length 1000000 2.7892 ms/op 2.1119 ms/op 1.32
Array push - length 1000000 10.609 ms/op 10.305 ms/op 1.03
Array.get 0.22005 ns/op 0.20183 ns/op 1.09
Uint8Array.get 0.22699 ns/op 0.20661 ns/op 1.10
phase0 beforeProcessEpoch - 250000 vs - 7PWei 13.498 ms/op 12.690 ms/op 1.06
altair processEpoch - mainnet_e81889 279.43 ms/op 249.73 ms/op 1.12
mainnet_e81889 - altair beforeProcessEpoch 17.012 ms/op 14.693 ms/op 1.16
mainnet_e81889 - altair processJustificationAndFinalization 5.4340 us/op 4.6030 us/op 1.18
mainnet_e81889 - altair processInactivityUpdates 3.8311 ms/op 3.8174 ms/op 1.00
mainnet_e81889 - altair processRewardsAndPenalties 23.712 ms/op 16.084 ms/op 1.47
mainnet_e81889 - altair processRegistryUpdates 637.00 ns/op 851.00 ns/op 0.75
mainnet_e81889 - altair processSlashings 211.00 ns/op 379.00 ns/op 0.56
mainnet_e81889 - altair processEth1DataReset 209.00 ns/op 372.00 ns/op 0.56
mainnet_e81889 - altair processEffectiveBalanceUpdates 1.9670 ms/op 5.3645 ms/op 0.37
mainnet_e81889 - altair processSlashingsReset 957.00 ns/op 1.0400 us/op 0.92
mainnet_e81889 - altair processRandaoMixesReset 1.0730 us/op 1.2280 us/op 0.87
mainnet_e81889 - altair processHistoricalRootsUpdate 163.00 ns/op 376.00 ns/op 0.43
mainnet_e81889 - altair processParticipationFlagUpdates 580.00 ns/op 856.00 ns/op 0.68
mainnet_e81889 - altair processSyncCommitteeUpdates 135.00 ns/op 348.00 ns/op 0.39
mainnet_e81889 - altair afterProcessEpoch 44.975 ms/op 42.850 ms/op 1.05
capella processEpoch - mainnet_e217614 856.21 ms/op 708.69 ms/op 1.21
mainnet_e217614 - capella beforeProcessEpoch 71.056 ms/op 59.350 ms/op 1.20
mainnet_e217614 - capella processJustificationAndFinalization 6.0750 us/op 4.6450 us/op 1.31
mainnet_e217614 - capella processInactivityUpdates 16.071 ms/op 11.680 ms/op 1.38
mainnet_e217614 - capella processRewardsAndPenalties 116.12 ms/op 92.373 ms/op 1.26
mainnet_e217614 - capella processRegistryUpdates 5.8500 us/op 4.8880 us/op 1.20
mainnet_e217614 - capella processSlashings 163.00 ns/op 367.00 ns/op 0.44
mainnet_e217614 - capella processEth1DataReset 203.00 ns/op 357.00 ns/op 0.57
mainnet_e217614 - capella processEffectiveBalanceUpdates 10.270 ms/op 8.3221 ms/op 1.23
mainnet_e217614 - capella processSlashingsReset 824.00 ns/op 1.0110 us/op 0.82
mainnet_e217614 - capella processRandaoMixesReset 1.2090 us/op 1.1800 us/op 1.02
mainnet_e217614 - capella processHistoricalRootsUpdate 176.00 ns/op 380.00 ns/op 0.46
mainnet_e217614 - capella processParticipationFlagUpdates 534.00 ns/op 685.00 ns/op 0.78
mainnet_e217614 - capella afterProcessEpoch 118.90 ms/op 109.69 ms/op 1.08
phase0 processEpoch - mainnet_e58758 237.45 ms/op 218.19 ms/op 1.09
mainnet_e58758 - phase0 beforeProcessEpoch 48.151 ms/op 59.759 ms/op 0.81
mainnet_e58758 - phase0 processJustificationAndFinalization 5.5190 us/op 5.4550 us/op 1.01
mainnet_e58758 - phase0 processRewardsAndPenalties 15.673 ms/op 18.164 ms/op 0.86
mainnet_e58758 - phase0 processRegistryUpdates 2.8760 us/op 2.5610 us/op 1.12
mainnet_e58758 - phase0 processSlashings 185.00 ns/op 373.00 ns/op 0.50
mainnet_e58758 - phase0 processEth1DataReset 165.00 ns/op 406.00 ns/op 0.41
mainnet_e58758 - phase0 processEffectiveBalanceUpdates 1.1210 ms/op 840.75 us/op 1.33
mainnet_e58758 - phase0 processSlashingsReset 998.00 ns/op 1.2820 us/op 0.78
mainnet_e58758 - phase0 processRandaoMixesReset 1.1130 us/op 1.3150 us/op 0.85
mainnet_e58758 - phase0 processHistoricalRootsUpdate 183.00 ns/op 484.00 ns/op 0.38
mainnet_e58758 - phase0 processParticipationRecordUpdates 879.00 ns/op 1.1790 us/op 0.75
mainnet_e58758 - phase0 afterProcessEpoch 35.908 ms/op 33.693 ms/op 1.07
phase0 processEffectiveBalanceUpdates - 250000 normalcase 1.8767 ms/op 1.3589 ms/op 1.38
phase0 processEffectiveBalanceUpdates - 250000 worstcase 0.5 2.1486 ms/op 1.7795 ms/op 1.21
altair processInactivityUpdates - 250000 normalcase 15.583 ms/op 12.770 ms/op 1.22
altair processInactivityUpdates - 250000 worstcase 14.423 ms/op 10.713 ms/op 1.35
phase0 processRegistryUpdates - 250000 normalcase 4.7450 us/op 7.8730 us/op 0.60
phase0 processRegistryUpdates - 250000 badcase_full_deposits 396.10 us/op 220.23 us/op 1.80
phase0 processRegistryUpdates - 250000 worstcase 0.5 63.808 ms/op 61.560 ms/op 1.04
altair processRewardsAndPenalties - 250000 normalcase 18.644 ms/op 15.994 ms/op 1.17
altair processRewardsAndPenalties - 250000 worstcase 17.518 ms/op 14.210 ms/op 1.23
phase0 getAttestationDeltas - 250000 normalcase 6.8962 ms/op 5.5281 ms/op 1.25
phase0 getAttestationDeltas - 250000 worstcase 6.9363 ms/op 5.5353 ms/op 1.25
phase0 processSlashings - 250000 worstcase 109.08 us/op 87.764 us/op 1.24
altair processSyncCommitteeUpdates - 250000 12.426 ms/op 12.001 ms/op 1.04
BeaconState.hashTreeRoot - No change 193.00 ns/op 411.00 ns/op 0.47
BeaconState.hashTreeRoot - 1 full validator 94.307 us/op 83.998 us/op 1.12
BeaconState.hashTreeRoot - 32 full validator 976.28 us/op 964.42 us/op 1.01
BeaconState.hashTreeRoot - 512 full validator 8.0652 ms/op 8.4169 ms/op 0.96
BeaconState.hashTreeRoot - 1 validator.effectiveBalance 90.537 us/op 100.08 us/op 0.90
BeaconState.hashTreeRoot - 32 validator.effectiveBalance 2.3621 ms/op 2.5126 ms/op 0.94
BeaconState.hashTreeRoot - 512 validator.effectiveBalance 19.537 ms/op 18.158 ms/op 1.08
BeaconState.hashTreeRoot - 1 balances 91.752 us/op 108.38 us/op 0.85
BeaconState.hashTreeRoot - 32 balances 961.77 us/op 842.80 us/op 1.14
BeaconState.hashTreeRoot - 512 balances 5.7504 ms/op 6.2087 ms/op 0.93
BeaconState.hashTreeRoot - 250000 balances 140.58 ms/op 133.89 ms/op 1.05
aggregationBits - 2048 els - zipIndexesInBitList 21.153 us/op 24.771 us/op 0.85
regular array get 100000 times 25.014 us/op 23.462 us/op 1.07
wrappedArray get 100000 times 24.941 us/op 23.128 us/op 1.08
arrayWithProxy get 100000 times 18.097 ms/op 10.332 ms/op 1.75
ssz.Root.equals 24.365 ns/op 22.498 ns/op 1.08
byteArrayEquals 23.683 ns/op 21.517 ns/op 1.10
Buffer.compare 10.180 ns/op 8.7770 ns/op 1.16
processSlot - 1 slots 10.441 us/op 10.913 us/op 0.96
processSlot - 32 slots 2.0407 ms/op 2.7330 ms/op 0.75
getEffectiveBalanceIncrementsZeroInactive - 250000 vs - 7PWei 5.4645 ms/op 4.2385 ms/op 1.29
getCommitteeAssignments - req 1 vs - 250000 vc 1.9124 ms/op 1.6445 ms/op 1.16
getCommitteeAssignments - req 100 vs - 250000 vc 3.7723 ms/op 3.3522 ms/op 1.13
getCommitteeAssignments - req 1000 vs - 250000 vc 4.0474 ms/op 3.5867 ms/op 1.13
findModifiedValidators - 10000 modified validators 600.80 ms/op 666.81 ms/op 0.90
findModifiedValidators - 1000 modified validators 494.09 ms/op 491.91 ms/op 1.00
findModifiedValidators - 100 modified validators 306.21 ms/op 262.77 ms/op 1.17
findModifiedValidators - 10 modified validators 150.92 ms/op 179.05 ms/op 0.84
findModifiedValidators - 1 modified validators 147.09 ms/op 150.59 ms/op 0.98
findModifiedValidators - no difference 188.15 ms/op 125.79 ms/op 1.50
migrate state 1500000 validators, 3400 modified, 2000 new 1.0778 s/op 949.03 ms/op 1.14
RootCache.getBlockRootAtSlot - 250000 vs - 7PWei 4.3700 ns/op 6.0700 ns/op 0.72
state getBlockRootAtSlot - 250000 vs - 7PWei 582.74 ns/op 560.65 ns/op 1.04
computeProposerIndex 100000 validators 1.6281 ms/op 1.3682 ms/op 1.19
getNextSyncCommitteeIndices 1000 validators 127.32 ms/op 99.649 ms/op 1.28
getNextSyncCommitteeIndices 10000 validators 126.50 ms/op 100.56 ms/op 1.26
getNextSyncCommitteeIndices 100000 validators 127.82 ms/op 99.487 ms/op 1.28
computeProposers - vc 250000 668.21 us/op 575.71 us/op 1.16
computeEpochShuffling - vc 250000 44.310 ms/op 39.416 ms/op 1.12
getNextSyncCommittee - vc 250000 11.124 ms/op 9.3298 ms/op 1.19
nodejs block root to RootHex using toHex 137.50 ns/op 119.74 ns/op 1.15
nodejs block root to RootHex using toRootHex 87.463 ns/op 78.694 ns/op 1.11
nodejs fromHex(blob) 518.05 us/op 180.21 us/op 2.87
nodejs fromHexInto(blob) 731.92 us/op 1.0187 ms/op 0.72
nodejs block root to RootHex using the deprecated toHexString 548.06 ns/op 184.97 ns/op 2.96
browser block root to RootHex using toHex 289.90 ns/op 144.96 ns/op 2.00
browser block root to RootHex using toRootHex 172.70 ns/op 132.50 ns/op 1.30
browser fromHex(blob) 1.2723 ms/op 968.89 us/op 1.31
browser fromHexInto(blob) 719.03 us/op 651.00 us/op 1.10
browser block root to RootHex using the deprecated toHexString 383.60 ns/op 524.37 ns/op 0.73

by benchmarkbot/action

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant