TRANSFERNFT

Transfers a non-fungible UTXO. This effectively moves a non-fungible asset from one private ZEOS wallet to another. For this operation only part A and B of the ZEOS Action Circuit is used since one existing UTXO is being spent while one new UTXO is being created by this action.

Privacy Implications

This action provides full privacy protection:

  • sender: untraceable - hidden in zk-SNARK
  • asset: untraceable - hidden in UTXO ciphertext
  • memo: untraceable - hidden in UTXO ciphertext
  • receiver: untraceable - hidden in UTXO ciphertext

Flow

The following steps specify the flow of TRANSFERNFT.

Step 0

The UTXO represents a non-fungible EOSIO/Antelope asset to be transmitted.

Step 1

Create a new UTXO tuple representing the non-fungible asset at the receiving address with new randomness:

  • Diversifier index of the receiving ZEOS wallet address
  • Public key of the receiving ZEOS wallet address
  • Choose a random value
  • Choose a random value
  • Choose a random value

Step 2

Calculate the diversified transmission keys of all ZEOS wallet addresses involved (see section 5.4.1.6 of the Zcash Protocol Specification):

Step 3

Calculate the Commitment of the two UTXOs and :

Step 4

Calculate the of the Commitment Tree based on the sister path of .

Step 5

Calculate the Nullifier of :

Step 6

Choose a random value and calculate the Spend Authority for this action (see section 4.17.4 of the Zcash Protocol Specification):

  • Choose a random value

where is the Spend Validating Key of which is part of the Full Viewing Key.

Step 7

Set the private inputs of the arithmetic circuit:

  • sister path of in the Commitment Tree
  • leaf index of in the Commitment Tree
  • Spend Validating Key of which is part of the Full Viewing Key
  • Nullifier Deriving Key of which is part of the Full Viewing Key
  • Randomness of which is part of the Full Viewing Key

Step 8

Set the public inputs of the arithmetic circuit:

Step 9

Generate a proof of knowledge of satisfying arguments so that

The pair is the zk-SNARK which attests to knowledge of private inputs without revealing them.

Step 10

Generate UTXO ciphertext of for the receiver of the UTXOs (see section 4.19.1 of the Zcash Protocol Specification)

Step 11

Execute the TRANSFERNFT action of the ZEOS smart contract. This action takes the following arguments:

  • : The zero knowledge proof of satisfying arguments
  • : The public inputs of the zero knowledge proof
  • : The UTXO ciphertext which is transmitted to the receiver of

The ZEOS smart contract then performs the following checks:

  • Is the zero knowledge proof valid?
  • Is the NFT flag set ()?

Step 12

If , the ZEOS smart contract performs the following operations:

If , cancel execution.