상세 컨텐츠

본문 제목

솔리디티 강좌 42강 - 3의 배수 번째 사람에게 적립된 이더 주는 스마트 컨트랙

솔리디티 깨부수기 - 기본

by D_One 2021. 10. 14. 15:57

본문

유튜브를 통해, 쉽고 간편하게 이해 해보아요!

https://youtu.be/bO0kAw-jHbg

구독/좋아요 해주셔서 감사합니다 :) !!


안녕하세요

오늘은 1 강에서 보았던 3번째 사람에게만 적립된 이더를 주는 컨트랙을 만들려고 합니다.

 

 

 

현재 5명의 사람이 있습니다.

1번 사람부터, 1 이더를 스마트 컨트랙에게 줍니다.

스마트 컨트랙은 1번사람으로 부터 1 이더를 받자미자, 이 사람이 3의 배수 번째로 이더를 준사람인지 체크합니다.

당연히 아니니까, 이 스마트 컨트랙은 1이더를 자신한테 적립을 합니다. ( 적립된 이더 : 1)

 

2번의 사람이 1 이더를  스마트 컨트랙에게 줍니다.

마찬가지로, 스마트 컨트랙은 2번의 사람이 3의 배수 번째로 이더를 준사람인지 체크를 합니다.

당연히 아니니까, 이 스마트 컨트랙은 1이더를 자신한테 적립을 합니다. ( 적립된 이더 : 2)

 

3번의 사람이 1 이더를  스마트 컨트랙에게 줍니다.

마찬가지로, 스마트 컨트랙은 3번의 사람이 3번째로 이더를 준사람인지 체크를 합니다.

당연히 맞으니까 이 스마트 컨트랙은 그동안 적립된 이더 3이더(1,2,3 번 사람에게 받은 이더)를 3의 배수 번째 사람에게 줍니다.

스마트 컨트랙의 적립은 0이 됩니다.

 

4번,5번의 역시 이와 같은 방법으로 이더를 보내고, 스마트 컨트랙은 3의 배수 번째인지 체크를 합니다.

 

 


 

 

스마트 컨트랙 만들어보기. 

 

본격적으로, 코드를 작성하기 전에 4가지의 특징이 나오는것을 알 수 있다. 

 

1. 참가자는 1 이더만 내야한다
2. 중복해서 참여 불가 (단, 누군가 적립금을 받으면 초기화) 

  이유 -> 한사람이 연속적으로 여러개 이더를 보내면, 3의 배수 번째가 될 확률이 높아서 방지 차원으로 딱 한번만 이더를 보낼수 있음 
3. 관리자만 적립된 이더 볼 수 있다.

  이유 -> 참가자들이 스마트 컨트랙에 이더가 몇개인지 안다면, 언제 3의 배수번째가 되는지 유추가능하기에 방지.
4. 3의 배수 번째 사람에게만 적립된 이더를 준다.

 

 

// SPDX-License-Identifier: GPL-3.0

pragma solidity >=0.7.0 < 0.9.0;

/*
1. 1 이더만 내야한다
2. 중복해서 참여 불가 (단, 누군가 적립금을 받으면 초기화)
3. 관리자만 적립된 이더 볼 수 있다.
4. 3의 배수 번째 사람에게만 적립된 이더를 준다.

*/
contract MoneyBox {
    event WhoPaid(address indexed sender, uint256 payment);
    address ownwer;
    
    mapping (uint256=> mapping(address => bool)) paidMemberList;
    
    uint256 round = 1;
    
    constructor(){
        ownwer = msg.sender;
    }
   
    receive() external payable {
        require(msg.value == 1 ether, "Must be 1 ether.");
        require(paidMemberList[round][msg.sender] == false, "Must be a new player in each game.");
        
        paidMemberList[round][msg.sender] = true;
        
        emit WhoPaid(msg.sender,msg.value);
        
        if(address(this).balance == 3 ether){
            (bool sent,)= payable(msg.sender).call{value:address(this).balance}("");
            require(sent,"Failed to pay");
            round++;
        }
        
        
    }

    
    function checkRound() public view returns(uint256){
        return round;
    }
    
    function checkValue() public view  returns(uint256){
        require(ownwer==msg.sender, "Only Onwer can check the value");
        return address(this).balance;
    }
    


}

코드의 자세한 설명은 영상으로 확인 부탁드립니다. 

 

관련글 더보기