user3576: If a share does not lead to a valid block they would not require to be sent to the server?
Or is the only purpose of the share sent to the server to show that the client did some work?

user2931: Yes, shares are there to provide to the pool operator that you are working with the pool. Because you are actually hashing data and providing valid hashes of the data the pool sent, it proves you are working with them, meaning you deserve some of the sweet BTC reward when someone finds the actual answer. 

user2306: No person decides. This block of C++ code decides:
bool CheckProofOfWork(uint256 hash, unsigned int nBits)
{
    CBigNum bnTarget;
    bnTarget.SetCompact(nBits);

    // Check range
    if (bnTarget <= 0 || bnTarget > bnProofOfWorkLimit)
        return error("CheckProofOfWork() : nBits below minimum work");

    // Check proof of work matches claimed amount
    if (hash > bnTarget.getuint256())
        return error("CheckProofOfWork() : hash doesn't match nBits");

    return true;
}

For people who can't read C++: It looks at the target hash field, then unpacks it, and compares it to the actual hash.

3576: <p>If a share does not lead to a valid block they would not require to be sent to the server?
Or is the only purpose of the share sent to the server to show that the client did some work?</p>
 2931: <p>Yes, shares are there to provide to the pool operator that you are working with the pool. Because you are actually hashing data and providing valid hashes of the data the pool sent, it proves you are working with them, meaning you deserve some of the sweet BTC reward when someone finds the actual answer. </p>
 2306: <p>No person decides. This block of C++ code decides:</p>

<pre><code>bool CheckProofOfWork(uint256 hash, unsigned int nBits)
{
    CBigNum bnTarget;
    bnTarget.SetCompact(nBits);

    // Check range
    if (bnTarget &lt;= 0 || bnTarget &gt; bnProofOfWorkLimit)
        return error("CheckProofOfWork() : nBits below minimum work");

    // Check proof of work matches claimed amount
    if (hash &gt; bnTarget.getuint256())
        return error("CheckProofOfWork() : hash doesn't match nBits");

    return true;
}
</code></pre>

<p>For people who can't read C++: It looks at the target hash field, then unpacks it, and compares it to the actual hash.</p>
