QABI_PRIME
Priming state transition for a QABIO-enabled UTXO. Reveals the next auth-chain preimage at a chosen depth, bumps committed_depth, and mutates the QABI_SPEND rung’s committed_root and committed_expiry to commit the UTXO into a specific upcoming batch. A participant-only operation: only the holder of the auth_seed can produce a valid preimage, so no coordinator signature is required at priming time. The new conditions tree is enforced via a covenant check against the output’s scriptPubKey.
| Field | Data Type | Size | Side | Description |
|---|---|---|---|---|
| new_committed_root | HASH256 | 32 B | Witness | Batch root the participant is committing to. Substituted for committed_root inside the QABI_SPEND rung of the output conditions tree. Typically the Merkle root of the coordinator’s upcoming QABIBlock. |
| prime_depth | NUMERIC | 1–4 B | Witness | Depth in the auth chain at which the preimage is revealed. Must strictly exceed the current committed_depth (monotonic progression) and be bounded by QABI_AUTH_CHAIN_DEFAULT_LENGTH · 10. |
| new_committed_expiry | NUMERIC | 1–4 B | Witness | Max block height at which the subsequent QABI_SPEND may fire. Substituted for committed_expiry in the output tree. |
| prime_preimage | PREIMAGE | 32 B | Witness | Preimage such that SHA256 iterated prime_depth times yields the committed auth_tip from the QABI_SPEND rung. Only the auth_seed holder can produce this. |
QABI_PRIME has no conditions-context fields. All four fields are witness-only. The evaluator reads the “current state” (auth_tip, committed_root/depth/expiry, owner_id) from the QABI_SPEND rung of the input conditions tree — there is no duplication.
F26: the conditions field count is exactly zero. Any spurious conditions field on a QABI_PRIME block is rejected at fund time by createrungtx and at consensus by the wire-format deserialiser, closing a low-bandwidth attacker-data-embedding channel.
prime_depth ≤ 0, new_committed_expiry < 0, new_committed_expiry > 0xFFFFFFFF (the WriteNumericField path silently truncates higher bits), or prime_depth ≥ QABI_AUTH_CHAIN_DEFAULT_LENGTH · 10 → ERRORctx.input_conditions, ctx.spending_output, and (mainline path) ctx.verified_leaves — missing → ERROR (the verified_leaves array is the source of truth for committed leaves; absence forces fail-closed). For unit tests without an MLSC proof, the evaluator falls back to the single-rung input_conditions layout.mlsc_proof.rung_index and overlaying every revealed_mutation_targets entry at its declared idx. Audit 8b F1: verify each target.rung hashes (via BuildCPRung + ComputeTxMLSCLeaf) to verified_leaves.leaves[target.idx]; mismatch → UNSATISFIED (closes a fake-rung equivocation pattern).auth_tip (HASH256 idx 0) and committed_depth (NUMERIC idx 0); negative or undecodable → ERRORprime_depth > committed_depth (monotonic progression). Otherwise → UNSATISFIEDSHA256^prime_depth(prime_preimage) == auth_tip. Otherwise → UNSATISFIEDcommitted_root (HASH256 idx 1), committed_depth (NUMERIC idx 0), and committed_expiry (NUMERIC idx 1) to the witness values. Recompute the MLSC root via ComputeConditionsRootMLSC using the per-rung pubkey vector. Extract the spending output's MLSC root via GetMLSCRoot — non-MLSC output → UNSATISFIED. Roots match → SATISFIED; differ → UNSATISFIED| Condition | Result |
|---|---|
| Witness field count != 4 or wrong types/sizes | ERROR |
| prime_depth <= 0 or above safety bound | ERROR |
| No QABI_SPEND block found in input conditions | UNSATISFIED |
| Multiple QABI_SPEND blocks (ambiguous) | ERROR |
| prime_depth <= committed_depth | UNSATISFIED |
| SHA256^prime_depth(preimage) != auth_tip | UNSATISFIED |
| Output conditions_root != mutated-tree recomputed root | UNSATISFIED |
| All checks pass | SATISFIED |
Alice primes her QABIO UTXO for a 100-party batch coordinated by a FALCON-512 signer
[SIG_escape, QABI_PRIME, QABI_SPEND(auth_tip=H^50(seed), committed_root=0, depth=0, expiry=0, owner_id=SHA256(alice_pk))]R = 0xaa..aa, expiry block 1000QABI_SPEND(auth_tip, R, depth=10, expiry=1000, owner_id)signrungtx with witness {new_committed_root=R, prime_depth=10, new_committed_expiry=1000, prime_preimage=H^40(seed)}SHA256^10(H^40(seed)) == H^50(seed) == auth_tip → check 4 passesR until block 1000. The coordinator can finalise the batch via QABI_SPEND at any block ≤ 1000.