[솔리디티 예제] 랜덤 숫자 맞추기

문제

Guess the random number! by 임지윤

문제: 참여자들은 1-10의 숫자 중 어떤 수가 랜덤 숫자가 될 지 짐작하고 고릅니다.
2명 이상의 참여자가 모이면 주인은 랜덤 숫자를 생성하고, 제일 근접하게 맞춘 참여자가 우승합니다.

  1. constructor:
  • 이 컨트렉트는 처음 배포될 때 사용한 계좌가 주인이 되어 후에 랜덤 숫자를 생성합니다.
  • 배포한 사람의 계좌 주소를 _owner에 저장해 주세요.
  1. betNumber():
  • 1부터 10까지의 숫자를 입력받습니다. 그 이외의 값은 받지 않습니다.
  • 또한 참여자 간 중복된 숫자도 받지 않습니다. (hint: 반복문과 require를 같이 써보기)
  • 이 함수를 부른 사람의 주소와 입력받은 숫자를 addresses, addressToGuesses에 저장해 주세요.
  • 참여자 수(participants)를 증가시킵니다.
  1. closest2Random():
  • 현재 참여자가 2명 이상이어야 실행 가능하게 해주세요.
  • 받은 문자열로 1-10까지의 랜덤 숫자를 생성해 주세요
    ->hint: 솔리디티에선 주어진 문자열을 암호화한 숫자를 리턴하는 내장 함수가 있습니다.
    바로 keccak256()인데, 랜덤한 숫자를 생성할 때에도 사용 가능합니다.
    복잡하니 이걸 그대로 쓰세요: uint(keccak256(abi.encodePacked(문자열)))
    ->hint2: 위에서 keccak으로 생성한 수는 캐스팅을 거쳐 uint256가 됩니다.
    저희가 원하는 범위 내(1부터 10 이내의 수)의 숫자가 아니에요.
    기초 연산자(+-*/%등)을 이용하여 만들어 봅시다. (hint-hint: 일의 자리 수)
  • randomNumber 이벤트로 생성한 랜덤 숫자를 출력하세요.
  • 제일 근접하게 맞춘 참여자를 찾아주세요.
  • 참여자 수를 0으로 바꿔주고 앞서 찾은 참여자의 주소를 리턴하세요!
  1. onlyOwner():
  • 3번의 함수에 쓰일 modifier입니다.
  • 생성자에서 설정한 주인만 이 함수를 실행할 수 있도록 해주세요.
  1. TEMPLATE:
// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.7.0 < 0.9.0;

contract guessRandomNumber{

    uint public participants;	// 현재 베팅한 사람 수
    address private _owner;	// 컨트렉트 주인
    address[] addresses;	// 참여한 사람들의 주소 저장
    mapping (address => uint256) addressToGuesses;	// 참여한 사람들의 주소와 베팅한 값 연결
    event randomNumber(uint random);	// 랜덤 숫자가 생성 되면 이벤트 발생
    
    constructor() {
        // 처음 디플로이 한 사람의 주소를 주인으로 설정
    }

    function betNumber(uint256 _bet) public {
        // 베팅한 수는 1부터 10인 숫자만 가능
        // 현재 함수를 호출한 주소를 저장하고, 베팅한 값을 매핑에 저장
        // 참여자 수 증가시키기
    }

    function closest2Random(string memory _random) public  onlyOwner returns(address) {
        // 참여자가 한명보다 많아야 실행 가능
        // 받은 문자열로 1-10의 랜덤 정수 생성, 이벤트 발생시키기
        // 참여자 수를 다시 0으로 만들기
        // 랜덤 정수로 제일 근접하게 맞춘 참여자를 찾고 리턴하기
    }

    modifier onlyOwner() {
        // 주인만 함수를 사용할 수 있도록 하기
    }

}

정답 코드

// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.7.0 < 0.9.0;

contract guessRandomNumber{

    uint public participants;	// 현재 베팅한 사람 수
    address private _owner;	// 컨트렉트 주인
    address[] addresses;	// 참여한 사람들의 주소 저장
    mapping (address => uint256) addressToGuesses;	// 참여한 사람들의 주소와 베팅한 값 연결
    event randomNumber(uint random);	// 랜덤 숫자가 생성 되면 이벤트 발생
    
    constructor() {
        // 처음 디플로이 한 사람의 주소를 주인으로 설정
    }

    function betNumber(uint256 _bet) public {
        // 베팅한 수는 1부터 10인 숫자만 가능
        // 현재 함수를 호출한 주소를 저장하고, 베팅한 값을 매핑에 저장
        // 참여자 수 증가시키기
    }

    function closest2Random(string memory _random) public  onlyOwner returns(address) {
        // 참여자가 한명보다 많아야 실행 가능
        // 받은 문자열로 1-10의 랜덤 정수 생성, 이벤트 발생시키기
        // 참여자 수를 다시 0으로 만들기
        // 랜덤 정수로 제일 근접하게 맞춘 참여자를 찾고 리턴하기
    }

    modifier onlyOwner() {
        // 주인만 함수를 사용할 수 있도록 하기
    }

}

좋은 웹페이지 즐겨찾기