Skip to content

Instantly share code, notes, and snippets.

Created February 8, 2017 10:55
Show Gist options
  • Save anonymous/c752ca1ec20a32a5bb5501e52bcbf78d to your computer and use it in GitHub Desktop.
Save anonymous/c752ca1ec20a32a5bb5501e52bcbf78d to your computer and use it in GitHub Desktop.
Created using browser-solidity: Realtime Ethereum Contract Compiler and Runtime. Load this file by pasting this gists URL or ID at https://ethereum.github.io/browser-solidity/#version=soljson-v0.4.9+commit.364da425.js&optimize=undefined&gist=
// Correction du Pierre-Feuille-Ciseaux caché.
// A noter qu'il utilise uniquement des éléments vu lors de la workshop mais qu'il est possible d'avoir un code plus clair (en utilisant des modifiers par example).
pragma solidity ^0.4.9;
contract PFC{
address j1;
address j2;
enum Coup {Null, Pierre, Feuille, Ciseaux}
bytes32 c1Hash;
Coup c2;
uint256 mise;
uint256 TIMEOUT = 1 days;
uint256 lastAction;
function PFC(bytes32 _c1Hash, address _j2) payable {
mise = msg.value; // La mise correspond à la quantité d'ethers envoyés.
j1=msg.sender;
j2=_j2;
c1Hash=_c1Hash;
lastAction=now;
}
function joue(Coup _c2) payable {
if (c2!=Coup.Null) // Vérifie que j2 n'a pas déjà joué.
throw;
if (msg.value != mise) // Vérifie que la mise a bien été payée.
throw;
if (msg.sender != j2) // Vérifie que le compte appelant la fonction est bien j2.
throw;
c2=_c2;
lastAction=now;
}
function resoudre(Coup c1, uint256 nombreAleatoire) {
if (c2==Coup.Null) // j2 has not played yet.
throw;
if (msg.sender != j1) // Vérifie que le compte appelant la fonction est bien j1.
throw;
if (keccak256(c1,nombreAleatoire)!=c1Hash) // c1 ne correspond pas au commitment.
throw;
// A noter que si j1 ou j2 est un contract au fallback consommant plus que le stipend, il ne recevra pas les fonds.
// Faire un throw en cas d'echec de send risquerai d'empêcher l'autre partie d'acceder à ses gains en cas d'égalité.
if (bat(c1,c2))
j1.send(2*mise);
else if (bat(c2,c1))
j2.send(2*mise);
else {
j1.send(mise);
j2.send(mise);
}
mise=0;
}
// Permet à j2 de récuperer les fonds si j1 ne révéle pas son coup.
function j1Timeout() {
if (c2 == Coup.Null) // J2 n'a pas encore joué.
throw;
if (now < lastAction + TIMEOUT) // La period de timeout n'est pas encore passé.
throw;
j2.send(2*mise);
mise=0;
}
// Permet à j1 de récuperer les fonds si j2 ne joue jamais.
function j2Timeout() {
if (c2 != Coup.Null) // J2 a joué.
throw;
if (now < lastAction + TIMEOUT) // La period de timeout n'est pas encore passé.
throw;
j1.send(mise);
mise=0;
}
function bat(Coup c1, Coup c2) constant returns (bool) {
if (c1==Coup.Pierre) {
if (c2==Coup.Ciseaux)
return true;
else
return false;
} else if (c1==Coup.Feuille) {
if (c2==Coup.Pierre)
return true;
else
return false;
} else if (c1==Coup.Ciseaux) {
if (c2==Coup.Feuille)
return true;
else
return false;
} else
return false;
}
}
contract Hasher{
// Renvoie le hash.
// Doit uniquement être appelée en local.
function hash(uint8 c, uint256 nombreAleatoire) constant returns(bytes32) {
return keccak256(c,nombreAleatoire);
}
}
pragma solidity ^0.4.6;
contract Token {
uint public decimalPoint;
mapping (address => uint256) public balances;
function Token(uint _decimalPoint, uint supply) {
decimalPoint = _decimalPoint;
balances[msg.sender] = supply;
}
function transfer(uint value, address to){
if (balances[msg.sender]<value)
throw; // Pas assez de tokens
balances[msg.sender] -= value;
balances[to] += value;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment