이벤트
이 튜토리얼에서는 이벤트 표준과 이를 스마트 컨트랙트에서 구현하는 방법에 대해 알아봅니다.
사용 사례 이해하기
Have you ever wondered how the wallet knows which NFTs you own and how it can display them in the collectibles tab? Originally, an indexer used to listen for any functions calls starting with nft_
on your account. Have you ever wondered how the wallet knows which NFTs you own and how it can display them in the collectibles tab?
When you navigated to your collectibles tab, the wallet would then query all those contracts for the list of NFTs you owned using the nft_tokens_for_owner
function you saw in the enumeration tutorial.
문제
컨트랙트에 플래그를 지정하는 이 방법은 각각의 NFT 기반 애플리케이션이 NFT를 발행하거나 전송하는 고유한 방법을 가질 수 있기 때문에, 신뢰할 수 없었습니다. 또한 앱에서 배치 함수를 사용하여 한 번에 많은 토큰을 전송하거나 발행하는 일도 자주 발생합니다.
해결책
NFT가 전송, 발행 또는 소각될 때마다 스마트 컨트랙트가 이벤트를 생성할 수 있도록 하는 표준이 도입되었습니다. 이 이벤트는 로그 형식이었습니다. 컨트랙트가 이 기능을 구현하는 방법에 관계없이, 이제 인덱서는 이러한 표준화된 로그를 수신할 수 있습니다.
표준에 따라, NFT가 전송되거나 발행될 때 실행되는 로깅 기능을 구현해야 합니다. 이 경우 컨트랙트는 소각을 지원하지 않으므로, 지금은 이에 대해선 걱정할 필요가 없습니다.
표준은 로그가 "EVENT_JSON:"
으로 시작해야 함을 정의하고 있다는 점이 중요합니다. 한편, 로그 구조에는 항상 다음 3가지가 포함되어야 합니다.
- standard: 표준의 현재 이름(예: nep171)
- version: 사용 중인 표준 버전(예: 1.0.0)
- event: 내보내는 이벤트 목록
이벤트 인터페이스는 전송을 기록하는지 발행을 기록하는지에 따라 다릅니다. 두 이벤트에 대한 인터페이스는 아래에 설명되어 있습니다.
전송 이벤트:
- 선택 사항 - authorized_id: 소유자를 대신하여 전송하도록 승인된 계정입니다.
- old_owner_id: NFT의 이전 소유자입니다.
- new_owner_id: NFT가 전송되는 새 소유자입니다.
- token_ids: 전송 중인 NFT 목록입니다.
- 선택 사항 - memo: 이벤트에 포함할 선택적 메시지입니다.
발행 이벤트:
- owner_id: NFT를 발행받은 소유자입니다.
- token_ids: 전송 중인 NFT 목록입니다.
- 선택 사항 - memo: 이벤트에 포함할 선택적 메시지입니다.
예시
표준에 대한 이해를 돕기 위해 세 가지 시나리오를 살펴보고 로그가 어떻게 표시되는지 살펴보겠습니다.