hadi mirzaie
hadi mirzaie
خواندن ۵ دقیقه·۲ سال پیش

رتبه بندی NFT ها بر مبنای میزان فروش با php

Bored Ape NFT
Bored Ape NFT

خب ما میدونیم NFT ها در لاگ اتریوم، تراکنش های با توکن آیدی خاص هستند. یعنی چی؟ یعنی ما به ازای هر توکن آیدی در قرار داد هوشمند، یک تراکنش Transfer وجود دارد که حاوی اطلاعات مختلف مرتبط با آن توکن خاص است. هر توکن، شامل مجموعه ای از لاگ های تراکنش Transfer است که هر تراکنش، مجموعه ای از log ها با event های مختلف را شامل می شود.

کل ساختار لاگ اتریوم، یک آرایه چند وجهی است که ما به ازای هر توکن، می توان به اطلاعات زیر مجموعه آن دست یافت. یکی از این اطلاعات، اطلاعات value تراکنش های هر توکن است. این value، در فرمت WEI است که متعاقبا می تواند آن را به اتر تبدیل کنید.

برای دسترسی راحت تر به لاگ های اتریوم در php، از کتابخانه Nft History Log استفاده میکنیم.

ابتدا با استفاده از دستور زیر، اقدام به نصب این کتابخانه کنید:

composer require nfthistory/nfthistorylogs v0.0.1

سپس کتابخانه را وارد کنید:

<?php require 'vendor/autoload.php' use Nft\History\nftHistory;

آدرس قرارداد هوشمند مورد نظر خود را تعیین کنید:

$contractAddress = '0x00B3e138c6e4b233e5DDed8CfeD200f0c82B536c'; $provider = 'https://cloudflare-eth.com';

بنده از قرارداد هوشمند 0x00B3e138c6e4b233e5DDed8CfeD200f0c82B536c استفاده کردم که متعلق به The Boy who lost his mind Open Edition by Boss Logic است. تعداد 82 عدد NFT بر روی این قرارداد هوشمند وجود دارد و در این مقاله، قصد داریم پر فروش ترین NFT های این قرارداد را لیست کنیم.

The Boy who lost his mind Open Edition by Boss Logic
The Boy who lost his mind Open Edition by Boss Logic

پروایدری که استفاده کردم، یک پروایدر مجانی از کلودفلر است. می توانید پروایدر خاص خودتان را با API KEY اختصاصی، جایگزین کنید.

در این مرحله، از کلاس nftHistory، یک شی بسازید:

$nfthistory = new nftHistory($contractAdress, $provider);

سپس تابع ()getAllTransferTrxHashAndIds را فراخوانی کنید:

$trxHash = $nfthistory->getAllTransferTrxHashAndIds();

این تابع، لیستی از تراکنش هش های نوع Transfer به تفکیک توکن آیدی، به ما می دهد.

خروجی این تابع چیزی شبیه آرایه زیر است:

