1.이더스캔에서 컨트랙트를 검증하고 등록을하게되면 내 스마트컨트랙트코드를 볼수있다.

2.굳이 geth를 안써도 컨트랙트를 remix를 통해 배포와 검증이 가능한데 쓰는 이유가뭔가요?

3.상태변수

변수선언하는거

값형 데이터 타입

Bool,int, uint, bytes

adress

주소(address) 객체는 0 x로 시작하고 최대 40자리의 16진수로 구성되는 문자열을 값으로 가집니다. 크기는 20바이트

address형식은 송금이 불가능

1.주소형태 2.payable 형식으로 바꿔야함

지금봐도 아무런 의미가 없는것같다

그래서 작성한 solidity 언어를 자바스크립트로 변환시켜보는 작업.. 하다가 규모가커지는걸 알고 미루기로했다.

//SPDX-License-Identifier: MIT
pragma solidity ^0.8.7;

contract RPS {
    
    
    
    constructor () payable {}
    
    /*
    event GameCreated(address originator, uint256 originator_bet);
    event GameJoined(address originator, address taker, uint256 originator_bet, uint256 taker_bet);
    event OriginatorWin(address originator, address taker, uint256 betAmount);
    event TakerWin(address originator, address taker, uint256 betAmount);
   */
   
    enum Hand {
        rock, paper, scissors
    }
    
    enum PlayerStatus{
        STATUS_WIN, STATUS_LOSE, STATUS_TIE, STATUS_PENDING
    }
    
    enum GameStatus {
        STATUS_NOT_STARTED, STATUS_STARTED, STATUS_COMPLETE, STATUS_ERROR
    }
    
    // player structure
    struct Player {
        Hand hand;
        address payable addr;
        PlayerStatus playerStatus;
        uint256 playerBetAmount;
    }
    
    struct Game {
        uint256 betAmount;
        GameStatus gameStatus;
        Player originator;
        Player taker;
    }
    
    
    mapping(uint => Game) rooms;
    uint roomLen = 0;
    
    modifier isValidHand (Hand _hand) {
        require((_hand  == Hand.rock) || (_hand  == Hand.paper) || (_hand == Hand.scissors));
        _;
    }
    
    modifier isPlayer (uint roomNum, address sender) {
        require(sender == rooms[roomNum].originator.addr || sender == rooms[roomNum].taker.addr);
        _;
    }
    
    
    function createRoom (Hand _hand) public payable isValidHand(_hand) returns (uint roomNum) {
        rooms[roomLen] = Game({
            betAmount: msg.value,
            gameStatus: GameStatus.STATUS_NOT_STARTED,
            originator: Player({
                hand: _hand,
                addr: payable(msg.sender),
                playerStatus: PlayerStatus.STATUS_PENDING,
                playerBetAmount: msg.value
            }),
            taker: Player({ // will change
                hand: Hand.rock,
                addr: payable(msg.sender),  
                playerStatus: PlayerStatus.STATUS_PENDING,
                playerBetAmount: 0
            })
        });
        roomNum = roomLen;
        roomLen = roomLen+1;
        
        
       // Emit gameCreated(msg.sender, msg.value);
    }
    
    function joinRoom(uint roomNum, Hand _hand) public payable isValidHand( _hand) {
       // Emit gameJoined(game.originator.addr, msg.sender, game.betAmount, msg.value);
        
        rooms[roomNum].taker = Player({
            hand: _hand,
            addr: payable(msg.sender),
            playerStatus: PlayerStatus.STATUS_PENDING,
            playerBetAmount: msg.value
        });
        rooms[roomNum].betAmount = rooms[roomNum].betAmount + msg.value;
        compareHands(roomNum);
    }
    
    function payout(uint roomNum) public payable isPlayer(roomNum, msg.sender) {
        if (rooms[roomNum].originator.playerStatus == PlayerStatus.STATUS_TIE && rooms[roomNum].taker.playerStatus == PlayerStatus.STATUS_TIE) {
            rooms[roomNum].originator.addr.transfer(rooms[roomNum].originator.playerBetAmount);
            rooms[roomNum].taker.addr.transfer(rooms[roomNum].taker.playerBetAmount);
        } else {
            if (rooms[roomNum].originator.playerStatus == PlayerStatus.STATUS_WIN) {
                rooms[roomNum].originator.addr.transfer(rooms[roomNum].betAmount);
            } else if (rooms[roomNum].taker.playerStatus == PlayerStatus.STATUS_WIN) {
                rooms[roomNum].taker.addr.transfer(rooms[roomNum].betAmount);
            } else {
                rooms[roomNum].originator.addr.transfer(rooms[roomNum].originator.playerBetAmount);
                rooms[roomNum].taker.addr.transfer(rooms[roomNum].taker.playerBetAmount);
            }
        }
         rooms[roomNum].gameStatus = GameStatus.STATUS_COMPLETE;
    }
    
    function compareHands(uint roomNum) private{
        uint8 originator = uint8(rooms[roomNum].originator.hand);
        uint8 taker = uint8(rooms[roomNum].taker.hand);
        
        rooms[roomNum].gameStatus = GameStatus.STATUS_STARTED;
        
        if (taker == originator){ //draw
            rooms[roomNum].originator.playerStatus = PlayerStatus.STATUS_TIE;
            rooms[roomNum].taker.playerStatus = PlayerStatus.STATUS_TIE;
            
        }
        else if ((taker +1) % 3 == originator) { // originator wins
            rooms[roomNum].originator.playerStatus = PlayerStatus.STATUS_WIN;
            rooms[roomNum].taker.playerStatus = PlayerStatus.STATUS_LOSE;
        }
        else if ((originator + 1)%3 == taker){
            rooms[roomNum].originator.playerStatus = PlayerStatus.STATUS_LOSE;
            rooms[roomNum].taker.playerStatus = PlayerStatus.STATUS_WIN;
        } else {
            rooms[roomNum].gameStatus = GameStatus.STATUS_ERROR;
        }
       
    }
}
//class를 사용해서 구조체를 만드는데
//1.plyer
//2.Game

//idnexing을 이용해서 방의 주소갓들을 게임으로불러온다.
//방 숫자 전체길이의 값을 =0으로 지정
const son = ["가위", "바위", "보"]

//이벤트리스너로 위 배열 불러오는방법
//대결이 끝나고 status값에 따라 화면에 보이는거를 만들어야함
//

class Player{//가위 바위 보가 들어가는곳
    constructor(hand){
        this.hand = hand
    }
}
class Game  {//플레이어가 뭘하는지
    contructor(player1, player2){
        this.player1 = player1;
        this.player2 = player2;
        this.playerStatus ={
            WIN: false,
            LOSE: false,
            TIE:false
        }
        this.gameStatus ={
            start: false,
            complete: false,
        }
      }

    대결(){
        if(this.player1.hand=="가위" && this.player2.hand=="보"||
            this.player1.hand=="바위" && this.player2.hand=="가위"||
            this.player1.hand=="보" && this.player2.hand=="바위"){
           this.playerStatus.WIN=true
            }
            if(this.player1.hand=this.player2.hand){
            this.playerStatus.TIE=true
            }
            else{
              this.playerStatus.LOSE=true
            }
    }
    
}
let player1 =new Player(손)
let player2 =new Player(손)
let Game = new Game(player1,player2)

Game.대결(player1,player2)