Transfers
In this tutorial you'll learn how to implement NFT transfers as defined in the core standards into your smart contract.
We will define two methods for transferring NFTs:
nft_transfer
: that transfers ownership of an NFT from one account to anothernft_transfer_call
: that transfers an NFT to a "receiver" and calls a method on the receiver's account
nft_transfer
is a simple transfer between two user, while nft_transfer_call
allows you to attach an NFT to a function call
Giới thiệu
Up until this point, you've created a simple NFT smart contract that allows users to mint tokens and view information using the enumeration standards. Hôm nay, bạn sẽ mở rộng smart contract của mình để cho phép các user không chỉ mint token mà còn transfer chúng.
As we did in the minting tutorial, let's break down the problem into multiple subtasks to make our lives easier. Khi một token được mint, thông tin được lưu trữ ở 3 nơi:
- tokens_per_owner: tập các token cho mỗi account.
- tokens_by_id: map một token ID với một
Token
object. - token_metadata_by_id: map một token ID với metadata của nó.
Bây giờ hãy xem xét tình huống sau đây. Nếu Benji là người sở hữu token A và muốn chuyển nó cho Mike như một món quà sinh nhật, điều gì sẽ xảy ra? Đầu tiên, token A sẽ bị xóa khỏi tập các token của Benji và được thêm vào tập các token của Mike.
Nếu đó chỉ là logic bạn thực hiện, bạn sẽ gặp một số vấn đề. Nếu bạn thực hiện một view
call để truy vấn thông tin về token đó sau khi nó đã được chuyển cho Mike, nó sẽ vẫn trả về kết quả rằng Benji là chủ sở hữu.
Điều này là do contract vẫn đang map token ID với Token
object cũ, object đó có field owner_id
là account ID của Benji. Bạn vẫn phải thay đổi cấu trúc data của tokens_by_id
, vì thế token ID map với một Token
object mới mà Mike sở hữu.
Với những gì đã nói, quy trình cuối cùng khi chủ sở hữu chuyển token tới người nhận sẽ như sau:
- Xóa token khỏi tập token của chủ sở hữu.
- Thêm token tới tập token của người nhận.
- Map token ID tới một
Token
object mới chứa chính xác thông tin chủ sở hữu.
token_metadata_by_id
. Điều này là do bất kể ai sở hữu token, token ID sẽ luôn map tới cùng một metadata. Metadata sẽ không bao giờ thay đổi và vì vậy chúng ta có thể để nó một mình (không map với một token Id nào cả). :::