Chủ Nhật, Tháng Một 29, 2023
24 C
Ho Chi Minh City
spot_img

Event | NEAR Documentation

Must read

Openlivenft
Openlivenfthttps://openlivenft.info/
Trang tổng hợp thông tin nhanh - mới nhất về NFT, COIN, Metaverse, tài chính, crypto của OpenliveNFT

Bạn đã bao giờ thắc mắc làm cách nào mà wallet biết bạn sở hữu những NFT nào và làm thế nào nó có thể hiển thị chúng trong collectibles tab? Ban đầu, một indexer đã được sử dụng và nó lắng nghe mọi function bắt đầu với nft_ trên account của bạn. Những contract này sau đó được gắn cờ trên account của bạn có thể là các NFT contract.

Khi bạn chuyển đến collectibles tab của mình, wallet sau đó sẽ truy vấn tất cả các contract đó để biết danh sách NFT mà bạn đang sở hữu bằng cách sử dụng function nft_tokens_for_owner mà bạn đã nhìn thấy trong hướng dẫn enumeration.

Phương pháp gắn cờ những contract này không đáng an toàn và đáng tin cậy vì mỗi ứng dụng điều khiển và tinh chỉnh NFT hoàn toàn có thể có cách mint hoặc transfer NFT riêng của nó. Ngoài ra, những ứng dụng thường transfer hoặc mint nhiều token cùng một lúc bằng cách sử dụng những batch function .

Một tiêu chuẩn đã được giới thiệu để các smart contract có thể phát ra một event bất cứ lúc nào các NFT được transfer, mint, hay burn. Event này ở dạng log. Bất kể contract triển khai function như thế nào, giờ đây indexer có thể lắng nghe các log được tiêu chuẩn hóa đó.

Bạn đang đọc: Event | NEAR Documentation

Theo tiêu chuẩn, bạn cần tiến hành một công dụng log kích hoạt khi những NFT được transfer hoặc mint. Trong trường hợp này, contract không tương hỗ burn vì vậy bạn không cần lo ngại về nó giờ đây .

Điều quan trọng cần lưu ý là tiêu chuẩn quy định rằng log phải được bắt đầu với "EVENT_JSON:". Tuy nhiên, cấu trúc log của bạn luôn phải chứa 3 thứ dưới đây:

  • standard: tên hiện tại của tiêu chuẩn (ví dụ nep171)
  • version: phiên bản của tiêu chuẩn bạn đang sử dụng (ví dụ 1.0.0)
  • event: một danh sách các event bạn đang phát ra.

Event interface khác nhau tùy thuộc vào việc bạn đang ghi lại những transfer hay mint. Interface của cả hai sự kiện được phác thảo như dưới đây .

Các transfer event:

  • Optional – authorized_id: account đã được chấp thuận transfer thay cho chủ sở hữu.
  • old_owner_id: chủ sở hữu cũ của NFT.
  • new_owner_id: chủ sở hữu mới mà NFT đang được transfer tới.
  • token_ids: danh dách các NFT đang được transfer.
  • Optional – memo: một tùy chọn message để đưa vào event.

Các mint event:

  • new_owner_id: chủ sở hữu mới mà NFT đang được mint tới.
  • token_ids: danh dách các NFT đang được transfer.
  • Optional – memo: một tùy chọn message để đưa vào event.

Để củng cố sự hiểu biết của bạn về tiêu chuẩn này, hãy cùng đi qua ba trường hợp và xem những log sẽ như thế nào .

Trong tình huống này, Benji muốn mint một NFT tới Mike với một token ID "team-token" và anh ấy không gửi một message nào. Log sẽ nhìn giống như sau.

EVENT_JSON : {

" standard " : " nep171 " ,

" version " : " 1.0.0 " ,

" sự kiện " : " nft_mint " ,

" data " : [

{ " owner_id " : " mike.testnet ", " token_ids " : [ " team-token " ] }

]

}

