본문 바로가기

Project

[dapp/react]해쉬 값을 이용한 카드 게임[1]

반응형

인프런 강의를 토대로 개발한 프로젝트입니다.

https://www.inflearn.com/course/ethereum-dapp

 

[무료] Ethereum 실전! 초보자를 위한 Lottery Dapp 개발 - 인프런 | 강의

환경설정부터 스마트컨트랙트 및 실제 web 제작까지 Dapp 개발 프로세스에 대한 전체적인 이해를 완벽하게 시켜드립니다., 크립토 좀비는 보라해서 봤는데... 그 다음은 어떤걸 봐야 할까요? 트러

www.inflearn.com

Stack

BackEnd - Solidity

  • Truffle Framework

 

FrontEnd - React

  • 함수형 컴포넌트로 진행 

 

UI - BootStrap

 

환경 

  • Ganache-cli 를 이용한 로컬 블록체인 환경 구현
  • Client 와 Server 연결을 위한 전자 지갑 서비스 Metamask 이용(Chrome Extension)

 


게임 소개 

게임 페이지

4개의 카드를 조합해  블락 해시의 첫 두글자를 맞추는 게임이다.

두글자중 한글자를 맞추면 DRAW > 사용자가 소모한 금액만큼 지급

두글자를 맞추면 WIN > 사용자에게 누적 금액 지급

모두 틀리면 FAIL > 금액 누적

  • 마지막으로 쌓인 블럭 4개는 아직 결과가 나오지 않은 상태이고 블락들이 쌓이면 차례대로 결과가 확인된다.
  • 실제 해시값은 랜덤해야 하지만 결과 확인을 위해 0x00으로 고정 해두었음

BackEnd 

처음 접해보는 Solidity다 보니 문법 적응이 다소 까다로웠지만, 결국 베이스는 JAVA이므로 쉽게 적응 할 수 있었다.

FrontEnd와 연동 전 이벤트 로그 확인을 위해 처음으로 단위테스트를 진행해보았다

단위테스트 중 DRAW 이벤트 확인

 


FrontEnd

강의 영상에서는 React 예제를 클래스 컴포넌트 방식으로 진행했지만, 

굳이. 굳이. 나는 함수 컴포넌트 방식으로 진행해서 하다 보니 개발 기간의 80%를 잡아먹었다.

 

FrontEnd와 BackEnd 연동을 위해 필요한 것

  • ABI( Application Binary Interface ) 
  • 컨트랙트 주소
  • Web3 라이브러리

연동을 위한 initWeb3() 작업 진행 ( ComponentDidMount )

  useEffect(()=>{
    initWeb3()
  },[])

 


실제 initWeb3() 소스 중 일부

    window.connection =  await new window.web3.eth.Contract(lotteryABI,lotteryAddress)
    // source 수정 필요(window)
    const connection = window.connection;

    setLoading(false); 
    
    let pot =  await connection.methods.getPot().call();

Contract주소와 ABI들 인스턴스화

로직상 보이는 connection.methods.getPot 메소드는 실제 Solidity 로직에 존재하는 내 로직이다.

호출이 가능한 이유는 lotteryABI에 해당 메소드들 정보가 들어있기 때문.


 

롱풀링 방식을 이용한 데이터 긁어오기

  useEffect(()=>{
    const time =  setInterval(pollData,2000)
      return ()=> clearInterval(time)  //componentWillUpdate 사이클에서 setinterval함수가 재호출되므로 전 호출 clear
  },[finalRecords]);

UseEffect

  • ComponentDidMount - 2초마다 pollData 호출
  • ComponentDidUpdate - finalRecords 값 변경시 동작
  • ComponentWillUnmount - 다시 업데이트 됐을 경우, 그 전에 존재했던 interval 클리어 필요(남아있으면 계속 호출이 쌓임)

위 예시는 클래스 컴포넌트와 비교 하였을때 드는 예시이며, 조금 차이가 있습니다.


ISSUE

  • 비동기처리에 대한 지식 부족으로 시간 소요
  • React에 대한 생명주기 미숙지로 시간 소요

 

 
 
반응형