Hey all, I'm trying to write an open source C# miner, but am having some trouble with the mining logic.

As I've read, a basic miner does this:

var blockheader = DoGetWorkRPCCall();

var target = ExtractTarget(blockheader);

for(nonce = 0; nonce < 4294967295; nonce++)

{

var attempt = ModifyNonce(blockheader, nonce);

var hash = SHA256(SHA256(attempt));

if (hash <= target)

ReportSolution(attempt);

}

1) Are there really multiple solutions? Should that instead read:

if (hash <= target)

{

ReportSolution(attempt);

**break;** }

2)

**if(hash <= target)** - I can't figure out where GPU miners do this. They all seem to add some magic constant to the uper 32 bits, and then check if that == 0. Isn't that just an approximation of "< target" ? Won't that result in some incorrect solutions being reported?

3) From

http://blog.ezyang.com/2011/06/the-cryptography-of-bitcoin/:

* the computationally hard problem is essentially a watered-down version of the first-preimage attack on a hash function. Miners are given a set of solution hashes (the hash of all zeros to a target hash), and are required to find a message with particular structure (a chain of blocks plus a nonce) that hashes to one of these hashes. * Is this accurate? In the above code, does DoGetWorkRPCCall get a single solution hash? What exactly does "hash of all zeros to a target hash" mean?

4) Lastly, is there some simple (commented?

) non-optimized source code for a complete miner, that serves as a clear example of how this all should be working?