npm install -g truffle@5.1.23
mkdir <project_name>
cd <project_name>
truffle init
npm install @openzeppelin/contracts
pragma solidity ^0.8.7;
import "@openzeppelin/contracts/token/ERC721/ERC721.sol";
import "@openzeppelin/contracts/utils/Counters.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage.sol";
contract MyNFTs is ERC721URIStorage, Ownable {
using Counters for Counters.Counter;
Counters.Counter private _tokenIds;
constructor() public ERC721("MyNFTs", "MNFT") {}
function mintNFT(string memory tokenURI)
public onlyOwner
returns (uint256)
{
_tokenIds.increment();
uint256 newItemId = _tokenIds.current();
_mint(msg.sender, newItemId);
_setTokenURI(newItemId, tokenURI);
return newItemId;
}
}
const MyNFTs = artifacts.require('MyNFTs.sol'); // MyNFTs.sol 파일 추가
module.exports = function(deployer) {
deployer.deploy(MyNFTs); // MyNFTs를 배포에 추가
};
ganache 의 default port는 7545
ganache-cli 의 default port는 8545
networks: {
ganache: { // 이름은 구별하기 쉽게 작성
host: "127.0.0.1",
port: 7545, // ganache-cli 에 연결한다면 8545
network_id: "*", // Any network (default: none)
},
},
// Configure your compilers
compilers: {
solc: {
version: "0.8.7",
settings: {
evmVersion: "london",
},
},
},
truffle migrate --compile-all --network ganache
truffle console --network ganache
MyNFTs.deployed() 함수를 통해 MyNFTs 컨트랙트에 접근할 수 있다
truffle 이 배포한 MyNFTs 를 알 수 있는 방법 (log로 가지고 있다) (참고)
mintNFT 에 준비된 링크를 전달 (일반적으로 NFT는 그림파일의 경로를 담은 metadata의 경로를 넣어준다)
참고>OpenSea Metadata 구조
instance.mintNFT("https://velog.io/@repedore")
instance.tokenURI(1)
필수>Truffle과 Ethereum TestNet 연결하기 (feat. ropsten)
truffle console --network ropsten
rinkeby: {
provider: () => new HDWalletProvider(mnemonic, '<ENDPOINTS>'),
network_id: 4,
gas: 4500000,
gasPrice: 10000000000,
},
주의) rinkeby 계정을 다른걸 쓴다면 개인키를 다시 .secret 파일에 써줘야함.
truffle console 접속
truffle console --network rinkeby
migrate
instance = await MyNFTs.deployed()
instance.name() // 잘 불러왔나 확인
instance.mintNFT('https://opensea-creatures-api.herokuapp.com/api/creature/3')
OpenSea 확인
rinkeby - Contract 주소(Verify & Publish)
rinkeby - TX 주소
npm install -D truffle-plugin-verify
참고>github truffle-plugin-verify
Etherscan Api Site 에 접속하여 회원가입 후 API Keys 를 클릭
왼쪽 Other -> API Keys 를 클릭하고 "+ Add" 를 눌러 키를 추가하고 "API Key Token" 을 복사한다.
truffle-config.js 에 plugins 와 api_keys 를 다음과 같은 구조로 추가하고 Etherscan key를 붙여넣음.
Verify 시작
truffle run verify MyNFTs --network rinkeby
Verifying 하는데 약간의 시간이 걸린다. 기다리면 Pass - Verified 됨.
Pass - Verifying 뒤 경로는 MyNFTs Contract 의 code 를 가르킨다. (링크)
상속한 모든 코드와 작성한 코드가 다 올라가 있는것을 확인 할 수 있음.
실수로 Etherscan API Key 를 외부로 빼지않고 truffle-config.js 에 그대로 포함시켜서 git에 올려버렸다. 무료이고 중요하지는 않아서 당장 조치는 취하지 않겠지만 언젠가 키를 삭제 할 수 있으니 꼭 개인키를 받아서 사용하고 나같은 실수를 하지 않길 바란다.
생각보다 내용 정리하는것이 쉽지 않았다.
그 이유는 내 머릿속에서 정리가 제대로 되지 않았기에 그런것같다.
중간중간 왜 그런지 모르고 넘어간 부분들이 있어서 찾아내느라 시간이 오래 걸렸다.
뭔가.. 정리를 하면서 공백이 있던 문서가 좀 더 채워진 느낌을 받는다.
생각 정리할 때 블로깅을 해봐야겠다.
truffle 이 너무 유용하다. 처음쓸때는 난해하고 어려웠는데 쓰면 쓸 수록 편리하다고 느낀다.
추가로 이더리움기반이 아닌 다른 블록체인네트워크에도 사용이 가능한지 알아보고 적용해보자. (truffle 한큐로 다 끝낼 수 있으면 너무 좋을것 같다)(같은 컴파일러가 아니면.. 어쩔수 없고..)
ERC721 코드를 좀 더 분석해서 전체 구조 파악이 좀 필요해보인다.
PS) 근데 블로그를 남들 보기 쉽게 정리하는건 또 다른 영역인것 같다.
PS) Key 관리 잘하자.