UpgradesSeptember 14, 2026by
EmpoorioChain Core
EmpoorioChain Core

Block Building on EmpoorioChain: The DAG Mempool

The quality of a block is decided before it is authored — in the pool that decides which transactions are ready, in what order, and which can safely run at the same time. EmpoorioChain replaced the flat transaction queue with a DAG mempool, and this post explains the decision and its limits.

The production decision

The engineering docs record it in one line: Aura/GRANDPA plus an improved DAG mempool. Full DAG-based consensus (the Bullshark family) stays an experimental track. The reasoning is worth quoting in substance: Bullshark is not just a different queue. It changes how data availability, ordering, block authoring and finality are separated. Turning it on without replacing the authorship pipeline would create the illusion of a DAG while blocks remained linear under Aura. So the safe path is: keep the consensus, improve the pool, measure under load, and only then decide whether to move authorship.

What the DAG mempool does

Code lives in runtime/src/mempool/dag.rs, advanced_mempool.rs and gossip.rs, with node-side metrics in node/src/emp_metrics.rs. Capabilities:

  • Dependencies by nonce — a sender's transactions form a chain; nonce 7 cannot run before nonce 6.
  • Dependencies by storage — read/write hints let the pool detect that two transactions from different senders touch the same state.
  • Deterministic ordering by fee priority, then nonce, then transaction id. Every node orders identically.
  • Batch builder that assembles groups of independent transactions up to gas and length limits — exactly what the parallel executor wants.
  • Duplicate rejection and cycle detection.
  • Gossip of DAG vertices and whole batches to peers.

The effect on block building: the author receives pre-partitioned batches instead of a flat list and can hand them to the parallel scheduler with less planning work. The effect on fairness: ordering is by declared priority and arrival, deterministically, not by whoever wins a network race.

Metrics

emp_txpool_pending_txs
emp_txpool_dag_width
emp_txpool_dag_depth
emp_txpool_duplicate_txs
emp_txpool_propagation_delay_ms_p95

Width is how many independent transactions are ready at once (parallelism available); depth is how long the dependency chains are (serialisation forced by senders). Duplicates measure wasted gossip. Propagation delay is the network's health. Legacy gauge names (emp_mempool_*) remain for compatibility with existing dashboards.

Tests

cargo test -p empoorio-runtime mempool::dag --lib

covers out-of-order nonces, fee prioritisation, storage conflicts and duplicates.

Criteria for going further

Before anyone proposes replacing Aura's authorship with a real DAG consensus, all of the following must exist:

  • a proposer of our own integrated with the transaction pool;
  • identical state roots against Aura/GRANDPA under the same load;
  • Zombienet runs with 4 and 10 validators under artificial latency;
  • stable Prometheus/Grafana dashboards;
  • adversarial tests — spam, duplicates, conflicts, invalid dependencies, forks;
  • a rollback plan back to Aura/GRANDPA.

None of these is optional, and the list is in the repository so that a future contributor cannot skip one by forgetting it. Block optimisation on EmpoorioChain is, for now, a better queue in front of a conservative consensus — measured, and honest about being exactly that.

Based on MEMPOOL_DAG_ORDERING.md.

Share this article