以太坊 solidity 隨機抽獎合約——搏一搏,單車變摩托
最近準備做一個以太坊的抽獎遊戲,今天先把合約完成。
智慧合約只實現關鍵部分的功能,包括隨機選取中獎者,儲存每個人的中獎情況,以及開獎的時機;
現在我們一個一個模組來說一下;
第一個選擇中獎者,這個函式的基礎是生成隨機數;
function winnerNumber() private returns(uint) {
uint winner = uint(keccak256(abi.encodePacked(now, msg.sender, nonce))) % 3;
nonce++;
return winner;
}
我們使用時間、抽獎著地址、nonce值,通過encodePacked進行編碼,然後進行hash處理(keccak256);取得一個隨機數,然後對3取餘,就可以隨機選取一個獲勝者;其實目前以太坊智慧合約中很難生成無法預測的隨機數,可以使用Oracalize服務,不過是收費的。不過個人覺得資金比較小的時候,其實還是可以使用時間,blockhash等鏈上資訊生產隨機數,如果資金比較大了之後,需要注意。
第二個參加抽獎,這個函式逼近簡單,就是記錄了參加抽獎人的地址資訊;
function draw() public payable {
require(msg.value == 0.01 ether);
require(participantsCount < 3);
require(drawSituation(msg.sender) == false);
cormorants[Count] = msg.sender;
Count++;
if (Count == 3) {
produceWinner();
}
}
function drawSituation(address _cormorant) private view returns(bool) {
bool contains = false;
for(uint i = 0; i < 3; i++) {
if (cormorants[i] == _cormorant) {
contains = true;
}
}
return contains;
}
這個沒有太複雜需要解釋的,就是當有三個人蔘加抽獎之後,就開獎了;
第三個選擇中獎者,這個函式其實是第一個函式的一個封裝;
function produceWinner() private returns(address) {
require(Count == 3);
address winner = cormorants[winnerNumber()];
winner.transfer(address(this).balance);
delete cormorants;
Count = 0;
return winner;
}
選擇了中獎者之後,把獎池裡的所有獎金都傳送飛中獎者;
到這已經把抽獎的智慧合約寫完了,這裡只是簡單寫了一個模版,需要複雜功能的朋友,例如,人數,中獎時機,獎金分配方式等,可以自行進行修改除錯。
github 地址:https://github.com/XuHugo/solidityproject/tree/master/lottery
相關文章
- 隨機抽獎隨機
- JavaScript實現隨機抽獎效果JavaScript隨機
- Solidity陷阱:以太坊的隨機數生成Solid隨機
- 區塊鏈2.0以太坊智慧合約solidity之helloworld區塊鏈Solid
- Java實現隨機抽獎的方法有哪些Java隨機
- 以太坊Solidity程式語言開發框架————4、編譯合約Solid框架編譯
- 以太坊Solidity程式語言開發框架————7、合約互動Solid框架
- 以太坊Solidity程式語言開發框架————8、測試合約Solid框架
- 以太坊智慧合約開發第五篇:字串拼接—Solidity字串Solid
- 以太坊智慧合約 Solidity 的常用資料型別介紹Solid資料型別
- 隨機抽批隨機
- 苦熬自動駕駛,百度的奮力一搏自動駕駛
- solidity投票智慧合約程式碼Solid
- 以太坊蜜罐智慧合約分析
- 使用Hive隨機抽樣Hive隨機
- 智慧合約語言 Solidity 教程系列8 – Solidity APISolidAPI
- 智慧合約語言 Solidity 教程系列8 - Solidity APISolidAPI
- 以太坊智慧合約開發:讓合約接受轉賬
- 抽獎轉盤的簡單思路
- 太坊智慧合約開發第一篇:IDE對solidity語法的支援IDESolid
- 3.7 智慧合約與solidity簡介Solid
- Solidity之旅(十)OOP-抽象合約SolidOOP抽象
- 以太坊智慧合約升級策略
- 以太坊智慧合約-猜數字
- numpy2.隨機抽樣隨機
- js抽獎JS
- C#實現的簡單的隨機抽號器C#隨機
- 智慧合約語言 Solidity 教程系列7 - 以太單位及時間單位Solid
- solidity案例詳解(二)眾籌合約Solid
- 以太坊智慧合約gas如何估計?
- 以太坊智慧合約call注入攻擊
- 如何打造安全的以太坊智慧合約
- php抽獎功能PHP
- javascript實現的簡單抽獎程式碼JavaScript
- 微軟在反壟斷案中最後一搏請求美法院介入(轉)微軟
- 智慧合約開發(3)—— 以太坊虛擬機器(EVM)基礎虛擬機
- Solidity案例詳解(一)存錢罐合約Solid
- Solidity開發指南(六):合約結構解析Solid