이벤트
이 튜토리얼에서는 이벤트 표준과 이를 스마트 컨트랙트에서 구현하는 방법에 대해 알아봅니다.
소개
시작하려면 GitHub 레퍼지토리에서 6.royalty
브랜치로 전환하거나 이전 튜토리얼에서 작업을 계속하십시오.
git checkout 6.royalty
7.events
브랜치에서 찾을 수 있습니다. :::사용 사례 이해하기
Have you ever wondered how the wallet knows which NFTs you own and how it can display them in the collectibles tab? 원래는 인덱서가 사용되었으며, 계정에서 nft_
로 시작하는 모든 함수를 수신했습니다. 그런 다음 이러한 컨트랙트는 당신의 계정에서 NFT 컨트랙트일 가능성이 있는 것으로 표시되었습니다.
수집품 탭으로 이동하면, 지갑은 열거(Enumeration) 튜토리얼에서 본 nft_tokens_for_owner
함수를 사용하여 소유한 NFT 목록에 대한 모든 컨트랙트를 쿼리합니다.
문제
컨트랙트에 플래그를 지정하는 이 방 법은 각각의 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: 이벤트에 포함할 선택적 메시지입니다.
예시
표준에 대한 이해를 돕기 위해 세 가지 시나리오를 살펴보고 로그가 어떻게 표시되는지 살펴보겠습니다.
시나리오 A - 단순한 발행
이 시나리오에서 Benji는 토큰 ID "team-token"
을 사용하여 Mike에게 NFT를 발행하려고 하고, 메시지를 포함하지 않습니다. 로그는 다음과 같아야 합니다.
EVENT_JSON:{
"standard": "nep171",
"version": "1.0.0",
"event": "nft_mint",
"data": [
{"owner_id": "mike.testnet", "token_ids": ["team-token"]}
]
}
시나리오 B - 일괄 발행
이 시나리오에서 Benji는 일괄 발행을 수행하려고 합니다. 그는 Mike, Damian, Josh 및 Dorian에게 NFT를 발행할 것입니다. Dorian은 두 개의 NFT를 받게 됩니다. 각 토큰 ID "team-token"
에는 증가하는 숫자가 따라옵니다. 로그는 다음과 같습니다.
EVENT_JSON:{
"standard": "nep171",
"version": "1.0.0",
"event": "nft_mint",
"data": [
{"owner_id": "mike.testnet", "token_ids": ["team-token0"]},
{"owner_id": "damian.testnet", "token_ids": ["team-token1"]},
{"owner_id": "josh.testnet", "token_ids": ["team-token2"]}
{"owner_id": "dorian.testnet", "token_ids": ["team-token3", "team-token4"]},
]
}
시나리오 C - NFT 전송
이 시나리오에서 Mike는 두 팀 토큰을 모두 Josh에게 전송합니다. 로그는 다음과 같아야 합니다.
EVENT_JSON:{
"standard": "nep171",
"version": "1.0.0",
"event": "nft_transfer",
"data": [
{"old_owner_id": "mike.testnet", "new_owner_id": "josh.testnet", "token_ids": ["team-token", "team-token0"], "memo": "Go Team!"}
]
}
컨트랙트 수정
이 시점에서 최종 목표가 무엇인지 잘 이해하고 있어야 합니다. 레퍼지토리를 열어서 nft-contract/src
디렉토리 내 새 파일 events.rs
을 생성하세요 이는 로그 구조체가 존재하는 위치입니다.
이벤트 파일 생성
다음을 파일에 복사합니다. 이는 EventLog
, NftMintLog
, 및 NftTransferLog
에 대한 구조체의 개요를 설명합니다. 또한, EVENT_JSON:
에 대해 EventLog
를 로그할 때마다 접두사가 붙도록 하는 방법도 추가했습니다.
loading...