Shielded transfers are encoded as native transactions with a special payload that targets the shielded pool contract.
Shielded transactions are represented as TypedNativeTransaction::Shielded.
TypedNativeTransaction::Shielded
The payload (data) contains the encoded shielded proof and bundle inputs.
data
The verifier enforces these constraints for shielded transactions:
The transaction must be unsigned.
The action must be Call to the shielded pool address.
Call
value must be zero (transfers happen inside the pool).
value
gas_price must be zero (the proof includes a fee field).
gas_price
The payload must not be empty.
The RPC call request builder also enforces recipient, value, and payload checks before building a shielded transaction.
Shielded transactions are unsigned. The node derives a synthetic sender address from the transaction hash (SignedTransaction::new_shielded).
SignedTransaction::new_shielded
Shielded transactions are stored in a dedicated shielded_pool map (no nonce ordering).
shielded_pool
The packer selects shielded transactions after packing normal native and EVM transactions, respecting remaining gas and block size limits.
Last updated 3 days ago
Was this helpful?