klay_getTransactionReceipt 및 klay_getLogs 를 통한 tokenId 획득

안녕하세요.

현재 Klip API를 통해서 NFT를 발행하고 있습니다.
NFT발행에 성공한 경우 동기처리를 위해 폴링을 통해 방금 생성된 tokenId를 획득해 오고자 하는데요

minting 결과로 반환된 hash를 가지고 블록에 포함된 로그조회(klay_getLogs)하여 tokenId를 구할 수 있다고 앞서 가이드 받은 바 있습니다.

다만 리턴값의 종류가 너무 많아서 이중에 어떤것이 event log 인지 판단하기 어려운데요
address, data, topic, … 등 어떤것을 타켓팅해야하는지, 또 해당 대상을 가지고
emit Transfer으로 로깅된 tokenId를 획득해 올 수 있는지 조금만 더 코멘트주시면 감사하겠습니다!

(참고로 지금 테스트중인 transactionHash는
0x4e31f565bb622e9a591f44afcbe23c8e8977a80ac80f906f5aff94cd885955dd
입니다.
klaytn scope 에서 해당 트랜잭션을 조회했을 때 보이는 tokenId를 획득해오고자 합니다)

klaytn json RPC API 에 좀더 가까운 질문인것 같아 카테고리를 재설정하여 문의드립니다.

감사합니다 :slight_smile:

안녕하세요, 클레이튼 팀의 JK입니다.

먼저, 질문 주셔서 감사드립니다. minting transaction결과로 반환된 transaction의 receipt에는 event logs를 포함하고 있습니다. log topic의 첫번째 항목에는 발생한 event hash값이 들어갑니다. token transfer의 경우 keccak256('Transfer(address,address,uint256)') 결과값인 ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef가 들어갑니다.

topic[0] 값으로 transfer event를 수집할 수 있습니다.

event의 parameters가 들어가는 방식은 두가지가 존재하는데요.
case 1. indexed
topic[0]: event hash
topic[1]: fromAddress
topic[2]: toAddress
data: value

case 2. unindexed
topic[0]: event hash
data: concat(fromAddress, toAddress, value)

이 때, minting되는 token transfer를 찾고계시다면 fromAddress가 0x000...000인 transfer를 찾으셔야하고요, 발행되는 tokenId는 value에 저장되게 됩니다. 따라서, case1인 경우, data field값이 tokenId가 되고, case2인 경우, data에 저장되어있는 값을 32bytes(hash 길이)로 쪼갠 뒤, 마지막(3번째 항목)에 저장되는 값이 tokenId가 됩니다.

추가적인 질문이 있으시면 남겨주세요.
감사합니다.

참조:

1 Like