[エンティティの例]乱数フィッティング


質問する


Guess the random number! 任志允
質問:参加者は1~10のランダムな数値を推定して選択できます.
2人以上の参加者が集まると、主人はランダムな数字を生成し、最も近い参加者が勝つ.
  • constructor:
  • コントローラが最初に導入されたときに使用したアカウントが所有者となり、ランダムな数値が生成されます.
  • 配布者のアカウントアドレスをownerに保存してください.
  • betNumber():
  • 1から10の数字を受信します.他の値は受け入れられません.
  • も参加者間の重複数を受け入れない.(hint:requireと併用)
  • この関数の人のアドレスと入力した数字をアドレスとアドレスToGuessに保存してください.
  • 参加者の数を増やします.
  • closest2Random():
  • は現在、2人以上の参加者が実行する必要があります.
  • で受け取った文字列でランダムな数字を1-10に生成してください.
    ->hint:エンティティには、指定した文字列を暗号化した数値を返す内蔵関数が含まれています.
    これがkeccak 256()であり、ランダムな数字を生成するために使用できます.
    複雑すぎるから、uint(keccak 256(abi.encodePacked)と書きましょう.
    ->hint 2:keccakとして作成された数字は、鋳造後uint 256となります.
    これは私たちが望んでいる範囲内(1から10以内の数字)の数字ではありません.
    基本演算子(+-*/%など)を使用して作成します.(hint-hint:日数)
  • randomNumberイベントで生成された乱数を出力します.
  • に最も近い参加者を見つけてください.
  • の参加者数を0に変更し、以前に見つかった参加者アドレスを返してください.
  • onlyOwner():
  • 関数
  • 3に使用される修飾子.
  • ジェネレータで設定したマスターのみが関数を実行できることを確認してください.
  • 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() {
            // 주인만 함수를 사용할 수 있도록 하기
        }
    
    }