{"ticket": {"type":"nft-reg","nft_ticket": bytes,// NFT ticket (encoded with base64), see below"version": integer,// version, 0 now"signatures": object,// signatures, see below"key1": string,// Unique key"key2": string,// Second unique key"creator_height": int,// Block height at which NFT Ticket was created// it is used to check if the SN that created // this ticket was indeed in the list of top 10 SN// at the moment of registration"total_copies": int,// Number of available copies in NFT"royalty": float,// Royalty %"royalty_address": string,// Address to pay royalty"green": boolean,// Indicate whether there green payment"storage_fee": int,// Registration fee, in PSL }}
Where nft_ticket is base64 encoding of the following JSON, as a string:
This JSON is created by WalletNode during the New NFT Registration process
{"nft_ticket_version": integer // 1"author": string,// PastelID of the author (creator)"blocknum": integer,// Block height at which NFT Ticket was created// it is used to check if the SN that created // this ticket was indeed in the list of top 10 SN// at the moment of registration"block_hash": bytes // Same as above, but block hash"copies": integer,// Number of available copies in NFT"royalty": float,// Royalty %"green": bool,// Indicate whether there green payment"app_ticket": bytes,// Application specific ticket data (as ascii85)}
Where app_ticket is ascii85 of the following JSON, as a string:
This JSON is created by WalletNode during the New Art Registration process
{"creator_name": string,"creator_website": string,"creator_written_statement": string,"nft_title": string,"nft_type": string,"nft_series_name": string,"nft_creation_video_youtube_url": string,"nft_keyword_set": string,"total_copies": integer,// number of copies, same as in NFT Ticket"preview_hash": bytes,// hash of the preview thumbnail !!!!SHA3-256!!!!"thumbnail1_hash": bytes,// hash of the thumbnail 1 !!!!SHA3-256!!!!"thumbnail2_hash": bytes,// hash of the thumbnail 2 !!!!SHA3-256!!!!"data_hash": bytes,// hash of the image (or any other asset) that this ticket represents !!!!SHA3-256!!!!// dupe detection and fingerprints files IDs, these IDs link ticket to data in P2P storage"dd_and_fingerprints_ic": integer,// initial value of the counter for dd_and_fingerprints files"dd_and_fingerprints_max": integer,// maximum number of dd_and_fingerprints files (current default is 50)"dd_and_fingerprints_ids": [list of strings],// list of IDs of dd_and_fingerprints files in Kademlia// raptorq ids files IDs, these IDs link ticket to data in P2P storage"rq_ic": integer,// initial value of the counter for rq_ids files"rq_max": integer,// maximum number of dd_and_fp files (current default is 50)"rq_ids": [list of strings],// list of IDs of of rq-ids files in Kademlia"rq_oti": [array of 12 bytes],// raptorq CommonOTI and SchemeSpecificOTI}
Dupe detection and fingerprints files and IDs
Dupe detection service - dd-service outputs data as json (dd_and_fingerprints) in the following format
{"block": string // block_hash from NFT ticket "principal": string // PastelID of the author from NFT ticket"dupe_detection_system_version": string,"is_likely_dupe": bool,"is_rare_on_internet": bool,"rareness_scores": {"combined_rareness_score": float,// 0 to 1"xgboost_predicted_rareness_score": float,// 0 to 1"nn_predicted_rareness_score": float,// 0 to 1"overall_average_rareness_score": float,// 0 to 1 },"internet_rareness": {"matches_found_on_first_page": uint32,"number_of_pages_of_results": uint32,"url_of_first_match_in_page": string, },"open_nsfw_score": float,// 0 to 1"alternative_nsfw_scores": {"drawings": float,// 0 to 1"hentai": float,// 0 to 1"neutral": float,// 0 to 1"porn": float,// 0 to 1"sexy": float,// 0 to 1 },"image_fingerprint_of_candidate_image_file": [float],// array with fingerprints values"fingerprints_stat": {"number_of_fingerprints_requiring_further_testing_1": uint32,"number_of_fingerprints_requiring_further_testing_2": uint32,"number_of_fingerprints_requiring_further_testing_3": uint32,"number_of_fingerprints_requiring_further_testing_4": uint32,"number_of_fingerprints_requiring_further_testing_5": uint32,"number_of_fingerprints_requiring_further_testing_6": uint32,"number_of_fingerprints_of_suspected_dupes": uint32, },"hash_of_candidate_image_file": string,"perceptual_image_hashes": {"pdq_hash": string,"perceptual_hash": string,"average_hash": string,"difference_hash": string,"neuralhash_hash": string, },"perceptual_hash_overlap_count": uint32,"maxes": {"pearson_max": float,// 0 to 1"spearman_max": float,// 0 to 1"kendall_max": float,// 0 to 1"hoeffding_max": float,// 0 to 1"mutual_information_max": float,// 0 to 1"hsic_max": float,// 0 to 1"xgbimportance_max": float,// 0 to 1 },"percentile": {"pearson_top_1_bps_percentile": float,// 0 to 1"spearman_top_1_bps_percentile": float,// 0 to 1"kendall_top_1_bps_percentile": float,// 0 to 1"hoeffding_top_10_bps_percentile": float,// 0 to 1"mutual_information_top_100_bps_percentile": float,// 0 to 1"hsic_top_100_bps_percentile": float,// 0 to 1"xgbimportance_top_100_bps_percentile": float,// 0 to 1 },}
WalletNode calculates IDs for dd_and_fingerprints_ids field of app_ticket as:
principalelement is created by WalletNode before sending ticket to SuperNodes for further processing
mn2 and mn3 elements are created by SuperNode 2 and SuperNode 3 respectfully
signature elements are created by cNode on the SuperNode 1 as part of cNode API call tickets register nft, and MUST not be passed into the call
Ticket is written into blockchain by the cNode API tickets register nft:
ticketsregisternft"nft_ticket""{signatures}""pastelid of MN 1""passphrase""key1""key2"fee
here,
key1 is unique human readable extract from fingerprints
key2 is anything else that can be used as secondary key
NFT Activation Ticket
Ticket representation inside blockchain:
"ticket": {"type":"nft-act","version": integer,// version of the blockchain representation of ticket, 0 now"pastelID": string,// PastelID of the creator"reg_txid": string,// tnx with registration ticket in it"creator_height": int,// block at which artist created Art Ticket, // is used to check if the MN that created art registration ticket was indeed the top MN when the artist created ticket
"storage_fee": int,// should match the storage fee from the Art Ticket"signature": bytes // Signature of the ticket created using the MasterNode's private key}
Ticket is written into the blockchain by the cNode API tickets register act:
"ticket": {"type":"nft-sell","version": integer,// version of the blockchain representation of ticket, 0 now"pastelID": string,// PastelID of the nft owner - either 1) the original creator; or 2) a previous buyer,// should be the same in either 1) art activation ticket or 2) trade ticket"nft_txid": int,// txid with either 1) art activation ticket or 2) trade ticket in it"copy_number": int,"asked_price": int,"valid_after": int,"valid_before": int,"signature": bytes}
Ticket is written into the blockchain by the cNode API tickets register sell:
"ticket": {"type":"nft-buy","version": integer,// version of the blockchain representation of ticket, 0 now"pastelID": string,//PastelID of the buyer"sell_txid": int,//txid with sale ticket"price": int,"signature": bytes},
Ticket is written into the blockchain by the cNode API tickets register buy:
"ticket": {"type":"nft-trade","version": integer,// version of the blockchain representation of ticket, 0 now"pastelID": string,// PastelID of the buyer"sell_txid": bytes,// txid with sale ticket"buy_txid": bytes,// txid with buy ticket"nft_txid": bytes,// txid with either 1) art activation ticket or 2) trade ticket in it"registration_txid": bytes,// txid of nft-reg ticket"copy_serial_nr": int,"signature":""},
Ticket is written into the blockchain by the cNode API tickets register trade: