728x90
NFT표준 규격으로 ERC721 대신 ERC721A를 사용했다.
ERC721A
아즈키 프로젝트에서 기존 ERC721의 가스비를 개선하여 ERC721A를 만들었다.
기존 ERC721에서 5개를 민팅한다고 했을때 가스비는 1개를 민팅한 가스비에서 비례적으로 늘어난다.
최적화1
ERC721 Enumerable 에서 중복 스토리지 제거
최적화2
발행된 NFT 대신 발행 요청당 한번 소유자의 잔액 업데이트
내가 토큰을 2개 가지고 있고 5개를 더 산다고 가정했을때 내 NFT 갯수를 업데이트 할때 2+1+1+1+1+1 과 같이 반복문을 실행하는 것보다 2+5와 같이 한번에 계산하는것이 가스비를 줄일 수 있다.
최적화3
설정되지 않은 토큰을 조회할때 한칸씩 앞으로 이동하여 소유자가 나올때까지 반복한다.
소유자가 나오면 그 토큰의 주인은 소유자인것이다.
예를 들면 102번을 조회할때 101번 조회후 100번을 조회한다.
100번에서 소유자 엘리스가 있으므로 102번 소유자도 엘리스가 된다.
function ownershipOf(uint256 tokenId)
internal
view
returns (TokenOwnership memory)
{
require(_exists(tokenId), "ERC721A: owner query for nonexistent token");
uint256 lowestTokenToCheck;
if (tokenId >= maxBatchSize) {
lowestTokenToCheck = tokenId - maxBatchSize + 1;
}
for (uint256 curr = tokenId; curr >= lowestTokenToCheck; curr--) {
TokenOwnership memory ownership = _ownerships[curr];
if (ownership.addr != address(0)) {
return ownership;
}
}
revert("ERC721A: unable to determine the owner of token");
}
ERC721A는 공간복잡도를 O(1)로 줄여 가스비를 최소화 하였다.
배포
배포는 remix에서 goerli testnet으로 배포를 진행했다.
컴파일을 하면 생성되는 artifact의 metadata.json에 있는 abi와 contract address 를 이용하여 web3로 프론트와 연결했다.
728x90
'팀프로젝트 > close_sea' 카테고리의 다른 글
[CloseSea] NFT거래 권한 이슈 (0) | 2022.12.28 |
---|---|
[CloseSea] 지갑연결 버튼 (0) | 2022.12.28 |
[CloseSea] swap페이지 만들기 (0) | 2022.12.27 |
[CloseSea] eslint, prettier 설정 (0) | 2022.12.26 |
[Docker] ERROR in [eslint] EACCES: permission denied, mkdir '/app/node_modules/.cache' (0) | 2022.12.20 |