Bitcoin pool and getwork data validity Bitcoin pools need to check data returned with getwork for validity (proper hashing result, etc.). Bitcoind that issues the initial getworks is also able to perform some data checking, but it might not be enough for pools (for example, it might not validate difficulty 1 shares used for crediting miners).

What getwork data checking is usually done on the bitcoind side, and which on the pool side? This would include:


Checking message validity
Checking if submitted work originated from the pool (whether block data was tempered with)
Checking what difficulty the work solves (for generating shares and solving blocks)
Check if work is acceptable as a block (for example, if timestamp is not too big)
The GetWork request includes only the block header, containing exactly the fields shown here and no others.  This is all the miner ever sees.  Notice that the transactions are not in the block header -- just their (Merkle) hash.  The miner doesn't actually know what transactions it is mining.

The pool checks that the block header of the submitted work exactly matches the header of some GetWork previously issued by the pool.  Some pools (Eligius) give the miner permission to alter the timestamp field only, and only according to very strict rules.

The pool always checks that the block's hash ends with 32 zeroes (note that this is "below" difficulty zero!  Every block in the chain has more than 32 trailing zeroes in its hash).

Some pools check other things (for example, that you didn't request work using one account and submit it using a different one), but the checks above are the only ones that are both mandatory and universal.