The difficulty is really a human readable expression. Under the hood, the Bitcoin protocol uses the target. The target is a custom 4-byte float value encoding an exponent and a mantissa that is to represent a number used as the upper bound for the block hash of valid blocks.
The target is updated every 2016 blocks after the last block of a difficulty period has been found. It depends on the timestamps of the first and the last block of the difficulty period and the previous target:
new_target = old_target × (t_last - t_first)/14 days
Every full node that has seen these two blocks can calculate the new target.
Miners assemble unconfirmed transactions into block templates, create coinbase transactions and fill up the remaining header fields to produce block candidates, test each block candidate by hashing its header and comparing the candidate’s hash to the target to determine whether a block has been found. The current target since height 693,504 is
0x17136aa2 which is a compact representation for
0x000000000000000000136aa20000000000000000000000000000000000000000. If I counted right, this hexadecimal number would translate to a binary number with 75 leading zeroes. At the current hashrate of about 109.7 EH/s, the network will try about 6.6×1022 block candidates until a block is found.