$filterData = array_map(function($log) use($nfthistory){ return array_map(function($logs) use($nfthistory){ $result = $nfthistory->getTrxByHash($logs); if($result['value'] !== '0x0&quot){ $logs = $result['value']; return $logs; } },$log); },$trxHash);

حالا ما مجموعه از توکن آیدی ها را داریم که هر کدام حاوی تراکنش هش های نوع Transfer یک NFT خاص هستند. عدد 19400010233 همان توکن آیدی است و مقدار string به طول 66 کاراکتر با فرمت hexadecimal هم همان تراکنش هش است. حالا ما از طریق این تراکنش هش، باید به قیمت معامله شده هر توکن آیدی در آن تراکنش خاص دست پیدا کنیم. سپس تمامی این مقادیر متعلق به هر NFT را با هم جمع بزنیم و آن ها را رتبه بندی کنیم.

پس بیایید این آرایه خروجی گرفته را فیلتر کنیم:

array(82){ [19400010074]=> array(4) { [0]=> NULL [1]=> NULL [2]=> NULL [3]=> string(17) &quot'0x12dfb0cb5e88000&quot } [19400010323]=> array(2) { [0]=> NULL [1]=> NULL } } ... if($result['value'] !== &quot0x0''){ $logs = $result['value']; return $logs; } },$log); },$trxHash);

در کد بالا، ابتدا با استفاده از array_map ، آرایه خود را درون یک حلقه انداختیم تا فیلترینگ را به صورت خروجی گرفته شده بر روی آرایه اعمال کنیم. در درون این حلقه، باز از طریق array_map حلقه درونی ایجاد کردیم تا به مقدار هر تراکنش هش در زیر مجموعه تکون آیدی دست پیدا کنیم. سپس با استفاده از کتابخانه Nft History Log، تابع ()getTrxHash را فراخوانی میکنیم تا بتوانیم به مقدار معامله شده هر تراکنش دست پیدا کنیم.

خروجی این تابع، یک آرایه چند وجهی است. ایندکس value برای ما اهمیت دارد زیرا مقدار hex جا به جا شده در فرمت WEI است. یک شرط هم میگذاریم که آن مقادیر صفر (0X0) نادیده گرفته شوند. در این مرحله، شما باید چیزی شبیه زیر، می شود خروجی کار شما:

array(82){ [19400010074]=> array(4) { [0]=> NULL [1]=> NULL [2]=> NULL [3]=> string(17) '0x12dfb0cb5e88000' } [19400010323]=> array(2) { [0]=> NULL [1]=> NULL } } ...

همانطور که میبینید، کلیدهای این آرایه همان توکن آیدی های ماست که حفظ شان کردیم و مقادیر آن برابر است با قیمت تراکنش هر توکن. آن هایی که NULL هستند به معنی این است که فروخته نشدند یا جا به جایی شان برابر با صفر اتر بوده!

حالا این آرایه فیلتر شده که حاوی قیمت فروش هر توکن آیدی در هر تراکنش است را دوباره فیلتر میکنیم به این شکل:

$res = array_map(function($log) use($nfthistory){ $sum = array_sum(array_map('hexdec',$log)); $nftSumPrice = $nfthistory->weiToEther($sum); return $nftSumPrice; },$filterData);

خب در قطعه کد بالا ما مقادیر قیمتی هر توکن را در صورتی که حاوی بیش از یک تراکنش فروش بودند را با هم جمع زدیم تا مجموع فروش هر توکن آیدی به دست بیاید. سپس با استفاده از تابع ()weiToEther ، جمع مقادیر را از فرمت WEI به فرمت Ether در آوردیم. مجموع قیمت را برگرداندیم.

خروجی این کد چیزی شبیه این است:

// output: array(82) { [19400010233]=> string(4) '0.00' [19400010322]=> string(4) '0.00' [19400010042]=> string(4) '0.00' [19400010113]=> string(4) '0.00' [19400010074]=> string(4) '0.08' } ...

حالا ما مجموعه ای از قیمت های فروش را داریم به علاوه آن هایی که اصلا فروش نرفتند. می توانیم مقادیر صفر را حذف کنیم اما ترجیح دادم جهت قیاس بهتر، آن ها را نگه دارم.

حالا با استفاده از تابع زیر، این آرایه را از مقادیر بیشتر به مقادیر کمتر دسته بندی کنید:

arsort($res);

حالا خروجی بگیرید تا بتوانید پرفروش ترین NFT ها را شناسایی کنید:

array(82) { [19400010142]=> string(4) '0.40' [19400010060]=> string(4) '0.25' [19400010127]=> string(4) '0.21' [19400010159]=> string(4) '0.19' [19400010303]=> string(4) '0.15' [19400010055]=> string(4) '0.12' [19400010429]=> string(4) '0.11' [19400010236]=> string(4) '0.11' [19400010400]=> string(4) '0.10' [19400010136]=> string(4) '0.09' } ...

خروجی بالا 10 خروجی پرفروش هستند. برای این که مطمئن شویم خروجی ما درست است کافی است که به این صفحه بروید تا اولین توکن آیدی (19400010142) را جست و جو کنیم. در بخش سرچ آن را جست و جو کنید تا تراکنش های معامله شده توکن ما را نمایش دهد.

Transfer Trxs of a token id
Transfer Trxs of a token id

همانطوری که از بخش تراکنش ها مشخص است، این توکن آیدی دو بار معامله شده است، روی هر کدام از تراکنش هش ها کلیک کنید در بخش value، مقدار معامله شده را می توانید ببینید. تراکنش نخست، 0.4 اتر است و تراکنش دوم 0 اتر. مجموع همانی است که در آرایه پرفروش ما آمده است.

تلاش میکنم همان روش رو به مرور به عنوان تابع از پیش آماده، به کتابخونه اضافه کنم، در حال حاضر می توانید از همین روش استفاده کنید.

مابقی توابع کتابخونه از اینجا

ممنون از توجهتون، اگر سوالی داشتید در کامنت پاسخگو هستم ^__^





NFTphpsmart contractقرارداد هوشمنداتریوم
مسترربیت هستم برنامه نویس، طراح سایت، علاقه مند به بلاک چین ... میخونم و گاهی مینویسم و شاید سخت ترین کار دنیا رو هم گاهی انجام بدم ... می اندیشم !!!!
شاید از این پست‌ها خوشتان بیاید