I get some new site owners contact me in regards to improving their sites and making it more attractive.
This proof of not cheating that are used by sites such as:
bitcoindarts
probiwon
bitjack21
bitlotto
satoshidice
- have really impressed gamers and as a result draws gamers in (often like myself with their dreams of making a gambling system finally work).
Bitlotto and satoshidice arguably have the most impressive systems as they use a hash from the bitcoin network (txid for satoshidice and BitLotto will use the first block with a timestamp after 00:00:00).
So the general question is, how do I apply this to my game/raffle fairly and prove I am not cheating.
The basic concept is (in my crappy pseudo code):
(be prepared for multiple edits here)
$player_hash = players TX id / address / hash of block containing tx;
$player_number = sha256($player_hash, $secret);
show player his hash, tell him to keep it and demonstrate how to generate number once secret is known.
$game_hash = verifiable string from event (eg lotto numbers/ block hash after set time);
$game_result = sha256($game_hash, $secret);
reveal the secret post game so players can confirm themselves.
Using public verifiable strings (ie lotto numbers) means the players can confirm before the website updates (depending how quickly it updates of course).
You could also use a public verifiable string as the games secret (instead of supplying your own).
Using your own secret is fine if you provide the hashes, but players will trust the game more if you do not have any control over the results (gamers and their voodoo).
and tada, you have a very attractive FAIR game system.
Here is a quick example section from my perl clone of satoshidice (dont worry guys, Im not getting into the business I just like new projects and yours was inspiring).
our $number_lucky = 31456.8; # the number that their result must be lower than to win
$tx_bet_result = &get_lucky_number($main::tmptxid);
# WIN
elsif($tx_bet_result < $main::number_lucky)
{
$payout = $txbet * $reward_win;
$txprofit = $txbet - $payout;
$win = 1;
print "winning bet: $txbet, number: $tx_bet_result, paid: $payout, profit: $txprofit\n";
}
# LOSE
else
{
#$payout = $txbet * $reward_lose;
$payout = $txbet * $reward_lose;
$txprofit = $txbet - $payout;
$win = 0;
print "losing bet: $txbet, number: $tx_bet_result, paid: $payout, profit: $txprofit\n";
}
sub get_lucky_number
{
my $tx = shift;
my $hash = hmac_sha512_hex($tx, $main::secret);
#print "hash: $hash\n";
my $number = $hash;
$number =~ s/^.*(.{4})\s*$/$1/;
$number = hex($number);
print "lucky number: $number\n";
return $number;
}
Its perl, it works well enough but required more testing and simulations.
For instance, Id like to do more testing on picking a section of the hash like I do, (I take the last 4 digits and convert it to hex).