[솔리디티 예제] 랜덤 숫자 맞추기
문제
Guess the random number! by 임지윤
문제: 참여자들은 1-10의 숫자 중 어떤 수가 랜덤 숫자가 될 지 짐작하고 고릅니다.
2명 이상의 참여자가 모이면 주인은 랜덤 숫자를 생성하고, 제일 근접하게 맞춘 참여자가 우승합니다.
- constructor:
- 이 컨트렉트는 처음 배포될 때 사용한 계좌가 주인이 되어 후에 랜덤 숫자를 생성합니다.
- 배포한 사람의 계좌 주소를 _owner에 저장해 주세요.
- betNumber():
- 1부터 10까지의 숫자를 입력받습니다. 그 이외의 값은 받지 않습니다.
- 또한 참여자 간 중복된 숫자도 받지 않습니다. (hint: 반복문과 require를 같이 써보기)
- 이 함수를 부른 사람의 주소와 입력받은 숫자를 addresses, addressToGuesses에 저장해 주세요.
- 참여자 수(participants)를 증가시킵니다.
- closest2Random():
- 현재 참여자가 2명 이상이어야 실행 가능하게 해주세요.
- 받은 문자열로 1-10까지의 랜덤 숫자를 생성해 주세요
->hint: 솔리디티에선 주어진 문자열을 암호화한 숫자를 리턴하는 내장 함수가 있습니다.
바로 keccak256()인데, 랜덤한 숫자를 생성할 때에도 사용 가능합니다.
복잡하니 이걸 그대로 쓰세요: uint(keccak256(abi.encodePacked(문자열)))
->hint2: 위에서 keccak으로 생성한 수는 캐스팅을 거쳐 uint256가 됩니다.
저희가 원하는 범위 내(1부터 10 이내의 수)의 숫자가 아니에요.
기초 연산자(+-*/%등)을 이용하여 만들어 봅시다. (hint-hint: 일의 자리 수) - randomNumber 이벤트로 생성한 랜덤 숫자를 출력하세요.
- 제일 근접하게 맞춘 참여자를 찾아주세요.
- 참여자 수를 0으로 바꿔주고 앞서 찾은 참여자의 주소를 리턴하세요!
- onlyOwner():
- 3번의 함수에 쓰일 modifier입니다.
- 생성자에서 설정한 주인만 이 함수를 실행할 수 있도록 해주세요.
- 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() {
// 주인만 함수를 사용할 수 있도록 하기
}
}
Author And Source
이 문제에 관하여([솔리디티 예제] 랜덤 숫자 맞추기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@bbangsil20/솔리디티-예제-랜덤-숫자-맞추기저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)