Like other filesystems, ZFS is based on block storage with index nodes (blocks and inodes in Linux/Solaris). However, ZFS generates index nodes on demand, and stores data in variably-sized blocks designed to waste as little space as possible.
Because of the dynamically-generated index nodes, ZFS also replicates index data to ditto blocks that are replicated to multiple locations on the disk/pool. All transactions are committed in groups to both save space and maximize the resilience of this block structure.
Until data is committed, it is stored in the intent log, or ZIL.