Skip to main content

PCZT (Partially Constructed Zcash Transaction)

A PCZT is a standardized format defined in ZIP 374 for building Zcash transactions incrementally across multiple parties or systems.

Why PCZT?

Traditional transaction construction requires all private keys to be available in one place. PCZT enables:
  • Hardware wallet integration — Sign on a separate device
  • Multi-signature workflows — Multiple parties contribute signatures
  • Separation of concerns — Different systems handle different roles
  • Auditability — Inspect transaction details before signing

PCZT Roles

The ZIP 374 specification defines several roles that operate on a PCZT:
In t2z, propose_transaction combines the Creator, Constructor, and IO Finalizer roles for simplicity.

Orchard

Orchard is the latest Zcash shielded protocol, activated with the NU5 network upgrade. It uses the Halo 2 proving system.

Orchard vs Sapling

Unified Addresses

Orchard receivers are embedded in Unified Addresses (UAs), which can contain multiple receiver types:
When you send to a unified address, t2z automatically selects the Orchard receiver if present.

Transparent Inputs

t2z is designed specifically for spending transparent inputs — UTXOs from P2PKH addresses (t1... or tm...).

TransparentInput Structure

Transaction ID Byte Order

Block explorers display txids in big-endian format, but Zcash internally uses little-endian. Always reverse the bytes when using txids from explorers.

Payments (ZIP 321)

Payments follow the ZIP 321 payment request format:

Memos

Memos are only supported for shielded (Orchard) outputs. They must be hex-encoded:

Fees (ZIP 317)

t2z automatically calculates fees according to ZIP 317:
Where:
  • marginal_fee = 5,000 zatoshis
  • grace_actions = 2
  • logical_actions = max(transparent_inputs, transparent_outputs) + orchard_actions

Typical Fees

Network & Expiry

Networks

t2z supports both networks:
  • mainnet — Production Zcash network
  • testnet — Test network for development

Expiry Height

Every transaction has an expiry height. If the transaction isn’t mined by that block, it becomes invalid.
In production, always fetch the current block height from a lightwalletd server or block explorer API.

Zatoshis

All amounts in t2z are in zatoshis — the smallest unit of ZEC:
Always use BigInt for amounts to avoid JavaScript floating-point precision issues.