احتمالا براتون پیش اومده که وارد یک NFT مارکت شده باشید و دوست داشته باشید بدونید این ان اف تی خاص، بین چند نفر جا به جا یا Transfer شده است. برخی از مارکت ها اطلاعات ریز تراکنش های هر NFT را در همان وبسایت قرار می دهند اما برخی ها هم خیر. شاید یکی از دلایل آن، حجم بالای تراکنش های صورت گرفته روی هر قرارداد هوشمند است.
گزینه دوم پیش روی شما وبسایت Etherscan.io هست. این وبسایت امکان track کردن قراردادهای هوشمند NFT را برای ما راحت تر میکند. ابزار بسیار قدرتمندی است اما کافی نیست. وقتی می خواهید یک NFT را با id خاص بررسی کنید به مشکل میخورید گرچه امکان فیلتر کردن تراکنش ها را مبتنی بر event signature های خاص مثل Transfer یا Approve را فراهم میکند اما فیلترینگ جزیی تر را خیر! به خصوص اگر در فضای توسعه وب باشید و نیاز به ابزار غیر گرافیکی داشته باشید.
راه سوم استفاده از کتابخانه web3 هست. متاسفانه اغلب کتابخونه های web3 php، استیبل نیستند و امکانات webjs رو ندارن.
قطعا شما به دنبال راهی هستید تا هم لاگ های اتریوم را راحت تر دریافت کنید و هم با جزییات بیشتری به فیلترینگ اطلاعات آن بپردازید. کتابخونه Nft History Logs این امکان رو به شما میده که با استفاده از متد eth_getLogs ، با کمک endpoint هایی مثل alchemy یا infura یا هر شبکه ای که مورد نظر شماست، لاگ های یک آدرس خاص قرارداد هوشمند را دریافت کنید و بنا به event signature مورد نظر خودتون، فیلترینگ تراکنش ها را اعمال کنید.
ممکنه پرسش کنید که چرا نباید از sdk هایی مانند sdk alchemy به جای این کتابخونه استفاده کنیم، به چند دلیل مشخص:
1_ اغلب این sdk ها با جاوااسکریپت نوشته شدن
2_ این sdk ها تنها با شبکه اختصاصی خودشون کار میکنند مثلا sdk alchemy فقط با شبکه alchemy کار میکند و شاید دلخواه شما نباشد و عملا اختیار را از شما میگیرد.
3_ اغلب کتابخونه های web3 php استیبل نیستند و دارای مشکلات عدیده!
برای شروع استفاده از این کتابخونه، دستور زیر را بزنید تا نصب شود:
composer require nfthistory/nfthistorylogs v0 .0.1
حالا کتابخانه را وارد کنید و یک شی از کلاس آن بسازید:
<?php require "vendor/autoload.php" use Nft\History\nftHistory; $contractAdress = "0x7F0159D3A639a035797e92861d9F414246735568" $provider = "https://cloudflare-eth.com" $NftHistory = new nftHistory($contractAdress, $provider);
همانطور که میبینید این کلاس، دو متغییر پیش فرض در هنگام ساخت باید دریافت کند، یکی آدرس قرارداد هوشمند NFT مورد نطر شما و دیگری پروایدر یا همان Endpoint ای که می خواهید از آن استفاده کنید. هر دو باید از نوع string باشند.
در اینجا من از این قرارداد هوشمند kuddle Koala #6466 استفاده کردم. آدرس قرارداد هوشمندانه آن 0x7F0159D3A639a035797e92861d9F414246735568 و آیدی توکن آن 6466 است.
این توکن در در واقع بین دو نفر (دو آدرس) جا به جا شده است و معنای این جا به جایی چیزی نیست جز فروش ان اف تی به شخص دیگر. ما میدونیم ان اف تی ها، موجودیت های منحصر به فردی هستند در نتیجه ما یک توکن کادل کوآلا با آی دی 6466 بیشتر نداریم، مابقی ان اف تی ها دارای آی دی های متفاوتی اند.
با استفاده از شی ساخته شده خود و آی دی مورد نظر، تابع ()transferTrxById را فراخوانی می کنیم:
$res = $NftHistory->transferTrxById('6466', '0x0', 'latest'); var_dump($res); //output: Array ( [0] => Array ( [address] => 0x7f0159d3a639a035797e92861d9f414246735568 [topics] => Array ( [0] => 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef [1] => 0x0000000000000000000000000000000000000000000000000000000000000000 [2] => 0x0000000000000000000000005b436b7cc93d246d3a62fc7a95339f6fac7d2a4a [3] => 0x0000000000000000000000000000000000000000000000000000000000001942 ) [data] => 0x [blockNumber] => 0xcd2b8e [transactionHash] => 0xc95b6b17a8453526eba78592bf93b272f75e49b33487b986e81d19a1682eded6 [transactionIndex] => 0x1d [blockHash] => 0x69b72ae82a6e6f2de0750e23e30855cc727605b4c7b3c69814cbc0b3a51b19af [logIndex] => 0x23 [removed] => ) [1] => Array ( [address] => 0x7f0159d3a639a035797e92861d9f414246735568 [topics] => Array ( [0] => 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef [1] => 0x0000000000000000000000005b436b7cc93d246d3a62fc7a95339f6fac7d2a4a [2] => 0x000000000000000000000000cf0b56dfefa3e0051a1772fc585b076a06487c53 [3] => 0x000000000000000000000000000000000000000000000000000000000000194 ) [data] => 0x [blockNumber] => 0xcd3716 [transactionHash] => 0x62f59782cc17e5156fda51e27b121d5e9562b4f0d5455c5f04720aeb0a79eb07 [transactionIndex] => 0x10b [blockHash] => 0x8313bae0ff42ba4065bfb1524efb691a5c4c31cfe56defca4c095c803d4bbc3e [logIndex] => 0x210 [removed] => ) [2] => Array ( [address] => 0x7f0159d3a639a035797e92861d9f414246735568 [topics] => Array ( [0] => 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef [1] => 0x000000000000000000000000cf0b56dfefa3e0051a1772fc585b076a06487c53 [2] => 0x0000000000000000000000002e6469c5d4256c098ac51b9655dfb27d6f996a0c [3] => 0x0000000000000000000000000000000000000000000000000000000000001942 ) [data] => 0x [blockNumber] => 0xe703b0 [transactionHash] => 0x7b913e65751d493dc46746120e5c50587d183677a7e275535137995d017a438b [transactionIndex] => 0x16 [blockHash] => 0x4837a2daf412be2deebcae9b5c3ecb8a639f0b6e221193b56fe7f42ac79389a3 [logIndex] => 0x58 [removed] => ) )
خب همانطور که دیدید، خروجی این کار، یک شی با 3 تراکنش بود که شامل تراکنش mint ان اف تی و دو تراکنش بعدی هم، تراکنش های جا به جایی NFT ما هستند که مابین 3 نفر جا به جا شده است.
شما می توانید به هر کدام از property های این تراکنش ها دسترسی پیدا کنید و آن ها را تجزیه و تحلیل کنید.
به طور مثال بخش data، شامل مقدار اتر جا به جا شده بین دو آدرس در طی جا به جایی NFT است که این جا 0x است به معنای صفر یعنی هیچ اتری انتقال داده نشده. حواستان باشد این عدد در فرمت WEI هست که باید به اتر تبدیلش کنید. البته توابع دیگری هم جهت راحتی دریافت مقدار اتر جا به جا شده وجود دارد به طور مثال:
$transactionHash = '0x62f59782cc17e5156fda51e27b121d5e9562b4f0d5455c5f04720aeb0a79eb07'; $eventName = 'OrdersMatched'; $etherAmount = $NftHistory->nftTrxWei($transactionHash, $eventName); var_dump($etherAmount); //output array(1) { ['value']=> array(1) { [0]=> array(3) { ['buyHash']=> string(66) '0x0000000000000000000000000000000000000000000000000000000000000000' ['sellHash']=> string(66) '0243b8854fe6a9b124e13caed266c59d3cacc1ca4c3246a3cad5a094c53f6d0900' ['price']=> string(62) '0000000000000000000000000000000000000000000000009869529cdd4000' } } }
خب همونطور که از کد بالا مشخصه ما بر اساس مقدار هش تراکنش ، به اطلاعات sale یا همان فروش این ان اف تی دست یافتیم. حواستان باشد گزینه eventName$ اختیاری است در واقع به جای دریافت تمامی مقادیر اتر صورت گرفته روی این تراکنش، تنها مقدار sale آن را برگرداندیم.
به همین ترتیب، با مابقی توابع آن نیز می توانید کار کنید تا به نتایج دلخواه خود راحت تر دست پیدا کنید.
توابع این کتابخانه از اینجا
ممنون از توجهتون، سوالی اگر داشتید در کامنت پاسخگو هستم ^__^