The only way you're (sanely) going to get a game like this to be provably fair, is have each client have a secret -- send a hash of the secret to the server (which broadcasts to all other clients). Then when the client has seen the hash of all other clients seeds, reveals it's own seed. Then the game result is computed based on all the client seeds.
Would it be possible to do this without a server seed? (assuming we have multiple client seeds)
So a little backstory, I ran a lottery of sorts a while ago, it was basically
PVP or
peer 2 peer. 10 people would participate in a round and the prize of the pool was distributed to the top 3 players who
rolled the highest number between 1-100... We stumbled upon this very issue. The server generating the seed will always have an edge over the other clients. The way we solved this issue was by selecting a server seed which was based on future bitcoin block's hash, something basically we had no control over. So when the client bought a ticket their
client seed was stored in the
public ledger on the website and once the 10 tickets were bought, a
round hash was generated and mailed to all the participants, basically ensuring that none of the client seeds are changed afterwards. After that, the game waited for a new bitcoin block to be generated and its hash was used as a server seed to generate the
rolled numbers. That's how we made it
provable fair by simply taking away the edge from everyone.
Rolled number = Future Bitcoin Block's hash(acts as server seed) + Client seed + Random Nonce of each round.
Unfortunately, the game didn't get much traction and i had to shut it down...