verification is polynomial, solution attempt is exponential
Wrong; a solution attempt is exactly one iteration of this loop in GenerateBlock [1]:
while (max_tries > 0 && block.nNonce < std::numeric_limits<uint32_t>::max() &&
!CheckProofOfWork(block.GetPoWHashPrecomputed(ctx), block.nBits, chainman.GetConsensus()) &&
!chainman.m_interrupt) {
++block.nNonce;
--max_tries;
}
which computes a single ten_hash, just as verification does. The only thing potentially exponential is doing it max_tries times.
[1]
https://github.com/nf-dj/robocoin/blob/main/src/rpc/mining.cpp#L146-L151