以太坊智慧合約-猜數字
準備
以太坊智慧合約初探,完成猜數字遊戲記錄。
開發工具:智慧合約線上編輯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注入攻擊
- 如何打造安全的以太坊智慧合約
- 以太坊智慧合約開發第四篇:實現Hello World智慧合約
- 以太坊智慧合約 Hexagon 存在溢位漏洞Go
- 區塊鏈——以太坊、智慧合約簡介區塊鏈
- 以太坊中如何獲取另外一個智慧合約部署的合約地址?
- eth以太坊智慧合約交易平臺開發
- 什麼是以太坊?什麼是智慧合約?
- 使用Remix編譯和部署以太坊智慧合約REM編譯
- 以太坊智慧合約開發第七篇:智慧合約與網頁互動網頁
- 猜數字遊戲遊戲
- 【精通以太坊】——第九章 智慧合約安全
- 技術工坊|深度探索以太坊智慧合約(深圳)
- 使用truffle部署以太坊智慧合約到區塊鏈區塊鏈
- 以太坊智慧合約開發第二篇:理解以太坊相關概念
- 丨數字藏品鏈上鑄造智慧合約原始碼版數字藏品鏈上鑄造智慧合約系統開發(方案詳情)原始碼
- 區塊鏈2.0以太坊智慧合約solidity之helloworld區塊鏈Solid
- 建立基於以太坊的私有網路和智慧合約
- Shell猜數字遊戲遊戲
- 猜數字小遊戲遊戲
- 【Java】——猜數字遊戲Java遊戲
- 區塊鏈之--2小時構建以太坊智慧合約區塊鏈
- 如何通過以太坊智慧合約來進行眾籌(ICO)
- 以猜數字遊戲引出的分治演算法的理解與思考遊戲演算法
- 猜數字的介面版
- 演算法 猜數字演算法
- 【區塊鏈】實戰·以太坊智慧合約程式設計引導區塊鏈程式設計
- 以太坊智慧合約開發第六篇:truffle開發框架框架
- 智慧合約開發(3)—— 以太坊虛擬機器(EVM)基礎虛擬機
- olidity語言開發以太坊智慧合約中的繼承繼承
- 如何取消以太坊智慧合約授權,防止被黑客盜取Token?黑客
- 富士通推出新技術檢測以太坊智慧合約漏洞
- 以太坊教程:搭建環境、編寫編譯一個智慧合約編譯
- 以太坊智慧合約開發第五篇:字串拼接—Solidity字串Solid