Authors: Marcin Pawłowski [email protected], Mehmet Gonen [email protected]

<aside> ❗

This document will not be merged due to transition to GitHub. Specifications modified by this document are expected to be outdated here, but will modify up to date documents on GitHub.

</aside>

Reviewers

Change log

Status Description Date
Draft Draft status set 2026-02-04
Removed Poseidon2 following the Mantle spec update, which raised the recommended prefix length to 7 bytes. 2026-06-24
Raised the recommended prefix length from 7 bytes to 8 bytes for stronger grinding resistance against faster attackers. 2026-07-31
Verified Verified status set <When status was set>
YYYY-MM-DD
Merged Merged status set <When status was set>
YYYY-MM-DD

Motivation

This document proposes a modification to the [1.1.1] Block Construction, Validation and Execution. It modifies the block proposal structure and processing to significantly reduce its size. With a recommended prefix length of 8 bytes, this proposal achieves a ≈3.9× reduction in the Proposal structure size—from 33kB to 8,553 bytes.

This reduces bandwidth pressure in Blend, improving resilience under packet loss and partial connectivity, where redundancy is needed for delivery.

Proposal

The current block Proposal ([1.1.1] Block Construction, Validation and Execution) construction is:

class Proposal:                              # 33129 bytes
	  header: Header                           # 297 bytes
	  references: References                   # 32768 bytes
	  signature: Ed25519Signature              # 64 bytes

We note that most of the Proposal size is concentrated in the References structure. More precisely:

class References:                            # 32768 bytes
    mempool_transactions: list[~~zk~~hash]         # 1024 * 32 bytes

Where mempool_transactions is a list of 1024 references to transactions of a hash type; the size of the hash type is 32 bytes and is the transaction hash as defined in [1.5.0] Mantle.

We propose a mechanism for limiting the length of the References structure by using only a prefix of the hash:

def prefix(hash_input: bytes, length: int) -> bytes:
    return hash_input[:length]

Hence we can construct compressed References: