핵심
이 튜토리얼에서는 핵심 표준을 스마트 컨트랙트에 구현하는 방법을 배웁니다. 처음 해보는 경우 이 레퍼지토리를 복제하고 3.enumeration
브랜치를 확인하세요.
git checkout 3.enumeration
4.core
브랜치에서 찾을 수 있습니다. :::소개
지금까지 사용자가 토큰을 생성하고 열거(Enumeration) 표준을 사용하여 정보를 볼 수 있는 간단한 NFT 스마트 컨트랙트를 만들었습니다. 오늘은 스마트 컨트랙트를 확장하여 사용자가 토큰을 발행할 뿐만 아니라 전송할 수도 있게 할 것입니다.
발행 튜토리얼에서 했던 것처럼, 문제를 여러 하위 작업으로 나누어 더 쉽게 만들어 봅시다. 토큰이 발행되면 정보는 3곳에 저장됩니다.
- tokensPerOwner: 각 계정에 대한 토큰 집합입니다.
- tokensById: 토큰 ID를
Token
객체에 매핑합니다. - tokenMetadataById: 토큰 ID를 해당 메타데이터에 매핑합니다.
이제 다음과 같은 시나리오를 고려해 봅시다. Benji가 토큰 A를 소유하고 Mike에게 생일 선물로 전송하려는 경우 어떻게 해야 할까요? 우선 토큰 A를 Benji의 토큰 집합에서 제거하고, Mike의 토큰 집합에 추가해야 합니다.
그것이 구현하는 유일한 로직이라면, 몇 가지 문제에 부딪히게 될 것입니다. 토큰이 Mike에게 전송된 후 해당 토큰에 대한 정보를 쿼리하기 위해 view
호출을 하면 여전히 Benji가 소유자라고 표시됩니다.
이는 컨트랙트가 여전히 Benji의 계정 ID로 설정된 owner_id
필드를 담은 이전 Token
객체에 토큰 ID를 매핑하고 있기 때문입니다. 토큰 ID가 Mike를 소유자로 하는 새 Token
객체에 매핑되도록 tokensByIdToken
자료 구조를 변경해야 합니다.
그렇다면, 소유자가 토큰을 수신자에게 전송하는 최종 프로세스는 다음과 같아야 합니다.
- 소유자 집합에서 토큰을 제거합니다.
- 수신자 집합에 토큰을 추가합니다.
- 올바른 소유자가 포함된 새
Token
객체에 토큰 ID를 매핑합니다.
tokenMetadataById
필드를 편집하지 않는 이유가 궁금할 수 있습니다. 이는 누가 토큰을 소유하든 관계없이 토큰 ID는 항상 동일한 메타데이터에 매핑되기 때문입니다. 메타데이터는 절대로 변경되어서는 안 되므로 그대로 둘 수 있습니다. :::이 시점에서, 스마트 컨트랙트에 필요한 수정을 할 준비가 되었습니다.