Last updated
Last updated
MyERC721Card.sol
의 전체 코드는 아래에서 확인할 수 있습니다.
MyERC721Card.sol
은 하나의 인터페이스(IERC165
), 세 라이브러리(Address
, SafeMath
그리고 Counters
) 그리고 네 컨트랙트(ERC165
, IERC721
, IERC721Receiver
그리고 MyERC721Card
)로 구성됩니다.
Address
라이브러리는 account
가 컨트랙트인지 여부를 테스트하는 isContract
메소드를 정의합니다.
SafeMath
library defines wrappers over Solidity's arithmetic operations with added overflow checks for safe calculation of uint256
type of Solidity.
Counters
라이브러리는 오직 1만큼만 증가하거나 감소할 수 있는 카운터를 정의합니다. 이는 ERC721 ID를 발행할 때 원소의 개수를 추적하는 것에 사용됩니다.
ERC165
는 IERC165
인터페이스를 구현합니다.
IERC721Receiver
는 MyERC721Card
컨트랙트에 사용된 onERC721Received
를 정의합니다.
ERC721
는 IERC721
및 ERC165
인터페이스를 구현합니다.
MyERC721Card
는 ERC721
을 사용한, 이름과 레벨을 포함한 카드 타입의 대체 불가능한 토큰을 구현합니다. MyERC721Card
컨트랙트의 소유자만이 새로운 카드를 발행할 수 있습니다.
Let's take a look at some important methods in detail.
constructor
of ERC721 and _INTERFACE_ID_ERC721
constructor
는 아래의 ERC-721 인터페이스로부터 구해진 4바이트 해시인 _INTERFACE_ID_ERC721
을 등록합니다.
등록 후, _INTERFACE_ID_ERC721
에 대해 호출될 때 supportsInterface
인 ERC-721 및 ERC-165의 인터페이스는 true
를 반환하고, 이 컨트랙트가 ERC-721 인터페이스를 구현하고 있음을 알려줍니다.
function balanceOf(address owner) public view returns (uint256 balance);
balanceOf
는 ERC-721의 필수 메소드입니다. balanceOf
는 owner
의 계정에 들어 있는 NFT의 개수를 반환합니다.
balanceOf
는 단지 owner
가 _ownedTokensCount
에서 유지하는 Counter
객체로부터 현재 카운트를 반환합니다.
safeTransferFrom
and transferFrom
이 함수는 주어진 토큰 ID의 소유권을 다른 주소로 넘겨줍니다. ERC-721로부터 요구되는 두 개의 safeTransferFrom
메소드가 있습니다. 하나는 data
가 있으며, 다른 하나는 data
가 없습니다. data
가 없는 메소드는 data
를 ""
으로 설정한다는 점을 제외하면, 두 메소드 모두 동일하게 작동합니다. safeTransferFrom
는 아래의 더 많은 검사와 함께 transferFrom
를 호출하며, safeTransferFrom
는 또 다른 ERC-721의 필수 메소드인 transferFrom
보다 선호됩니다.
safeTransferFrom
은 to
주소가 토큰을 받을 수 있는지를 검사합니다. _checkOnERC721Received
는 검증 로직을 가집니다. 만일 to
주소가 컨트랙트라면 ERC-721의 onERC721Received
인터페이스를 구현해야 하며, 아래와 같이 ERC-721 토큰을 받기 위해 올바른 4바이트 해시를 반환해야 합니다.
_transferFrom
은 아래와 같이 주어진 tokenId
의 소유권을 실제로 이전합니다.
function _mint(address to, uint256 tokenId) internal
_mint
는 ERC-721의 일부가 아닙니다. 그러나 새로운 ERC-721 토큰을 생성할 방법이 필요하며, 이 구현체에서 새 토큰을 생성하기 위해 아래와 같은 _mint
가 필요합니다.
_mint
is an internal method and can be invoked inside of this contract. MyERC721Card.sol
에서 _mint
는 오직 MyERC721Card
의 mintCard
메소드에서만 호출됩니다. 스마트 컨트랙트의 소유자만이 mintCard
를 호출할 수 있습니다.
IERC165
인터페이스는 에 명시된 인터페이스를 정의합니다.
IERC721
는 ERC-165를 포함한 에 명시된 인터페이스를 정의합니다.