Trong tình huống này, Benji muốn tiến hành một batch mint. Anh ấy sẽ mint NFT tới Mike, Damian, Josh, và Dorian. Tuy nhiên, Dorian sẽ nhận được hai NFT. Mỗi token ID sẽ là "team-token" theo sau bởi một số tăng dần. Log sẽ như sau.

EVENT_JSON : {

" standard " : " nep171 " ,

" version " : " 1.0.0 " ,

" sự kiện " : " 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 " ] } ,

]

}

Trong trường hợp này, Mike đang transfer cả hai token của team anh ấy tới Josh. Log sẽ nhìn giống như sau .

EVENT_JSON : {

" standard " : " nep171 " ,

" version " : " 1.0.0 " ,

" sự kiện " : " nft_transfer " ,

" data " : [

{ " old_owner_id " : " mike.testnet ", " new_owner_id " : " josh.testnet ", " token_ids " : [ " team-token ", " team-token0 " ], " memo " : " Go Team ! " }

]

}

Ở thời điểm này, bạn đã hiểu rõ về mục tiêu cuối cùng là gì vì thế hãy bắt đầu làm việc! Mở repository và tạo một file mới trong thư mục nft-contract/src đặt tên cho nó là events.rs. Đây là nơi các cấu trúc log của bạn sẽ được tạo.

Copy phần dưới đây vào file của bạn. Cái này sẽ phác thảo các cấu trúc cho EventLog của bạn, NftMintLog, và NftTransferLog. Ngoài ra, chúng ta đã thêm EVENT_JSON: là tiền tố bất cứ khi nào bạn ghi lại EventLog.

nft-contract / src / events.rs

loading ...

See full example on GitHub

Việc này yêu cầu serde_json package, bạn có thể dễ dàng thêm nó vào file nft-contract/Cargo.toml:

nft-contract / Cargo. toml

loading ...

See full example on GitHub

Bây giờ bạn đã tạo một file mới, bạn cần thêm module tới file lib.rs. Ngoài ra, bạn có thể định nghĩa hai constant cho tiêu chuẩn và version sẽ được sử dụng trong contract của chúng ta.

nft-contract / src / lib.rs

loading ...

See full example on GitHub

Bây giờ tất cả các công cụ đã được thiết lập sẵn, bạn có thể tiến hành thực tế chức năng log. Vì contract chỉ mint các token ở một nơi, nên việc bạn đặt log ở đâu là không quan trọng. Mở file nft-contract/src/mint.rs và chuyển tới phía cuối file. Đây là nơi bạn sẽ xây dựng log để mint. Bây giờ nó sẽ phát ra một log chính xác, bất kỳ khi nào ai đó mint thành công một NFT.

nft-contract / src / mint.rs

loading ...

See full example on GitHub

Hãy mở file nft-contract/src/internal.rs và chuyển tới internal_transfer function. Đây là nơi bạn sẽ xây dựng transfer log của mình. Bất kỳ khi nào một NFT được transfer, function này sẽ được call và vì thế bạn sẽ log các transfer một cách chính xác.

nft-contract / src / internal.rs

loading ...

See full example on GitHub

Thật không may, có một trường hợp sẽ làm hỏng mọi thứ với giải pháp này. Nếu một NFT được transfer thông qua function nft_transfer_call, có khả năng quá trình transfer sẽ bị revert nếu nft_on_transfer function trả về true. Xem xét logic của nft_transfer_call, bạn sẽ thấy tại sao đây là một vấn đề.

Khi nft_transfer_call được gọi, nó sẽ:

  • Gọi internal_transfer để tiến hành logic transfer thực tế.
  • Khởi tạo một cross-contract call và gọi function nft_on_transfer.
  • Giải quyết promise và thực hiện logic trong nft_resolve_transfer.
    • Nếu nó trả về true nghĩa là quá trình transfer đã diễn ra tốt đẹp còn trả về false thì quá trình transfer sẽ được revert.

