✏️ Authors: @Marcin Pawlowski @Mehmet

🚧→[📘 | ⚰️] Approvals (research):

📘→[✅ | ⚰️] Approvals (engineering):

Motivation

This document proposes a modification to the [v1.1.1] Block Construction, Validation and Execution Specification. It modifies the block proposal structure and processing to significantly reduce its size. With a recommended prefix length of 6 bytes, this proposal achieves a 5× reduction in the Proposal structure size—from 33kB to 6,505 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(Block Proposal) 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[zkhash]         # 1024 * 32 bytes

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

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:

class References:
		mempool_transactions: list[prefix(zkhash, length)] # 1024*length bytes

This enables us to limit the length of the Proposal proportionally to the length parameter of the prefix function.

The value of the length parameter must be set to a number that makes identification of transactions in the mempool easy. However, it is expected that the probability of a collision will rise with smaller length. In the event of a collision, we continue to protect the uniqueness of the selection of mempool_transactions through the block_root variable from the Header. The block_root is the root of the Merkle tree constructed from full hashes of transactions used to construct the references list. Therefore, in the event of a prefix collision the uniqueness of the selection is preserved as the full hashes must be used to reconstruct the block_root.

Analysis

Security Meaning and Risk Model