이번 유닛에서는 클레이튼 네트워크에서 사용되는 NFT, KIP-17을 개발한다.
다음은 개발을 위한 몇 가지 링크이다.
ERC-721을 이용해 이더리움 기반의 스마트 컨트랙트를 만들었던 것처럼, 클레이튼 기반의 스마트 컨트랙트를 생성하기 위해서는 KIP를 사용해야 한다. ERC-721에는 Identity를 검증하는 ERC-165가 포함되어 있다. KIP에서는 KIP-13으로 Identity를 검증한다.
Klaytn IDE에 접속하고, 새로운 Workspaces, 새로운 파일을 생성한다.
앞서 언급했듯이, 이더리움 기반의 스마트 컨트랙트와 달리, 클레이튼 기반의 스마트 컨트랙트는 KIP를 사용한다. 따라서 ERC-721 스마트 컨트랙트를 그대로 사용할 수 없다. ERC-721의 코드를 가져와서, 다음과 같이 수정한다.
수정된 이 코드만으로는 Klaytn IDE를 통해 배포할 수 없다. MyNFTs의 부모 객체를 모두 작성하여야 문제없이 동작할 수 있다. 다음 두 가지 사항을 유의하자.
부모객체의 코드링크. 다음의 링크를 통해 코드를 복사하고, Klaytn IDE에 복붙. 코드를 붙여넣었다면, 코드를 컴파일하고 배포한다.
컴파일러 탭에서 MyNFTs 컨트랙트를 컴파일한다.
이 문서를 작성하는 현재, 클레이튼 기반의 Solidity 컴파일러 버전은0.5.6+commit.b259423e.Emscripten.clang
이다.
배포 탭 바오밥 환경에서 ACCOUNT를 추가한다. 클레이튼 IDE 에서는 지갑을 연결 할려면 개인 키가 필요하다. 지갑을 성공적으로 연결 했으면 컨트랙트 드롭다운을 클릭하고 배포하려는 컨트랙트를 선택한 후 배포를 진행한다.
배포가 완료되면, 하단의 콘솔과 클레이튼 스코프 에서 확인할 수 있다.
화면 좌측하단에서 배포된 컨트랙트를 확인할 수 있다. 그 중에서 mintNFT
를 실행해 NFT를 생성하고 함수 ownerOf
를 실행하여, NFT 발행이 잘 이뤄졌는지 확인 해 보자.
이 유닛에서는 로컬 환경에서 Truffle을 이용해 KIP-17을 배포한다.
클레이튼은 이더리움을 포크한 네트워크이기 때문에, Truffle과 Ganache 같은 이더리움 기반의 스마트 컨트랙트 개발 환경을 그대로 사용할 수 있다. 다만 Ganache는 이더리움 개발환경을 제공하기 때문에, 클레이튼 기반의 스마트 컨트랙트를 테스트하더라도 표시되는 코인의 단위는 항상 ETH이다.
truffle-config.js
를 열고, 네트워크 설정을 편집한다. Ganache와 동시에 클레이튼의 테스트넷인 바오밥 네트워크도 함께 등록한다.
바오밥 네트워크를 등록하기 위해, 다음 명령어로 npm package를 두 가지를 설치한다.
# truffle-hdwallet-provider-klaytn과 dotenv를 설치
npm install truffle-hdwallet-provider-klaytn dotenv --save-dev
truffle-config.js
파일에서 다음과 같이 development
주석을 제거하고, developement
를 구분하기 좋게 ganache
로 변경한다. 그리고 baobab
을 추가한다. 이때, 앞서 설치한 모듈을 사용한다. .env
파일을 생성하고, 배포에 사용할 지갑의 개인키를 입력한다.
PRIVATE_KEY="YOUR_PRIVATE_KEY_HERE"
truffle-config.js
파일로 돌아와서, 다음과 같이 수정한다.
이제 로컬 환경에서 Truffle과 Ganache를 이용해 클레이튼 기반의 스마트 컨트랙트를 개발할 수 있다.
contracts
폴더 아래에 MyNFTs.sol
파일을 생성하고, 코드를 붙여넣는다.
이 코드는 Klaytn IDE에서 작성한 코드이다.
이더리움과 마찬가지로 붙여넣은 코드가 정상적으로 배포되기 위해서는, migration 파일을 설정해야 한다. 1_initial_migration.js
파일을 다음과 같이 편집한다.
기존의 터미널은 컨트랙트를 제작하고 있는 이 폴더에서 다음 명령어를 입력하여 baobab 네트워크에 컨트랙트를 배포한다
truffle migrate --compile-all --network baobab
배포중에 계속 오류가 나서 시간을 좀 썻다 solidity 버전 에러가 떠서 solc 버전을 맞춰줘야 했다.
일단 Klaytn Docs기준에 따르면 컴파일 버전은 0.5.6
이여야 한다. 때문에 truffle-config.js
에서 compilers 부분을 solc 를 맞춰줬다.
compilers:{
solc:{
version : "0.5.6";
}
}
Given value "TxTypeLegacyTransaction" is not a valid hex string. 오류
트러플 버전이 달라서? >> 해결
npm uninstall -g truffle
npm install -g truffle@5.0.26
생성된 트랜잭션은 클레이튼 스코프에서 확인할 수 있다.
배포를 마쳤으면, 배포된 컨트랙트와 연결하여 NFT를 발행한다. 배포된 컨트랙트와 연결하기 위해, Truffle console을 실행한다. 프롬프트에 다음의 명령어를 입력.
truffle console --network baobab
Truffle 콘솔이 실행되면, 배포된 컨트랙트의 인스턴스를 요청한후 새로운 NFT를 민팅한다.
테스트넷에 배포할 때에는 이미 ownership이 설정됐다. .env
파일에 입력한 개인키에 대응되는 지갑주소가 오너이다. Truffle 콘솔을 이용해 네트워크에 접속할 때에도, truffle-config.js 파일에 설정한 값을 사용한다. 따라서, 오너의 지갑주소로 접속 하기 때문에 Ganache를 이용할 때와는 달리, mintNFT
함수를 실행하기 위해 지갑 주소를 선택할 필요가 없다.