이번에는 truffle에 대해서 알아 보겠습니다.
저희가 스마트 컨트랙트를 작성하고, 이후 배포하는 방법에는 다양하게 존재 할수 있지만
대표적으로는 3가지 정도가 있습니다.
Klaytn
을 활용할떄에 Klaytn
에서 버전마다 Truffle과 혼용이 안되는 경우가 있어서.. 많이 부딪쳐 가며 학습을 해야 할 필요가 있습니다.이중에서 오늘은 Truffle에 대해서 다루어 볼 것이고, 제가 직접 실무에서 작성한 코드를 통해서 어떻게 활용 하였는지 알아 볼 것 입니다.
Truffle공식 사이트를 보면 제가 앞으로 설명할 명령어 외에도 굉장히 많이 존재 하기 때문에 추가적인 학습은 공식 사이트를 참고하면 좋을 듯 싶고 저는 제가 주로 사용했던 명령어에 대해서만 다루어 보겠습니다.
truffle init
truffle compile
3.truffle migration
truffle deploy
, truffle migrate
가 있습니다.config.js
에 있는 설정 대로 배포를 하게 됩니다.이 외에도 --network
, --reset
또한 자주 사용이 됩니다.
config.js
를 다룰떄 살펴 보겠습니다.실제로 배포할 컨트랙트를 지정하는 폴더이며, 해당 폴더 안에는 하나의 js파일이 있습니다.
Mocha
를 사용해 보신 분이면 알 수 있듯이 artifacts
를 활용하여 컨트랙트를 불러 오게 됩니다.
이후 module.exports
안에 컨트랙트를 배포 하게 됩니다.
제가 작성한 예시 코드 입니다.
이 글에서는 Solidity
코드를 다루는 것이 아니기 떄문에 단순하게 어떠한 역할을 하고 어떻게 동작을 하는지에 대해서 살펴 보겠습니다.
일단 기본적으로 function(deployer)
이 부분에서는 사실 세가지의 인자가 들어 갈 수 있습니다.
function(deployer, network, accounts)
이와 같이 세가지가 들어가지만 deployer
만 사용해도 무관합니다.해당 인자들은 단어 그대로의 의미를 가지고 있지만 따로 구분하여 사용을 하지는 않았기 떄문에 넘어 가도록 하겠습니다.
일단 기본적으로 deploy
를 통해서 해당 컨트랙트를 배포 합니다.
이후 배포된 컨트랙트의 정보를 얻고자 한다면 deployed
를 활용하면 됩니다.
deployed()
에 할당한 변수를 console
찍어보면 블럭, hash값, method값 등등이 나오게 됩니다.이떄 deploy
말고 new
라는 방식의 배포 방법도 있습니다.
truffle에서 굳이 두가지로 나눈 이유는 잘 모르겠지만 new
키워드 같은 경우에는 abi값도 함께 호출이 되기 때문에 참고 하시길 바랍니다.
compile
하면 build
폴더에 abi가 쌓이게 되는데 배포 할때 확인을 하려고 한다면 new
키워드를 활용 하는 것 같습니다.이후 저 같은 경우에는 배포된 컨트랙트의 address
를 따와서 다른 컨트랙트에 넘겨줌으로써 또 배포를 하였지만 이건 머 컨트랙트를 어떻게 작성을 했냐에 따라 다르기 때문에
만약 컨트랙트에 constructor
에서 주소를 받는다면 이와 같이 활용 하면 됩니다.
이후 저는 기본 셋팅 함수가 필요하였기 때문에 컨트랙트에 있는 함수를 실행 시켜주었습니다.
배포는 앞서 말 한 것이 전부 입니다.
하지만 아래있는 따른 함수들의 역할은 무엇일까요??
저희가 caver-js
, web3js
를 사용하여 컨트랙트를 호출 할 떄에는 abi
, CA
값이 필요 합니다.
하지만 배포 할때 console만 찍히고 이후에는 확인이 불가능 하기 때문에 배포 할때 해당 CA주소
, abi
를 합쳐서 하나의 JSON파일을 만들어 주는 역할을 하고 있습니다.
abi
는 따른 폴더에 compile
하면 생성이 되기 때문에 그 부분을 따오면 됩니다.이 부분은 블록체인 적인 부분이 아니기 떄문에 이런식으로 활용이 가능하다 정도만 적고 넘어가겠습니다.
단순히 배포될떄 나오는 CA
값을 abi
값에 붙여주는 역할을 하고 있습니다.
그러면 이제 배포가 될 떄에 이와 같이 json파일이 형성이 되게 됩니다.
실제 서비스 할떄에는 Test를 작성 하는 것이 굉장히 중요 합니다.
특히나 컨트랙트 같은 경우에는 수정하기가 까다롭기 떄문에 (거의 불가능)
Test를 많이 해봐야 합니다.
기본적으로 contract를 불러옵니다
그후 new
키워드를 사용해 컨트랙트를 생성해 줍니다.
before
키워드는 나중에 설명 하겠습니다.
간단한 Test코드 입니다.
it
같은 경우에는 어떤 테스트를 할지 적는 부분 입니다.
descrie
it을 포함하는 것이라고 이해를 하면 될 것 같습니다.
예를들면 describe는 양식, 한식, 중식과 같이 선택지 이고
it은 양식이면 스파게티, 파스타
한식이면 김치지깨, 된장찌개
와 같은 역할을 합니다.
코드만 보면 알수 있듯이 일단 컨트랙트 내에 잇는 함수를 불러오는 것은 단순히 해당 함수를 호출 하면 됩니다.
발생한 이벤트를 통해서 확인하는 방법 입니다.
컨트랙트가 실행이 되면 이벤트가 발생을 하고 Transaction receipt
에 저장이 되게 됩니다.
이러한 이벤트 로그를 통해서 어떤 값이 호출되었는지 확인하고 이후 assert.equal
을 통해서 확인 합니다.
assert(false, "하고 싶은말")
으로도 활용이 가능하고 false
인 경우 에러를 의미 합니다.다음으로는 payable
함수가 실행 될때 value
값을 전송하는 방법 입니다.
기본적으로 Klay
같은 경우에는 10^18 peb
이기 떄문에 해당 값을 고려하여 전송을 해주어야 정상적인 테스트가 가능 합니다.
사실 Test코드가 굉장히 길기 떄문에 전부 다루지는 못하였습니다.
하지만 어느정도 작성하는 방법을 담았다고 생각을 하고 TimeTraver
같은 부분은 아직 활용을 못하였기 때문에 후에 가능하다면 추가하여 글을 마무리 하도록 하겠습니다.
미숙하여 설명이 부족하였기 때문에.. 어느정도 이렇게 작성을 한다 정도만 알아가면 좋겠고 부수적인 부분은 공식 사이트를 참고하면 좋을 것 같습니다.