이더리움 서버에서 동작하는 컨트랙트를 제작해보자
Truffle
트러플은 이더리움 기반 디앱을 쉽게 개발할 수 있도록 도와주는 블록체인 프레임워크이다.
JavaScript기반 어플리케이션을 개발할 때 참조하게 될 사이트 목록
- http://www.trufflesuite.com
- https://web3js.readthedocs.io/en/1.0/index.html
- https://solidity.readthedocs.io/en/latest/
설치
node 버전 확인 후 트러플은 개발도구이므로 글로벌하게 설치한다. 이후 트러플도 버전 확인
1 |
|
시작
예제 폴더를 생성한 뒤 초기화를 진행해준다. truffle init
은 npm init
과 같은 역할을 한다고 보면 된다.
1 |
|
이후 생성되는 프로젝트의 형태는 다음과 같다
비교
일반적인 자바 웹 개발과 비교하면 이렇게 볼 수 있다.
환경 | 자바 웹 개발 | 이더리움 컨트랙트 개발 |
---|---|---|
언어 | Java | Solidity |
Framework | Spring MVC | Truffle(solc-js) |
server | Tomcat | Ganache |
기타 | WAS, Database | 이더리움 : 분산공유 네트워크 |
블록체인 어플리케이션이라고 해서 다른 어플리케이션과 다른점은 거의 없다.
그저 블록체인과 인터페이스가 이루어진다는 것일 뿐
Hello World!
contracts 폴더 내부에 HelloWorld.sol
파일을 생성한다.
1 |
|
solidity 컴파일러의 버전을 맞추려면 프로젝트 내부에 있는 truffle-cofnig.js
파일에서 컴파일러 부분을 수정해야 한다.
1 |
|
이후 truffle 버전 확인을 하면 설정한 값으로 변경된 것을 확인할 수 있다.
이제 생성해둔 HelloWorld.sol 코드에 다음과 같은 내용을 넣는다.
1 |
|
이후 컴파일은 truffle compile
명령어로 진행한다.
컴파일을 마치면 build 디렉터리가 생성되고 내부에는 json 파일이 존재한다.
json 파일에는 ABI와 Bytecode가 있는데 Bytecode는 블록체인 내부에 올라가고 ABI는 웹 어플리케이션에서 사용된다.
배포 (Ganache)
컴파일한 코드의 배포는 가나쉬를 이용한다.
가나쉬는 로컬 가상 이더리움이다.
로컬에서 tomcat으로 웹서버를 배포하는 것 처럼 가나쉬를 이용해 컨트렉트를 배포할 수 있다.
배포시에는 migrations 디렉터리 아래에 순번_파일이름.js
형태의 배포 스크립트 파일을 생성해야 한다.
1 |
|
이때 require 내부에는 파일 이름이 아닌 contract 이름이 들어가야 한다.
이후 어떤 서버에 배포할지 선택하여 이를 truffle-config.js
에서 설정해야한다.
1 |
|
해당 파일에 입력되는 정보는 가나슈를 실행하고 나오는 정보를 입력하면 된다.
설정을 마치면 배포 명령어인 truffle migrate --network development
를 입력하면 된다. --network
옵션은 타겟 서버를 지정하는 옵션이며 다른 설정을 하고 해당 설정 이름을 넣으면 그에 맞는 서버로 배포가 진행된다.
그러나 이부분에서 에러가 발생하는데 에러 내용은 다음과 같다.
Error: ** Deployment Failed **
“HelloWorld” – Invalid number of parameters for “undefined”. Got 0 expected 1!.
이는 HelloWorld 컨트랙트의 생성자에서 string 형태의 매개변수를 받게 되어있는데 배포 스크립트에는 그에 대한 내용이 없기 때문이다.
매개변수의 전달은 아래와 같이 하면 된다.
1 |
|
이후 truffle migrate --reset
명령으로 리셋 후 배포를 해준다.
배포된 컨트랙트 메서드 실행
truffle networks
명령어로 배포된 컨트렉트의 네트워크를 확인할 수 있다.
1 |
|
해당 네트워크와 연결하기 위해서는 truffle console --networks 네트워크이름
명령어를 사용하면 된다.
1 |
|
접속후에 컨트렉트의 인스턴스를 생성해야 한다.
생성한 인스턴스에서 메서드를 호출하면 동작이 잘 되는 것을 확인할 수 있다.
1 |
|
하지만 이렇게 메서드를 하나씩 호출하는 것은 매우 비효율적이며 이것을 해결하기 위해 단위 테스트를 진행한다.
test디렉터리 내부에 스크립트 파일을 작성한다.
1 |
|
작성을 마치면 truffle test
명령어로 단위 테스트를 진행한다.
1 |
|
만약 실패한다면 아래와 같은 결과가 나온다.
1 |
|
단위테스트를 하나 더 추가해보자.
1 |
|
테스트 결과는 다음과 같다.
1 |
|