国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

世界杯競(jìng)猜項(xiàng)目Dapp-第一章(合約開發(fā))

這篇具有很好參考價(jià)值的文章主要介紹了世界杯競(jìng)猜項(xiàng)目Dapp-第一章(合約開發(fā))。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

前言

最近卡塔爾世界杯如火如荼,讓我們一起來嘗試?yán)?solidity 語(yǔ)言做一個(gè)世界杯競(jìng)猜的 Dapp 實(shí)戰(zhàn)項(xiàng)目,本次實(shí)戰(zhàn)學(xué)習(xí)主要參考:https://github.com/dukedaily/solidity-expert,我會(huì)針對(duì)原始項(xiàng)目做更詳盡的注解,持續(xù)更新中…文章來源地址http://www.zghlxwxcb.cn/news/detail-690478.html

業(yè)務(wù)需求

  • 參賽球隊(duì)一經(jīng)設(shè)定不可改變,整個(gè)活動(dòng)結(jié)束后無法投票;
  • 全?均可參與,無權(quán)限控制;
  • 每次投票為 1 ether,且只能選擇一支球隊(duì);
  • 每個(gè)人可以投注多次;
  • 僅管理員公布最終結(jié)果,完成獎(jiǎng)金分配,開獎(jiǎng)后邏輯:
  • winner 共享整個(gè)獎(jiǎng)金池(一部分是自己的本金,一部分是利潤(rùn));
  • winner 需自行領(lǐng)取獎(jiǎng)金(因?yàn)橛惺掷m(xù)費(fèi));
  • 下一期自行開始

基礎(chǔ)合約實(shí)現(xiàn)

// SPDX-License-Identifier: GPL-3.0

pragma solidity >=0.7.0 <0.9.0;

import "hardhat/console.sol";

contract WorldCup {
    // 1. 狀態(tài)變量:管理員、所有玩家、獲獎(jiǎng)?wù)叩刂?、第幾期、參賽球?duì)
    // 2. 核心方法:下注、開獎(jiǎng)、兌現(xiàn)
    // 3. 輔助方法:獲取獎(jiǎng)金池金額、管理員地址、當(dāng)前期數(shù)、參與人數(shù)、所有玩家、參賽球隊(duì)

    // 管理員
    address public admin;
    // 第幾期
    uint8 public currRound;

    // 參賽球隊(duì)
    string[] public countries = ["GERMANY", "FRANCH", "CHINA", "BRIZAL", "KOREA"];
    // 期數(shù) => 玩家
    mapping(uint8 => mapping(address => Player)) players;
    // 期數(shù) => 投注各球隊(duì)的玩家
    mapping(uint8 => mapping(Country => address[])) public countryToPlayers;
    // 玩家對(duì)應(yīng)贏取的獎(jiǎng)金
    mapping(address => uint256) public winnerVaults;

    // 投注截止時(shí)間-使用不可變量,可通過構(gòu)造函數(shù)傳值,部署后無法改變
    uint256 public immutable deadline;
    // 所有玩家待兌現(xiàn)的獎(jiǎng)金
    uint256 public lockedAmts;

    enum Country {
        GERMANY,
        FRANCH,
        CHINA,
        BRAZIL,
        KOREA
    }

    event Play(uint8 _currRound, address _player, Country _country);
    event Finialize(uint8 _currRound, uint256 _country);
    event ClaimReward(address _claimer, uint256 _amt);

    // 驗(yàn)證管理員身份
    modifier onlyAdmin {
        require(msg.sender == admin, "not authorized!");
        _;
    }

    // 玩家投注信息
    struct Player {
        // 是否開獎(jiǎng)
        bool isSet;
        // 投注的球隊(duì)份額
        mapping(Country => uint256) counts;
    }

    constructor(uint256 _deadline) {
        admin = msg.sender;
        require(_deadline > block.timestamp, "WorldCupLottery: invalid deadline!");
        deadline = _deadline;
    }

    // 下注過程
    function play(Country _selected) payable external {
        // 參數(shù)校驗(yàn)
        require(msg.value == 1 gwei, "invalid funds provided!");

        require(block.timestamp < deadline, "it's all over!");

        // 更新 countryToPlayers
        countryToPlayers[currRound][_selected].push(msg.sender);
        // 更新 players(storage 是引用傳值,修改會(huì)同步修改原變量)
        Player storage player = players[currRound][msg.sender];
        // player.isSet = false;
        player.counts[_selected] += 1;

        emit Play(currRound, msg.sender, _selected);
    }

    // 開獎(jiǎng)過程
    function finialize(Country _country) onlyAdmin external {
        // 找到 winners
        address[] memory winners = countryToPlayers[currRound][_country];
        // 分發(fā)給所有壓中玩家的實(shí)際獎(jiǎng)金
        uint256 distributeAmt;

        // 本期總獎(jiǎng)勵(lì)金額(獎(jiǎng)池金額 - 所有玩家待兌現(xiàn)的獎(jiǎng)金)
        uint currAvalBalance = getVaultBalance() - lockedAmts;
        console.log("currAvalBalance:", currAvalBalance, "winners count:", winners.length);

        for (uint i = 0; i < winners.length; i++) {
            address currWinner = winners[i];

            // 獲取每個(gè)地址應(yīng)該得到的份額
            Player storage winner = players[currRound][currWinner];
            if (winner.isSet) {
                console.log("this winner has been set already, will be skipped!");
                continue;
            }

            winner.isSet = true;
            // 玩家購(gòu)買的份額
            uint currCounts = winner.counts[_country];

            // (本期總獎(jiǎng)勵(lì) / 總獲獎(jiǎng)人數(shù))* 當(dāng)前地址持有份額
            uint amt = (currAvalBalance / countryToPlayers[currRound][_country].length) * currCounts;
            // 玩家對(duì)應(yīng)贏取的獎(jiǎng)金
            winnerVaults[currWinner] += amt;
            distributeAmt += amt;
            // 放入待兌現(xiàn)的獎(jiǎng)金池
            lockedAmts += amt;

            console.log("winner:", currWinner, "currCounts:", currCounts);
            console.log("reward amt curr:", amt, "total:", winnerVaults[currWinner]);
        }

        // 未分完的獎(jiǎng)勵(lì)即為平臺(tái)收益
        uint giftAmt = currAvalBalance - distributeAmt;
        if (giftAmt > 0) {
            winnerVaults[admin] += giftAmt;
        }

        emit Finialize(currRound++, uint256(_country));
    }

    // 獎(jiǎng)金兌現(xiàn)
    function claimReward() external {
        uint256 rewards = winnerVaults[msg.sender];
        require(rewards > 0, "nothing to claim!");

        // 玩家領(lǐng)取完獎(jiǎng)金置為 0
        winnerVaults[msg.sender] = 0;
        // 從待兌現(xiàn)獎(jiǎng)金池中移除該玩家份額
        lockedAmts -= rewards;
        (bool succeed,) = msg.sender.call{value: rewards}("");
        require(succeed, "claim reward failed!");

        console.log("rewards:", rewards);

        emit ClaimReward(msg.sender, rewards);
    }

    // 獲取獎(jiǎng)池金額
    function getVaultBalance() public view returns(uint256 bal) {
        bal = address(this).balance;
    }

    // 獲取當(dāng)期下注當(dāng)前球隊(duì)的人數(shù)
    function getCountryPlayers(uint8 _round, Country _country) external view returns(uint256) {
        return countryToPlayers[_round][_country].length;
    }

    // 獲取當(dāng)前玩家當(dāng)期押注份額
    function getPlayerInfo(uint8 _round, address _player, Country _country) external view returns(uint256 _counts) {
        return players[_round][_player].counts[_country];
    }
}