Nếu bạn chỉ đặt log vào function internal_transfer, log sẽ được phát ra và indexer sẽ nghĩ rằng NFT đã được transfer. Tuy nhiên, nếu quá trình transfer bị revert trong nft_resolve_transfer, thì event đó cũng sẽ được phát ra. Bất cứ nơi nào mà một NFT có thể được transfer, chúng ta nên ghi vào log. Thay thế nft_resolve_transfer với đoạn code dưới đây.

nft-contract / src / nft_core. rs

loading ...

See full example on GitHub

Ngoài ra, bạn cần thêm authorized_idmemo vào các tham số cho nft_resolve_transfer như dưới đây.

nft-contract / src / nft_core. rs

loading ...

See full example on GitHub

Tuy nhiên, giải pháp này vẫn còn một trường hợp phức tạp sẽ phá hỏng mọi thứ. Nếu một user gọi nft_transfer_call và họ đính kèm đủ lượng GAS cho internal_transfer chạy xong, nhưng không đủ GAS để gọi cross-contract call, nó sẽ log lại rằng NFT đã được transfer, contract bị panic và revert toàn bộ logic bởi vì không có đủ lượng GAS.

Một cách khắc phục đơn giản cho vấn đề này là đảm bảo rằng user sẽ luôn có đủ lượng GAS bằng cách thêm một xác nhận. Thêm constant dưới đây vào đầu file nft_core.rs của bạn:

nft-contract / src / nft_core. rs

loading ...

See full example on GitHub

Sau đó, bạn có thể khẳng định rằng user đã đính kèm nhiều GAS hơn constant bạn đã khai báo ở trên. Việc này sẽ đảm bảo rằng user có ít nhất 100 TGas để hoàn thành logic nft_transfer_call.

nft-contract / src / nft_core. rs

loading ...

See full example on GitHubVới việc triển khai xong điều đó, bạn đã tiến hành thành công xuất sắc tiêu chuẩn những sự kiện và giờ đây là lúc để mở màn quy trình test .Với mục tiêu dễ đọc và dễ develop, thay vì redeploy contract tới cùng account, hãy tạo một sub-account và deploy với thông tin tài khoản đó. Bạn hoàn toàn có thể deploy cùng account vì không có đổi khác nào bạn đã tiến hành trong hướng dẫn này gây ra lỗi .

Chạy command dưới đây để tạo một sub-account events cho account chính của bạn với số dư ban đầu là 25 NEAR, nó sẽ được transfer từ account gốc sang account mới của bạn.

near create-account events .USD NFT_CONTRACT_ID-- masterAccountUSD NFT_CONTRACT_ID-- initialBalance25

Tiếp theo, bạn sẽ muốn export một biến môi trường tự nhiên cho việc develop được thuận tiện hơn :

exportEVENTS_NFT_CONTRACT_ID=events .USD NFT_CONTRACT_ID

Sử dụng build script, deploy contract như bạn đã làm ở những hướng dẫn trước :

yarnbuildvà vànear deploy -- wasmFile out / main.wasm -- accountIdUSD EVENTS_NFT_CONTRACT_ID

Vì đây là một contract mới, bạn sẽ cần phải khởi tạo và mint một token. Sử dụng command dưới đây để khởi tạo contract :

near callUSD EVENTS_NFT_CONTRACT_IDnew_default_meta' { " owner_id " : " 'USD EVENTS_NFT_CONTRACT_ID' " } '-- accountIdUSD EVENTS_NFT_CONTRACT_ID

Tiếp theo, bạn sẽ cần mint một token. Bằng cách chạy command này, bạn sẽ mint một token với token ID "events-token" và người nhận sẽ là account mới của bạn. Ngoài ra, bạn đang truyền vào một map với hai account sẽ nhận được perpetual royalty bất cứ khi nào token của bạn được bán.

near callUSD EVENTS_NFT_CONTRACT_IDnft_mint' { " token_id " : " events-token ", " metadata " : { " title " : " Events Token ", " description " : " testing out the new events extension of the standard ", " truyền thông " : " https://bafybeiftczwrtyr3k7a2k4vutd3amkwsmaqyhrdzlhvpt33dyjivufqusq.ipfs.dweb.link/goteam-gif.gif " }, " receiver_id " : " 'USD EVENTS_NFT_CONTRACT_ID' " } '-- accountIdUSD EVENTS_NFT_CONTRACT_ID-- amount

