기존의 가위바위보 게임은 createRoom을 통해 방을 만들며 자신이 사용할 가위바위보 중 하나를 설정하게 되는데 Transaction의 input의 Data를 통해 이를 사전에 확인 가능했으며, 이를 통해 악용가능성이 있으므로 input의 Data를 암호화하여 사전에 확인이 어렵게 수정하였다
코드 설명
Hand : rock(0), paper(1), scissors(2)로 구분
PlayerStatus : Player의 상태를 나타내며 승리,패배,무승부,대기 상태로 구분
GameStatus : Game의 상태를 나태내며 시작전, 시작, 종료, 에러로 구분
Player : Player Sturct은 지불가능한 address와 베팅금액, 암호화된 Hand, Player상태로 구분
Game : Game Struct은 방장,도전자,총 베팅금액, Game상태로 구분
rooms : uint256타입의 방번호로 Game상태로 구성
roomLen : 방번호 이며 방이 생성될 때마다 +1씩 증가한다
isValidHand : 암호화된 Hand를 검증하기 위한 modifier
isPlayer : 함수를 실행하는 사용자가 originator 또는 taker인지 검증하기 위한 modifier
Encryption : Hand인 0,1,2 중 하나와 자신의 주소 그리고 지정된 문자열을 합해 암호화 한다
createRoom : 가위바위보 게임을 위한 방을 생성한다, 암호화된 hand를 사용해서 실행
joinRoom : 암호화된hand와 방번호를 이용해서 방에 입장
decodeHand : 암호화된 방장과 도전자의 hand를 decode하는 함수
compareHands : 암호화된 방장과 도전자의 hand를 decode하여 게임을 실행하고 그 후 각 player의 상태를 변경
payout : 실행자가 방장 또는 도전자인지 확인 후 승리자에게 베팅된 금액 지불
전체 실행 화면
회고
가위바위보 게임을 개선하면서 1차원적인 목적인 input data를 통해 볼 수 있는 방장의 설정된 가위바위보 상태를 숨기는 것은 성공하였으나 입력받은 가위바위보를 암호화하는 Encryption함수를 실행할 때 고정된 문자열을 사용한다는 것은 큰 단점이라고 생각이 된다 sender.sig와 sender.data를 이용한다던지, 다른 개선 방법에 대해 고민도 필요하고 무엇보다 공부가 더 필요하다는 것을 절실하게 느꼈다