프로젝트 소개
Ethereum 혹은 Quorum과 같이 스마트 컨트랙트를 제공하는 블록체인과 연동하는 프로젝트 작성을 위한 템플릿 프로젝트이다.
본 프로젝트 코드는 크게 스마트 컨트랙트 부분과 비지니스 로직을 처리하는 애플리케이션 코드들로 나뉜다. 애플리케이션은 작성된 스마트 컨트랙트를 컴파일 후에 블록체인 상에 배포하여 배포된 스마트 컨트랙트의 주소 값을 활용하여 해당 스마트 컨트랙트의 함수를 호출하여 연동하게 된다.
본 프로젝트에서는 스마트 컨트랙트의 작성, 컴파일 및 배포를 위해 truffle을 사용하였으며, 기본 설정이 되어 있다. 또한 애플리케이션 작성, 컴파일 및 번들링(bundling)을 위한 babel과 webpack의 기본 설정을 포함하고 있다.
또한 스마트 컨트랙트와 애플리케이션 코드에 대한 단위 혹은 통합 테스트 등을 위해 truffle, mocha 그리고 chai를 사용하였으며 기본적인 테스트 환경 설정이 되어 있다. 단위 테스트를 통한 코드 커버리지는 coverage 폴더 밑에 생성되는 index.html을 통해 확인 가능 하다.
사전 준비
본 프로젝트를 설정하고 실행하기 전에 필요한 모듈 혹은 사전 준비 사항들은 아래와 같다.
필요 모듈
- nodejs: 자산의 OS에 맞게 nodejs를 설치한다.
- pm2:
npm install -g pm2(* optional)
프로젝트 설정
프로젝트 코드를 원격 Git 저장소에서 받아 애플리케이션 개발과 실행에 필요한 라이브러리를 설치해야 한다.
코드 받기
원격 Git 저장소에서 본 프로젝트의 코드를 받는다. 아래의 명령어를 통해 해당 코드들을 받을 수 있다.
git clone [repo 주소]
필요 라이브러리 설치
애플리케이션 개발과 실행을 위해서 반드시 설치해야 하는 라이브러리들을 있다. 이들 라이브러리들은 package.json에 선언되어 있으며, 아래의 명령어를 통해 설치할 수 있다.
yarn
테스트
필요 라이브러리 설치과정까지 완료하였다면, 프로젝트에 기본 작성되어 있는 스마트 컨트랙트와 애플리케이션 코드들이 문제 없이 돌아 가는지 테스트를 해야 한다.
스마트 컨트랙트 테스트
프로젝트에 기본 작성되어 있는 스마트 컨트랙트는 아래와 같은 명령어를 통해 테스트를 해볼 수 있다.
js파일로 작성된 테스트 코드를 실행한다.yarn run test:contractjssol파일로 작성된 테스트 코드를 실행한다.yarn run test:contract
주의 위의 명령어를 통해 실행한 테스트들이 모두 성공적으로 통과되었다고 해서, 스마트 컨트랙트를 특정 network에 배포후 정상작동할 것이라는 것을 100% 보장하지는 않는다. 위의 테스트들을 스마트 컨트랙트의 단위 기능들을 기본적으로 테스트 하는 것이기 때문이다.
애플리케이션 테스트
애플리케이션을 구성하는 각 모듈의 단위 기능을 테스트 해야 하며, 모듈간 연동 혹은 연관된 모듈의 모든 기능을 거쳐가며 테스트 할 수 있는 테스트들을 다음의 명령어를 통해 실행할 수 있다.
yarn run test:app
테스트 종료 후, 테스트를 통해 검증된 모듈들의 기능들이 얼마나 테스트 되었는지는 coverage/index.html을 통해 확인할 수 있다.
배포
스마트 컨트랙트와 연동하는 애플리케이션을 배포하기 위해선, 애플리케이션과 연동하는 스마트 컨트랙트의 주소가 반드시 필요하다. 따라서 애플리케이션의 배포는 스마트 컨트랙트 배포 후, 애플리케이션의 배포 순으로 이루어져야 한다.
스마트 컨트랙트 배포
작성 및 테스트 완료된 스마트 컨트랙트는 특정 네트워크에 배포되어 스마트 컨트랙트 코드를 포함하는 account가 만들어져야 한다. 해당 account가 정상적으로 생성되면 해당 account에 대한 주소 값을 스마트 컨트랙트 생성 요청에 대한 응답 값으로 받을 수 있다. 아래의 명령을 통해 스마트 컨트랙트를 배포할 수 있다.
yarn run deploy:contract-local
위의 명령어 중 local이라는 것은 로컬 블록체인에 스마트 컨트랙트를 배포한다는 것을 의미한다. 다시말해, 로컬이 아닌 다른 네트워크에 배포해야 하는 경우에는 truffle.js 파일에 네트워크를 추가하고, 위의 예제 명령어를 참고하여 --network [network name]의 인자 포함하는 명령을 추가해야 한다.
스마트 컨트랙트의 배포가 완료되면, 완료된 스마트 컨트랙트의 주소와 abi 정보를 포함하는 파일을 [컨트랙트파일명.js]의 형태로 src/contracts/abis 폴더 밑에 생성한다. 애플리케이션 콤포넌트 혹은 모듈에서 스마트 컨트랙트의 abi를 필요로 하는 경우 해당 파일을 참조하여 사용하면 된다.
주의 단 스마트 컨트랙트의 주소 값을 받았다고 해서, 스마트 컨트랙트가 반드시 정상적으로 생성된 것은 아니다.
애플리케이션 배포
애플리케이션내의 콤포넌트 혹은 모듈들은 서로 간에 의존 관계를 가지거나 외부 모듈에 의존 관계를 가질 수 있다. 이런 의존 관계들을 직접 일일이 파악하는 것은 매우 힘든 작업으로 이를 대신해 주는 것이 webpack이다. webpack은 모듈간 의존 관계를 파악하여 하나의 애플리케이션 파일로 bundling 할 수 있는 기능을 제공하며 관련 설정은 webpack.config.js 파일에 작성되어 있다.
아래의 명령어를 통해 애플리케이션 코드를 하나의 파일로 bundling 할 수 있다.
yarn run build:app
위의 명령어를 통해 build/backend-main.js이 생성된 것을 확인할 수 있으며, LOG_LEVEL=debug VM_INDEX=1 PROCESS_INDEX=1 NODE_ENV=local node build/backend-main.js를 통해 필요한 환경 변수를 설정하고 애플리케이션을 로컬에서 실행 할 수 있다.
아래의 명령어를 통해 환경 변수 설정 및 스마트 컨트랙트 배포 그리고 애플리케이션 실행을 한번에 실행 할 수 있다.
cd shell
sh ./start-app.sh
비고
Truffle 설정에 블록체인 네트워크 추가
Truffle의 설정들은 truffle.js 파일에 명시되어 있으며, 새로운 네트워크를 추가해야 하는 경우에는 truffle.js 파일의 network에 추가하고자 하는 network의 정보를 추가하면 된다. 이때 추가하려는 네트워크의 gas, gasPrice 및 web3에 대한 provider의 종류를 파악해서 네트워크 정보를 추가해야 한다.