Files
zeekay 1aa4862464 One pool, and one door onto it per chain
The two chains held the same algorithm written twice: insertion order, a
forward and reverse conflict index, a byte budget, a bounded cache of
refusals, and the rule that removing a transaction also removes its rivals.
It is now in core, and it knows nothing about a chain — it can refuse four
things it can see for itself (duplicate, too large, no room, conflict) and
it cannot tell a valid transaction from an invalid one.

It reaches a transaction through three functions declared beside the
transaction rather than beside the pool: pool_id, pool_size, pool_inputs.
That is the whole seam. Each chain says those four refusals in its own
words at its own door.

THE DOOR IS THE POINT. The P-chain had TWO ways into its pool — a
submitter's, and the one that puts a rejected block's transactions back —
and only the first ran the chain's rule that nobody may submit its reward
transaction. A rule enforced at one of two doors is a rule an attacker uses
the other door for. There is now one admit(), and both call it.

The refusal cache moved to the gate on the X-Chain too, where the reasons
actually come from: the pool has four answers, and everything else a
submitter is told came from an execution the pool knows nothing about. A
side effect is a fixed bug — a transaction put back after its block was
rejected now goes through the gate, so the filter a peer samples says this
node holds it again, where before it silently did not.

208 differential vectors still agree.
2026-09-05 15:04:34 -07:00
..