區塊鏈趣步DAPP智慧合約合約系統技術開發詳情

灰飛機JT9119發表於2023-04-26

區塊鏈趣步DAPP智慧合約


隨著區塊鏈技術的快速發展,越來越多的人開始關注使用區塊鏈技術來解決現實問題的應用。其中,基於區塊鏈技術的DAPP

(去中心化應用)受到了越來越多人的關注。本文將介紹一款基於區塊鏈技術的趣步DAPP智慧合約的設計和實現。


一、智慧合約設計


趣步DAPP智慧合約主要有以下幾個功能:


使用者可以透過合約建立一個步數目標,並設定獎勵金額和有效期限。


使用者可以參與別人建立的步數目標,參與成功後每天需要打卡彙報步數,達到目標後可以獲得獎勵。


使用者可以隨時檢視自己參與的目標、完成情況以及獎勵金額。


基於上述功能,我們設計了以下智慧合約:

scssCopy codepragma solidity ^0.8.0;
contract StepChallenge {
    struct Challenge {        address creator;
        uint goal;
        uint reward;
        uint deadline;
        uint deposit;
        bool isActive;   
             mapping(address => uint) participants;
    }    
    mapping(address => mapping(uint => uint)) public dailySteps;
        mapping(uint => Challenge) public challenges;
    uint public challengeCount;
    event ChallengeCreated(address creator, uint goal, uint reward, uint deadline, uint deposit);
    event ChallengeJoined(address participant, uint challengeId);
    event ChallengeCompleted(address participant, uint challengeId);
    function createChallenge(uint goal, uint reward, uint deadline) public payable {  
          require(msg.value == reward + 0.1 ether, "Invalid deposit amount");
        challenges[challengeCount] = Challenge({
            creator: msg.sender,
            goal: goal,
            reward: reward,
            deadline: deadline,
            deposit: msg.value,
            isActive: true
        });
        emit ChallengeCreated(msg.sender, goal, reward, deadline, msg.value);
        challengeCount++;
    }
    function joinChallenge(uint challengeId) public {
        Challenge storage challenge = challenges[challengeId];   
             require(challenge.isActive, "Challenge not active");  
                   require(msg.sender != challenge.creator, "Cannot join own challenge"); 
                          require(challenge.participants[msg.sender] == 0, "Already joined");
        challenge.participants[msg.sender] = block.timestamp;
        emit ChallengeJoined(msg.sender, challengeId);
    }
    function reportSteps(uint challengeId, uint steps) public {
        Challenge storage challenge = challenges[challengeId];   
             require(challenge.participants[msg.sender] > 0, "Not joined challenge"); 
                    require(block.timestamp < challenge.deadline, "Challenge expired");
        dailySteps[msg.sender][challengeId] += steps;
        if (dailySteps[msg.sender][challengeId] >= challenge.goal) {
            uint reward = challenge.reward;
            if (block.timestamp < challenge.deadline - 1 days) {
                reward += challenge.deposit;
            }            
            payable(msg.sender).transfer(reward);
            challenge.participants[msg.sender] = 0;
            emit ChallengeCompleted(msg.sender, challengeId);
        }
    }
    function withdrawDeposit(uint challengeId) public {
        Challenge storage challenge = challenges[challengeId]; 
               require(challenge.creator == msg.sender, "Not challenge creator");
        require


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70028070/viewspace-2949008/,如需轉載,請註明出處,否則將追究法律責任。

相關文章