97. NFT Smart Contract KryptoBirdz Shell Creation
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
contract KryptoBird {
string public name;
string public symbol;
constructor () {
name = 'Kryptobird';
symbol = 'KBIRDZ';
}
}
smart contract 배포를 해보기 위해서 간단한 contract를 작성했다.
99. Truffle Deployment Javascript File
const KryptoBird = artifacts.require("KryptoBird"); //contract name
module.exports = function(deployer) {
deployer.deploy(KryptoBird);
}
위에서 만든 contract를 배포하기 위해 migrations 폴더에 '2_deploy_contracts.js' 라는 이름의 파일을 생성했다.
require 안에 들어가는 것은 위에서 작성한 smart contract 파일의 이름이 아니라 해당 파일 안의 contract의 이름이다.
100. First Truffle Local Compile
배포를 하기 전에 먼저 contract를 compile 해야 한다.
truffle compile
해당 명령어를 실행하면, 앞선 truffle-config.js 파일에 추가한 contracts_build_directory 경로로 contracts 폴더 안의 solidity 파일이 json 형식으로 compile 되어서 위치한다.
101. Deploy Your First Smart Contract On Ganache
이제는 배포를 하면 된다.
truffle migrate
위의 명령어를 실행하면 잘 되어야 하는데.. 계속 ganache가 실행되어 있지 않다고 뜨는 것이다..💣
이유는 내가 wsl 우분투 환경에서 코드를 돌리고 있어서 그런 것이었다... nodejs는 자동으로 로컬호스트로 포트포워딩이 되는데 ganache는 그렇지 않았다.. 이유도 모르고 ganache-cli 도 써보고 window terminal에서 포트 확인했는데 잘만 돌아가고.. ㅋㅋ
그러다 불현듯 이전에 wsl 포트때문에 고생했던 기억이 나서 wsl 우분투에서 포트 번호를 확인해봤더니 돌아가는게 없더라..ㅎㅎ..
https://forum.openzeppelin.com/t/connect-to-ganache-gui-from-wsl2/4307/9
다행히 해결방법을 찾았는데, ganache gui 에서 setting - server에 들어가서 로컬호스트를 wsl로 바꿔주면 되었다..! wsl 처음 사용하려니까 온갖 곳에서 오류가 발생한다 하하..
아!! 물론 truffle-coonfig.js 에서 network의 host도 로컬호스트에서 우분투 호스트 ip로 변경해야 한다..!
아무튼 이렇게 해서 배포 성공..!!
로그를 보면 'Migrations' 와 'KryptoBird' 두 가지 contract가 배포된 것을 확인할 수 있다. account는 ganache의 맨 첫번째 account address와 동일한 것을 확인할 수 있고, 배포에 사용된 cost가 빠져나간 것도 확인할 수 있다.
102. Truffle Console (Javascript - Syncronous and Asyncronous)
새로운 터미널을 생성해서 truffle console을 입력해서 truffle console을 실행한다. (javascript 문법으로 사용 가능하다.)
순서는 다음과 같다.
- grab the contract,
- set it to a variable and
- access the contract information
103. Truffle Console (Async Await & Fetching Blockchain Data)
async와 await 는 Javascript의 비동기 처리 문법이다.
truffle console에서 우리가 배포한 contract가 잘 배포되었는지 확인하기 위해 먼저 contract의 정보를 grab 해서 variable에 set 한다.
이때, 만약 information을 다 가져오지 않았는데 다음 코드가 실행되면? 오류가 발생할 수 있기 때문에 information을 가져왔다는 걸 확인한 후 다음으로 넘어가기 위해 await를 사용한다.
kryptoBird = await KryptoBird.deployed()
그러면 undefined 라고 뜨지만, 다시 kryptoBird를 입력해서 값을 확인해보면 컨트랙트의 정보를 잘 가져온 것을 확인할 수 있다.
그리고 우리가 contract의 constructor에서 입력해놓았던 name과 symbol 값을 가져와봄으로써 배포가 잘 되었는지 확인해보자
kryptoBird.name()
//'Kryptobird'
kryptoBird.symbol()
//'KBIRDZ'
위와 같이 나오면! 배포가 잘 된 것이다. 휴우.