Ethereum(이더리움) 투표 Dapp 개발 Tutorial - #4.Smoke Test
본 포스팅은 dappuniversity : the-ultimate-ethereum-dapp-tutorial을 토대로 작성되었습니다.
목록
- Ethereum(이더리움) 투표 Dapp 개발 Tutorial - #1.Blockchain이란
- Ethereum(이더리움) 투표 Dapp 개발 Tutorial - #2.Smart Contract란
- Ethereum(이더리움) 투표 Dapp 개발 Tutorial - #3.개발환경 설정
- Ethereum(이더리움) 투표 Dapp 개발 Tutorial - #4.Smoke Test
- Ethereum(이더리움) 투표 Dapp 개발 Tutorial - #5.List Candidates
- Ethereum(이더리움) 투표 Dapp 개발 Tutorial - #6. Cast Votes
- Ethereum(이더리움) 투표 Dapp 개발 Tutorial - #7. Watch Events
Smoke Test까지 개발하기
Smoke Test: 구축된 테스트 환경에서 테스트가 가능한지 여부를 판단하기 위해 주요 모듈이나 시스템을 간단하게 테스트하는 것
Ganache 구동하기
이전 장에서 설치한 Ganache를 구동하면 자동으로 Mining모드로 각각 100개의 가상 이더를 가진 10개의 계정이 로컬 블록체인 네트워크에 생성된다.
Ganache는 CLI에서 설치하고 구동도 가능하지만 본 포스팅은 조금 더 직관적으로 이해하기 쉽도록 GUI버전으로 작성되었다.
이제 우리 프로젝트의 디렉토리를 먼저 생성해보자
>mkdir election
>cd election
election 디렉토리로 이동 후, 우리는 빠르게 dApp 구조를 생성하기 위해 Truffle Box라는 dApp 프로젝트 샘플 모음을 활용할 것이다. 우리는 이 Truffle Box에서 Pet Shop Box를 활용할 것이다.
>truffle unbox pet-shop
pet shop box으로 생성된 폴더 구조는 아래 그림과 같다.
- contracts 디렉토리
- 모든 스마트 계약 소스들이 들어가는 디렉토리이다. 우리는 이미 우리 프로젝트의 migrations를 담당하는 Migration이라는 계약코드를 가지게 된다.
- migrantions 디렉토리
- migration 파일들이 위치하는 디렉토리이다. 웹 개발 프레임워크에서 데이터베이스의 상태를 변경할때 migration이 필요한것과 유사하다.
- 스마트계약을 블록체인에 배포할때, 이는 블록체인 상태의 업데이트를 의미하기 때문에 migration이 필요하다.
- node_modules 디렉토리
- 해당 프로젝트에 필요한 모든 Node dependencies가 존재하는 디렉토리이다.
- src 디렉토리
- Client-side 관련 소스들이 위치하는 디렉토리이다.
- test 디렉토리
- 스마트 계약의 Test Code들이 위치하는 디렉토리이다.
- truffle.js 파일
- Truffle 프로젝트의 주요 설정내용이 담겨있는 파일이다.
자, 이제 스마트 계약을 실제로 작성해보자. 이 스마트 계약에는 우리가 개발하고자하는 dApp의 모든 비즈니스 로직이 담긴다.
이 계약은 후보자들(candidates) 리스트를 보여주고, 모든 투표와 투표자들을 추적할 수 있는 기능을 가지게 된다. 또한, 선거와 관련된 모든 룰을 규정한다.(예: 계정마다 한번의 투표만 허용 등)
프로젝트의 root 경로에서 contracts 폴더에 우리의 스마트 계약을 생성해보자.
>touch contracts/Election.sol
이제 우리 프로젝트가 제대로 작동하는지 검증할 “Smoke Test”를 작성해보자.
먼저 Election.sol 파일을 열어 아래 code를 작성한다.
pragma solidity 0.5.0;
contract Election {
// Read/write candidate
string public candidate;
// Constructor
constructor() public {
candidate = "Candidate 1";
}
}
위 코드를 해석해보자.
- 먼저 스마트 계약은 solidity version을 선언하는 pragma solidity 구문으로 시작해야 한다.
- “contract” 키워드로 계약 이름을 정의한다.
- candidate 이름을 저장할 string 변수를 정의한다. public으로 설정하게 되면 solidity가 공짜로 해당 변수 내용을 조회할 수 있는 getter 함수를 제공해준다.
- contructor 함수는 스마트 계약이 블록체인에 배포될 때 최초에 한번 실행된다. 우리가 미리 세팅하고자 하는 변수는 migration을 통해 블록체인에 저장된다.
우리는 지금까지 스마트 계약의 기초 뼈대까지 만들어보았다. 이제 이 코드가 블록체인에 배포될 수 있는지 확인해보자.
이를 위해 우리는 migrations 디렉토리에 새로운 파일을 만들어야 한다.
>touch migrations/2_deploy_contracts.js
migrations 디렉토리에 생성하는 파일들은 모두 숫자로 넘버링해야 Truffle이 순서를 인식하고 실행해주니 꼭 붙여주자.
이제 아래와 같이 우리가 작성한 계약을 배포할 migration을 생성해보자.
var Election = artifacts.require("./Election.sol");
module.exports = function(deployer) {
deployer.deploy(Election);
};
위 코드를 살펴보면,
- 먼저 우리가 작성한 계약을 요청하여 “Election”이라는 변수에 할당한다.
- 그 후, 이 변수를 배포된 계약의 manifest에 추가하여 우리가 migrations를 실행할 때 우리 계약이 배포되게끔 해준다.
이제 migration을 해보자.(Ganache를 미리 실행시켜놓자)
>cd ~/election
>truffle migrate
이제 우리가 작성한 스마트 계약은 로컬 이더리움 블록체인 환경에 성공적으로 migration되었다. 이를 테스트해보기 위해 Console을 열어서 확인해보자.
>truffle console
콘솔에 접속한 후, 우리가 배포한 스마트계약의 instance를 가져와 우리가 계약에 설정한 candidate 이름을 읽어올 수 있는지 확인해보자. Truffle 콘솔에서 아래 코드를 입력해보자.
>Election.deployed().then(function(instance) { app = instance })
위 코드에서 Election은 우리가 작성한 migration 파일의 변수명이다. deployed() 함수로 배포된 계약의 instance를 가져오고 이를 app이라는 변수에 할당해준다.
이제 우리는 candidate 변수를 아래와 같이 가져올 수 있게 된다.
>app.candidate()
'Candidate 1'
여기까지 우리는 첫번째 스마트 계약을 작성, 블록체인에 배포, 데이터의 검색까지 해보았다.
댓글남기기