到了這里,關(guān)于世界杯競(jìng)猜項(xiàng)目Dapp-第一章(合約開發(fā))的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • P2719 搞笑世界杯 (期望dp

    考慮一種票全部賣完,另一種有大于等于2 張的所有情況都為合理情況 dp[i][j]? 可以 等概率的轉(zhuǎn)移到 dp[i-1][j] 和 dp[j][i-1]

    2024年02月09日
    瀏覽(25)
  • 【瘋狂世界杯】css 動(dòng)畫實(shí)現(xiàn)跳動(dòng)的足球

    【瘋狂世界杯】css 動(dòng)畫實(shí)現(xiàn)跳動(dòng)的足球

    ?? 作者簡(jiǎn)介:大家好,我是阿牛,全棧領(lǐng)域優(yōu)質(zhì)創(chuàng)作者?? ?? 個(gè)人主頁(yè):館主阿牛?? ?? 支持我:點(diǎn)贊??+收藏??+留言?? ?? 系列專欄:前端實(shí)用小demo?? ??格言:迄今所有人生都大寫著失敗,但不妨礙我繼續(xù)向前!?? 2022卡塔爾世界杯正在如火如荼的進(jìn)行之中,作為

    2024年02月02日
    瀏覽(21)
  • 數(shù)據(jù)分析案例-往屆世界杯數(shù)據(jù)可視化

    數(shù)據(jù)分析案例-往屆世界杯數(shù)據(jù)可視化

    目錄 1.引言 2.項(xiàng)目簡(jiǎn)介 2.1數(shù)據(jù)集介紹 2.2技術(shù)工具 3.數(shù)據(jù)可視化 3.1往屆世界杯獲獎(jiǎng)國(guó)家TOP5 3.2往屆世界杯比賽數(shù)據(jù)情況 3.3往屆世界杯觀眾人數(shù)情況 3.4往屆世界杯主辦方情況? 3.5往屆世界杯冠軍隊(duì)情況 足球是世界上非常受歡迎的運(yùn)動(dòng)之一,在全球范圍內(nèi)吸引了眾多的參與者。

    2024年02月09日
    瀏覽(25)
  • 世界杯直播 | 抖音視頻編碼器優(yōu)化

    世界杯直播 | 抖音視頻編碼器優(yōu)化

    動(dòng)手點(diǎn)關(guān)注 干貨不迷路 對(duì)于世界杯這樣的大型體育賽事而言,視頻編碼算法既要在高速運(yùn)動(dòng)、復(fù)雜紋理的場(chǎng)景下確保直播內(nèi)容的清晰度和流暢度,保障用戶的觀賽體驗(yàn),又要兼顧碼率、延遲等對(duì)網(wǎng)絡(luò)傳輸層面尤為敏感的指標(biāo)。 另外,抖音實(shí)現(xiàn)了業(yè)界首次的世界杯比賽支持

    2023年04月09日
    瀏覽(29)
  • 世界杯直播背后的服務(wù)器(云計(jì)算體系)

    世界杯直播背后的服務(wù)器(云計(jì)算體系)

    世界杯直播過程中,各大網(wǎng)絡(luò)平臺(tái)流媒體app上最大的變化毫無疑問就是零延遲。以前球迷看球是都會(huì)發(fā)現(xiàn),網(wǎng)絡(luò)直播的球賽會(huì)比電視播出的球賽延遲40s左右。如果群里有個(gè)看電視的兄弟兄弟每個(gè)進(jìn)球他都能提前40秒預(yù)告給你,那么所有驚喜蕩然無存。 這種情況產(chǎn)生,就是因?yàn)?/p>

    2023年04月08日
    瀏覽(22)
  • NFT+體育,卡塔爾世界杯有哪些NFT看點(diǎn)!

    NFT+體育,卡塔爾世界杯有哪些NFT看點(diǎn)!

    有人說沒有冷門的世界杯不是真正的世界杯!11月22日,卡塔爾世界杯小組賽C組第1輪比賽中,沙特爆冷2:1逆轉(zhuǎn)阿根廷隊(duì),成了今年世界杯的第一個(gè)冷門。世界排名第51位的沙特隊(duì)?wèi)?zhàn)勝了排名第3的阿根廷隊(duì),結(jié)束了阿根廷隊(duì)此前的36場(chǎng)國(guó)際比賽不敗紀(jì)錄。為慶祝這一勝利,沙特

    2024年02月02日
    瀏覽(28)
  • 基于Flask+Bootstrap+機(jī)器學(xué)習(xí)的世界杯比賽預(yù)測(cè)系統(tǒng)

    基于Flask+Bootstrap+機(jī)器學(xué)習(xí)的世界杯比賽預(yù)測(cè)系統(tǒng)

    ???♂? 個(gè)人主頁(yè):@艾派森的個(gè)人主頁(yè) ???作者簡(jiǎn)介:Python學(xué)習(xí)者 ?? 希望大家多多支持,我們一起進(jìn)步!?? 如果文章對(duì)你有幫助的話, 歡迎評(píng)論 ??點(diǎn)贊???? 收藏 ??加關(guān)注+ 目錄 一、項(xiàng)目介紹 1.1項(xiàng)目簡(jiǎn)介 1.2技術(shù)工具 1.3頁(yè)面概述? 二、項(xiàng)目步驟 2.1首頁(yè)模塊 2.2查看

    2024年02月09日
    瀏覽(29)
  • 微信小程序|使用小程序制作一個(gè)世界杯球員識(shí)別工具

    微信小程序|使用小程序制作一個(gè)世界杯球員識(shí)別工具

    四年一次的世界杯正在卡塔爾進(jìn)行著,不同的社交圈也在瘋狂的刷著世界杯的動(dòng)態(tài),來自全球各地的三十二支隊(duì)伍的球員是否讓你看的眼花繚亂呢? 當(dāng)朋友跟你聊起昨晚那場(chǎng)比賽

    2024年01月16日
    瀏覽(18)
  • 一零六四、世界杯數(shù)據(jù)可視化分析(阿里云天池賽)

    一零六四、世界杯數(shù)據(jù)可視化分析(阿里云天池賽)

    目錄 賽制官方鏈接 活動(dòng)背景 活動(dòng)時(shí)間:即日起-12月31日17點(diǎn) 數(shù)據(jù)說明 世界杯成績(jī)信息表:WorldCupsSummary 世界杯比賽比分匯總表:WorldCupMatches.csv 世界杯球員信息表:WorldCupPlayers.csv ?代碼實(shí)現(xiàn) 賽制官方鏈接 世界杯數(shù)據(jù)可視化分析_學(xué)習(xí)賽_天池大賽-阿里云天池 活動(dòng)背景 2022世界

    2024年02月16日
    瀏覽(35)
  • 【 BERTopic應(yīng)用 02/3】 分析卡塔爾世界杯推特?cái)?shù)據(jù)

    【 BERTopic應(yīng)用 02/3】 分析卡塔爾世界杯推特?cái)?shù)據(jù)

    攝影:Fauzan Saari?on?Unsplash ????????這是我們對(duì)世界杯推特?cái)?shù)據(jù)分析的第3部分,我們放棄了。我們將對(duì)我們的數(shù)據(jù)進(jìn)行情緒分析,以了解人們對(duì)卡塔爾世界杯的感受。我將在這里介紹的一個(gè)功能強(qiáng)大的工具包是Hugging Face,您可以在其中找到各種模型,任務(wù),數(shù)據(jù)集,它還

    2024年02月13日
    瀏覽(65)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包