📚 Study
[실습] 베팅 DApp 개발
참고 : 누구나 쉽게 배우는 블록체인 DApp 개발(박경호 저)
1~5 숫자 버튼에 이더를 베팅하고, 이에 맞을 경우 이더를 얻거나 모두 잃는 간단한 형태 구성
개요
도구
이더리움, 솔리디티, Web3.js, VueJS(VueX), 리믹스, 메타마스크(크롬 익스텐션)
- 스마트 컨트랙트를 작성하고 이를 리믹스 툴에서 테스트 해본다
- VueJS와 VueX를 활용한 SPA 웹 애플리케이션을 구축하고
- Web3JS 라이브러리를 활용하여 메타마크스와 연동한다
- ⇒ 이더리움 테스트넷상에 배포된 스마트 컨트랙트와 연동되어 우리가 구현하고자 하는 댑의 기능을 수행
순서
- 프로젝트 구축, 스마트 컨트랙트 작성
- Web3.js API와 VueJS를 통한 프론트엔드 구성
- 최종적으로 이를 연동
환경 설정
리믹스
리믹스: 웹 기반 스마트 컨트랙트(Solidity) 툴 → 별다른 설치 불필요
메타마스크
메타마스크: 크롬 익스텐션 앱 설치 필요
(여우가 마우스 따라다닌다… 기여버)
Vue CLI
node.js, npm, vue-cli 설치 확인
리믹스 IDE
브라우저 IDE 로서 솔리디티를 실행할 수 있음
http://remix.ethereum.org
메타마스크
Metamask: 이더리움을 이용하는 댑에 크롬 브라우저로 쉽게 접근할 수 있는 익스텐션
이더리움 Web3 API 가 들어가 있으므로 모든 웹사이트의 자바스크립트 컨텍스트와 상호작용 가능
이를 통해 블록체인과 댑이 통신할 수 있음
그 외에도 유저가 아이덴티티를 생성하고 관리하는 기능을 제공 → 블록체인상에 트랜잭션을 보내거나 쓰기를 수행할 때 필요한 부분
유저들은 트랜잭션을 확인하여 이를 승인하고 거절하는 행위를 할 수 있음
메타마스크 로그인하고, Ropsten 테스트넷 으로 변경해두자
비밀번호
비밀 복구 구문
지갑 생성 완료!
이제 이더리움 메인넷 → 테스트넷으로 네트워크를 변경해준다
그런데…
Ropsten 롭스텐 테스트넷이 셧다운되어서 일단 Goerli 테스트넷으로 변경해주었다
프로젝트 생성
우리는 스마트 컨트랙트를 리믹스를 가지고 작성하고
이를 롭스텐 테스트넷에 배포할 것이다
메타마스크를 통해 이 테스트넷과 연동할 수 있으므로
프론트엔드 애플리케이션과 통신하기 위해 필요한 것은 ABI(Application Binary Interface)이다
- 머신 코드에 접근하기 위한 데이터 구조를 정의한 인터페이스
프론트엔드는 vue-cli 3.0을 사용하여 VueJs 애플리케이션으로 구성할 것이다
이는 web3을 통해 컨트랙트와 상호작용한다
git repo 생성
dapp-batting 으로 생성
git ↔ local 연결
git init git remote add origin https://github.com/yu-so-young2/dapp-betting.git
vue 프로젝트 생성
vue create bet-dapp //기본으로 설치했음 cd bet-dapp //폴더 이동 npm uninstall eslint-plugin-vue //eslint 어쩌구 에러나길래 module uninstall 해줌 npm install web3
스마트 컨트랙트 작성
시나리오
1. 유저는 1~5 사이의 숫자에 베팅할 수 있다. 2. 이 컨트랙트의 소유자는 컨트랙트의 잔액을 확인하고 가져오거나 소멸시킬 수 있다. 3. 최소 베팅액과 승률이 정의되어 있으며, 이는 고정되어 바꿀 수 없다.
작성 완
Compile
컨트랙트 테스트
Run → 다양한 설정 필드
Environment : Javascript VM
Account: 기본 이더가 들어 있는 어드레스 설정
Value: 30, 단위: ether
Deploy: 정의한 상태값 입력
어드레스 생성
트랜잭션 성공
- status: true Transaction mined and execution succeed
- 보내고 받는 어드레스
- 소비한 가스 정보
- 해시값 등의 정보 확인
- 이더 값 차감(정확히 30이 차감되지 않고 30.000001 정도인 이유: 수수료 추가 차감)
- Deploy Contracts
우리가 컨트랙트에서 정의한 함수 목록
getBalance → 전송한 이더 잔액이 반환됨
베팅
value:1, num:2 로 베팅
- _result: 베팅 성공 여부
bet num에 0 입력 시
- revert 잘 작동함
VueJS 애플리케이션 구축
router 연동
network 연동
store 연동