개요
ART42는 Solidity와 Hardhat 프레임워크를 사용하여 개발된 ERC721 NFT (대체 불가능 토큰)다. 각 토큰은 아티스트, 이름, 레벨 등의 속성과 함께 이미지를 포함하여 디지털 아트의 소유권을 나타낸다.
이더리움 네트워크의 NFT
검증된 신뢰성과 강력한 생태계로 인해 NFT 생성에 이더리움과 Solidity를 선택했다. 이더리움은 탈중앙화 애플리케이션을 위한 선도적인 플랫폼으로, 강력한 보안과 광범위한 채택을 제공한다. Solidity는 이더리움의 목적별 언어로 스마트 컨트랙트 작성에 맞춰져 있어 NFT 개발을 효율적이고 효과적으로 만든다. 또한 활발한 커뮤니티 지원과 다가오는 이더리움 2.0 업그레이드는 확장성과 미래 대비를 보장하여 가치 있고 안전한 NFT를 생성하기에 이상적인 조합이다.
주요 기능
- ERC721 표준: 주요 마켓플레이스 및 지갑과의 NFT 호환성을 위한 ERC721 표준 준수
- ERC721URIStorage: 메타데이터를 위한 토큰별 URI를 지원하도록 ERC721 확장
- Ownable: 컨트랙트 소유자만 새로운 NFT를 민팅할 수 있다
- IPFS 통합: 메타데이터와 이미지를 IPFS에 저장하여 탈중앙화되고 불변의 저장소 제공
- 순차적 토큰 ID: 각 NFT는 0부터 시작하는 고유한 순차적 토큰 ID를 받음
프로젝트 구조
tokenizeArt/
├── code/ # 메인 프로젝트 디렉토리
│ ├── contracts/ # Solidity 스마트 컨트랙트
│ │ └── Art42.sol # 메인 NFT 컨트랙트
│ ├── test/ # 테스트 파일
│ │ └── Art42.test.ts # 컨트랙트 테스트
│ ├── ignition/ # Hardhat Ignition 배포 스크립트
│ │ └── modules/
│ │ └── Art42.ts # 배포 모듈
│ ├── artifacts/ # 컴파일된 컨트랙트 아티팩트
│ └── typechain-types/ # TypeScript 타입 정의
├── deployment/ # NFT 메타데이터 및 이미지
│ ├── 42-01.json # NFT 메타데이터 예제
│ ├── 42-01.jpeg # NFT 이미지
│ └── ...
└── documentation/ # 프로젝트 문서
├── index.md # 메인 문서
└── metadata.md # 메타데이터 구조 문서
스마트 컨트랙트 상세 정보
Art42.sol
메인 컨트랙트는 OpenZeppelin의 ERC721URIStorage와 Ownable을 확장한다:
- 생성자(Constructor): 이름 "Art42"와 심볼 "ART42"로 컨트랙트 초기화
- mint(): 토큰 URI와 함께 새로운 NFT를 민팅하는 소유자 전용 함수
- tokenId: 현재 토큰 ID를 추적하는 공개 카운터
contract Art42 is ERC721URIStorage, Ownable {
uint256 public tokenId;
constructor() ERC721("Art42", "ART42") Ownable(msg.sender) {
tokenId = 0;
}
function mint(string memory tokenURI) public onlyOwner returns (uint256) {
uint256 newItemId = tokenId;
_safeMint(msg.sender, newItemId);
_setTokenURI(newItemId, tokenURI);
tokenId += 1;
return newItemId;
}
}
사전 요구사항
- Node.js (v16 이상)
- npm 또는 yarn
- Git
설치
1. 저장소 클론:
git clone <repository-url>
cd tokenizeArt
2. 의존성 설치:
cd code
npm install
3. code 디렉토리에 .env 파일 생성:
INFURA_API_KEY=your_infura_api_key
PRIVATE_KEY=your_private_key
ETHERSCAN_API_KEY=your_etherscan_api_key
사용법
컨트랙트 컴파일
cd code
npx hardhat compile
테스트 실행
npx hardhat test
가스 리포트와 함께 테스트 실행:
REPORT_GAS=true npx hardhat test
로컬 네트워크에 배포
1. 로컬 Hardhat 노드 시작:
npx hardhat node
2. 다른 터미널에서 컨트랙트 배포:
npx hardhat ignition deploy ./ignition/modules/Art42.ts --network localhost
Sepolia 테스트넷에 배포
npx hardhat ignition deploy ./ignition/modules/Art42.ts --network sepolia --verify
NFT 민팅
배포 후 메타데이터를 가리키는 IPFS URI와 함께 컨트랙트의 mint() 함수를 사용하여 NFT를 민팅할 수 있다:
const tokenURI = 'https://ipfs.io/ipfs/QmRpG448DYs89viUa7X7SXJxCW1qkJLaZ1w5CWK3UniPfE';
await art42.mint(tokenURI);
메타데이터 구조
각 NFT는 추가 속성과 함께 ERC721 메타데이터 표준을 따릅니다:
{
"name": "Art42-01",
"external_url": "https://ipfs.io/ipfs/QmRpG448DYs89viUa7X7SXJxCW1qkJLaZ1w5CWK3UniPfE",
"image": "ipfs://QmRpG448DYs89viUa7X7SXJxCW1qkJLaZ1w5CWK3UniPfE",
"attributes": [
{
"trait_type": "Artist",
"value": "wpark"
},
{
"trait_type": "Name",
"value": "Leo"
},
{
"trait_type": "Lv",
"value": "4"
}
]
}
주요 결정 사항 및 이유
Hardhat
Hardhat은 Solidity 개발을 위한 유연하고 강력한 환경을 제공한다. 훌륭한 디버깅 도구, 플러그인 지원, 테스트 및 배포를 위한 쉬운 설정을 제공한다. 이를 통해 개발 프로세스를 간소화하는 이상적인 선택이 되었다.
OpenZeppelin 컨트랙트
검증된 OpenZeppelin의 컨트랙트를 사용하면 보안과 표준화를 보장할 수 있다. ERC721URIStorage는 토큰별 URI 기능을 제공하고, Ownable은 민팅을 위한 접근 제어를 구현한다.
IPFS 및 Pinata
IPFS (InterPlanetary File System)는 데이터가 단일 중앙화 서버에 보관되는 것이 아니라 노드 네트워크에 분산되도록 보장하는 탈중앙화 저장 프로토콜이다. 이는 Art42 NFT 프로젝트에 다음과 같은 주요 이점을 제공한다:
- 탈중앙화: 데이터가 단일 장애 지점이 되는 것을 방지하여 보안과 복원력을 향상시킨다
- 불변성: 업로드되면 데이터를 변경할 수 없어 시간이 지나도 NFT 콘텐츠의 무결성과 진정성을 보장한다
- 콘텐츠 주소 지정: 고유한 해시를 통해 데이터에 액세스하여 특정 파일을 쉽게 확인하고 검색할 수 있다
Pinata는 파일이 시간이 지나도 계속 사용 가능하고 접근 가능하도록 보장하는 인기 있는 IPFS 핀닝 서비스다.
테스트
프로젝트에는 다음을 포함하는 포괄적인 테스트가 포함되어 있다:
- NFT 민팅 기능
- 소유자 전용 접근 제어
- 토큰 ID 증가
테스트 실행:
npx hardhat test
보안 고려사항
- 컨트랙트는 OpenZeppelin의 감사된 컨트랙트를 사용한다
- 소유자만 새로운 NFT를 민팅할 수 있다 (접근 제어)
- 안전한 민팅을 사용하여 비-ERC721Receiver 컨트랙트로의 전송을 방지한다
- 토큰 URI는 설정되면 불변이다
