UnsignedTransaction, SignedTransactionの構造体に、nft_dataと、nft_originを追加する。
nft_dataは、nftとして保存するデータ。
nft_originはnftを発行したトランザクションのhashデータ。
NFTを譲渡する場合は、nft_dataを空にして、nft_originに値を入れる。
#[derive(Serialize, Deserialize, Clone, Debug)] struct UnsignedTransaction { time: String, sender: String, receiver: String, amount: i32, nft_data: String, nft_origin: String, }
nft_holderというhashmapを作成して、そこにnftを発行したトランザクションのhashデータと、最後にNTFを譲渡されたreceiverの連想配列を入れていく。
誰が何を持っているかは、トランザクションのhashデータをデコードして、nft_dataの値を取り出す。
#[tokio::main] async fn main(){ let mut transaction_pool: Vec<SignedTransaction> = Vec::new(); let transaction1 = UnsignedTransaction {time:Utc::now().to_string(), sender:"047683c00f6z".to_string(), receiver:"DyH5SHvezz".to_string(), amount: 0, nft_data:"hello world".to_string(),nft_origin:"".to_string()}; let transaction2 = UnsignedTransaction {time:Utc::now().to_string(), sender:"DyH5SHvezz".to_string(), receiver:"655EFC80ss".to_string(), amount: 0, nft_data:"".to_string(),nft_origin:"eyJ0aW1lIjoiMjAyNS0wMS0xNyAwODoyOTo0Ni42NzgzNDU3OTQgVVRDIiwic2VuZGVyIjoiMDQ3NjgzYzAwZjZ6IiwicmVjZWl2ZXIiOiJEeUg1U0h2ZXp6IiwiYW1vdW50IjowLCJuZnRfZGF0YSI6ImhlbGxvIHdvcmxkIiwibmZ0X29yaWdpbiI6IiJ9".to_string()}; let transaction3 = UnsignedTransaction {time:Utc::now().to_string(), sender:"047683c00f6z".to_string(), receiver:"DyH5SHvezz".to_string(), amount: 0, nft_data:"Milk Cafe".to_string(),nft_origin:"".to_string()}; let transaction4 = UnsignedTransaction {time:Utc::now().to_string(), sender:"047683c00f6z".to_string(), receiver:"DyH5SHvezz".to_string(), amount: 1000, nft_data:"".to_string(),nft_origin:"".to_string()}; // println!("{}", BASE64_STANDARD.encode(serde_json::to_vec(&transaction1.clone()).unwrap())); // println!("{}", base64_decode(&str)); transaction_pool.push(sign_transaction(&transaction1)); transaction_pool.push(sign_transaction(&transaction2)); transaction_pool.push(sign_transaction(&transaction3)); transaction_pool.push(sign_transaction(&transaction4)); let nft_holder:HashMap<String, String> = nft_calc(transaction_pool); for (k, v) in nft_holder { let transaction_str = base64_decode(&k); let transaction:UnsignedTransaction = serde_json::from_str(&transaction_str).unwrap(); println!("保有者:{}, NFT:{}", v, transaction.nft_data); } } fn nft_calc(transaction_pool: Vec<SignedTransaction>) -> HashMap<String, String> { let mut nft_holder: HashMap<String, String> = HashMap::new(); for transaction in transaction_pool { if transaction.amount == 0 { let transaction_hash: String = BASE64_STANDARD.encode(serde_json::to_vec(&transaction.clone()).unwrap()); if transaction.nft_origin == "" && transaction.nft_data != "" && (nft_holder.get(&transaction_hash) == None) { nft_holder.insert(transaction_hash, transaction.receiver); } else if (nft_holder.get(&transaction_hash) == Some(&transaction.sender)) && transaction.nft_data == "" { nft_holder.insert(transaction.nft_origin, transaction.receiver); } } } return nft_holder }
Finished `dev` profile [unoptimized + debuginfo] target(s) in 2.13s
Running `target/debug/sample`
保有者:DyH5SHvezz, NFT:hello world
保有者:DyH5SHvezz, NFT:Milk Cafe
これは中々凄いな…