0.1


Bạn hoàn toàn có thể kiểm tra xem mọi thứ có diễn ra đúng không bằng cách xem output trong CLI của mình :

Doing account. functionCall()

Receipts : F4oxNfv54cqwUwLUJ7h74H1iE66Y3H7QDfZMmGENwSxd, BJxKNFRuLDdbhbGeLA3UBSbL8UicU7oqHsWGink5WX7S

Log[events.goteam.examples.testnet]: EVENT_JSON :{" standard ":" nep171 "," version ":" 1.0.0 "," sự kiện ":" nft_mint "," data ":[{" owner_id ":" events.goteam.examples.testnet "," token_ids ":[" events-token "]}]}

Transaction Id 4W y2KQVTuAWQHw5jXcRAbrz7bNyZBoiPEvLcGougciyk

To see the transactioninthe transaction explorer, pleaseopenthis urlinyour browser

https://explorer.testnet.near.org/transactions/4Wy2KQVTuAWQHw5jXcRAbrz7bNyZBoiPEvLcGougciyk

' '

Bạn hoàn toàn có thể thấy rằng sự kiện đã được log một cách đúng chuẩn !

Bây giờ bạn có thể test xem transfer log của mình có hoạt động như mong đợi hay không bằng cách gửi NFT cho benjiman.testnet.

near callUSD EVENTS_NFT_CONTRACT_IDnft_transfer' { " receiver_id " : " benjiman.testnet ", " token_id " : " events-token ", " memo " : " Go Team :) ", " approval_id " : 0 } '-- accountIdUSD EVENTS_NFT_CONTRACT_ID-- depositYocto1

Nó sẽ trả về một output trông giống như sau :

Doing account. functionCall()

Receipts : EoqBxrpv9Dgb8KqK4FdeREawVVLWepEUR15KPNuZ4fGD, HZ4xQpbgc8EfU3PiV72LvfXb2f3dVC1n9aVTbQds9zfR

Log[events.goteam.examples.testnet]: Memo : Go Team:)

Log[events.goteam.examples.testnet]: EVENT_JSON :{" standard ":" nep171 "," version ":" 1.0.0 "," sự kiện ":" nft_transfer "," data ":[{" authorized_id ":" events.goteam.examples.testnet "," old_owner_id ":" events.goteam.examples.testnet "," new_owner_id ":" benjiman.testnet "," token_ids ":[" events-token "]," memo ":" Go Team :) "}]}

Transaction Id 4S1 VrepKzA6HxvPj3cK12vaT7Dt4vxJRWESA1ym1xdvH

To see the transactioninthe transaction explorer, pleaseopenthis urlinyour browser

https://explorer.testnet.near.org/transactions/4S1VrepKzA6HxvPj3cK12vaT7Dt4vxJRWESA1ym1xdvH

''


Chúc mừng ! Tại thời gian này, NFT contract của bạn đã hoàn thành xong khá đầy đủ và những tiêu chuẩn sự kiện đã được thực thi .Hôm nay bạn đã đi qua tiêu chuẩn những sự kiện và đã thực thi logic thiết yếu trong smart contract của mình. Bạn đã tạo những sự kiện cho việc mint và transfer những NFT. Sau đó bạn đã deploy và test những biến hóa của mình bằng cách mint và transfer những NFT .Trong hướng dẫn tiếp theo, bạn sẽ xem những thứ cơ bản của một marketplace contract và cách nó được thiết kế xây dựng .

Source: https://openlivenft.info
Category: TIN NFT

Đánh giá bài post
- Advertisement -spot_img

More articles

LEAVE A REPLY

Please enter your comment!
Please enter your name here

- Advertisement -spot_img

Latest article

Ethereum là gì? | OpenliveNFT