以太坊智慧合約-猜數字
準備
以太坊智慧合約初探,完成猜數字遊戲記錄。
開發工具:智慧合約線上編輯remix,可能需要翻牆使用。
瀏覽器錢包:matemask,需要翻牆安裝在Chrome或者Firefox瀏覽器上面。使用brave(基於Chrome)瀏覽器也可以。
測試網路:matemask-RopstenTestNet獲取測試ETH
思路
猜數字遊戲規則:限定兩個人玩,每個人從1-10中選中一個數字,然後下注一定金額的ETH。當兩個人都下注完成之後開獎。開獎結果是隨機生成一個隨機數,誰猜的數字與隨機數相同則贏得遊戲,並獲取兩個人下注的所有ETH,如果都沒猜中或者都猜中則平分所有下注的ETH。
碰到的坑:
1、remix的run標籤裡面設定Environment為injected web3,即使用matemask的測試網路。一直設定不成功,提示matemask未啟動。多重新整理幾次
2、之前執行合約的bet方法,一直提示gas 計算不出來,導致交易無法完成,因為把checkPlayerExists這個方法宣告成了private型別,改成public即就ok了。
pragma solidity ^0.4.20;
contract Casino{
address public owner;
uint8 private decimals = 18;//小數
uint256 public mininumBet = 1*10**(uint256(decimals)-3);//
uint256 public totalBet;
uint256 public numberOfBets;
uint256 constant public maxAmountOfBets=2;
uint256 public numberGenerated;
uint256 public winnerEtherAmount;
address[] public players;
struct Player{
uint256 amontBets;
uint256 numberSelected;
}
mapping(address=>Player) public playerInfo;
// gouzao
constructor()public{
owner=msg.sender;
}
function bet(uint256 numberSelected)public payable{
require(!checkPlayerExists(msg.sender));
require(numberSelected >= 1 && numberSelected <=10);
require(msg.value >= mininumBet);
require(numberOfBets<=maxAmountOfBets);
playerInfo[msg.sender].amontBets = msg.value;
playerInfo[msg.sender].numberSelected = numberSelected;
numberOfBets++;
players.push(msg.sender);
totalBet += msg.value;
if(numberOfBets>=maxAmountOfBets) generateNumberWinner();
}
function kill() public{
if(msg.sender==owner) selfdestruct(owner);
}
function checkPlayerExists(address player) public constant returns(bool){
for(uint8 i = 0 ; i < players.length ; i++ ){
if( players[i]==player ) return true;
}
return false;
}
function generateNumberWinner() private{
numberGenerated = (block.number % 10 +1);// bu an quan
distributePrizze(numberGenerated);
}
function distributePrizze(uint256 numberWinner) private{
address[maxAmountOfBets] memory winners;
bool hasWiner=false;
uint256 count = 0;
for(uint16 i = 0 ; i<players.length;++i){
address playerAddress = players[i];
if(playerInfo[i].numberSelected==numberWinner){
winners[count]=playerAddress;
count++;
}
delete playerInfo[playerAddress];
}
if(count==0){
count = maxAmountOfBets;
hasWiner = false;
}else{
hasWiner= true;
}
winnerEtherAmount = totalBet*95/100/count;
for(uint16 j = 0; j < count ; j ++){
if(hasWiner){
if(winners[j]!=address(0)) winners[j].transfer(winnerEtherAmount);
}else{
if(players[j]!=address(0)) players[j].transfer(winnerEtherAmount);
}
}
players.length = 0;
totalBet=0;
numberOfBets=0;
}
}
相關文章
- 以太坊蜜罐智慧合約分析
- 以太坊智慧合約升級策略
- 以太坊智慧合約gas如何估計?
- 以太坊智慧合約call注入攻擊
- 如何打造安全的以太坊智慧合約
- 技術工坊|深度探索以太坊智慧合約(深圳)
- 區塊鏈——以太坊、智慧合約簡介區塊鏈
- 以太坊智慧合約 Hexagon 存在溢位漏洞Go
- 以太坊智慧合約開發第二篇:理解以太坊相關概念
- 什麼是以太坊?什麼是智慧合約?
- eth以太坊智慧合約交易平臺開發
- 使用Remix編譯和部署以太坊智慧合約REM編譯
- 以太坊智慧合約開發第四篇:實現Hello World智慧合約
- 區塊鏈2.0以太坊智慧合約solidity之helloworld區塊鏈Solid
- 使用truffle部署以太坊智慧合約到區塊鏈區塊鏈
- 【精通以太坊】——第九章 智慧合約安全
- 以太坊中如何獲取另外一個智慧合約部署的合約地址?
- 以太坊智慧合約開發第七篇:智慧合約與網頁互動網頁
- olidity語言開發以太坊智慧合約中的繼承繼承
- 區塊鏈之--2小時構建以太坊智慧合約區塊鏈
- 以太坊智慧合約開發第五篇:字串拼接—Solidity字串Solid
- 以太坊常見合約型別及其用途型別
- 智慧合約開發(3)—— 以太坊虛擬機器(EVM)基礎虛擬機
- 採用以太坊智慧合約技術的報名系統原始碼原始碼
- 以太坊教程:搭建環境、編寫編譯一個智慧合約編譯
- 區塊鏈100講:淺析以太坊網路智慧合約原理區塊鏈
- 【區塊鏈】實戰·以太坊智慧合約程式設計引導區塊鏈程式設計
- 富士通推出新技術檢測以太坊智慧合約漏洞
- 以太坊智慧合約開發第六篇:truffle開發框架框架
- 如何取消以太坊智慧合約授權,防止被黑客盜取Token?黑客
- 以太坊智慧合約開發環境搭建以及第一個Dapp開發環境APP
- Polygon馬蹄鏈在以太坊上的智慧合約開發應用Go
- Conflux與以太坊合約開發工具區別UX
- 第九課 如何除錯以太坊官網的智慧合約眾籌案例除錯
- 以太坊智慧合約開發第三篇:安裝節點工具Ganache
- 以太坊開發實戰學習-合約安全(八)
- 第三課 如何實現以太坊最簡智慧合約“Hello World”的執行
- 以太坊Solidity程式語言開發框架————4、編譯合約Solid框架編譯