مرحباً، أنا Mike Kuykendall — أكثر من 20 عاماً كمهندس برمجيات، رقيب أول سابق في القوات الجوية الأمريكية، أب لطفلين، والآن الشخص وراء Delta Zero Labs (@_MikeKuykendall على X).
لسنوات عشت حياة RPC. تريد كل تحويل ERC20 لمحفظة ضخمة منذ 2020؟ قم بتشغيل سكريبت يكرر eth_getLogs مع نطاقات 10,000 بلوك، تعامل مع حدود المعدل، أعد المحاولة عند 429، قسّم الصفحات، أزل التكرار، فك تشفير ABI بنفسك، خزنه في مكان ما... وكرر ذلك لتبادلات DEX، تحديثات oracle، والتصفيات.
مشروع عطلة نهاية أسبوع واحد تحول إلى فاتورة Alchemy بقيمة 400 دولار شهرياً وعقدة أرشيف بسعة 14 TB تلتهم SSD الخاص بي. أقسمت أنه يجب أن تكون هناك طريقة أفضل.
وهي موجودة.
قمت ببناء (وأبيع الآن) مجموعات بيانات Parquet بجودة الإنتاج، مفككة بالكامل، من genesis إلى tip لـ بلوكتشين الإيثريوم الرئيسي، BSC، وSepolia. تنزيل واحد. ملف واحد (أو مجموعة مقسمة نظيفة). صفر RPCs للأبد. استعلم عن 7.77 مليار حدث BSC أو 334 مليون حدث Sepolia في ثوانٍ على جهاز الكمبيوتر المحمول الخاص بك باستخدام DuckDB أو Polars.
هذا ليس مفهرساً آخر أو subgraph. هذه هي البيانات التي كنت ستستخرجها بنفسك — ولكنها منجزة بالفعل، مفككة، مصنفة حسب signal_type، مضغوطة، وجاهزة للامتلاك للأبد.
في هذا المنشور، أقدم لك الشرح التفصيلي الذي كنت أتمنى أن أحصل عليه قبل عامين. بحلول النهاية ستعرف بالضبط كيفية:
دعونا نقضي على ضريبة RPC معاً.
فحص سريع للواقع (أنت تعرف هذا بالفعل، لكن دعونا نحدد الألم):
لقد تعبت منه. لذلك كتبت محرك استخراج صفر-RPC (Fused Semantic Execution المعلق براءة اختراعه — FSE). يقرأ بيانات على السلسلة الأولية مرة واحدة، يفك شفرة كل حدث في أعمدة نظيفة، يضع علامة عليه بـ signal_type، ويفرغه مباشرة إلى Parquet.
النتيجة؟ مجموعات بيانات مثل:
كلها مسلمة كـ Parquet. عمودي، مضغوط بشكل جنوني (أصغر بـ 5-10 مرات من CSV)، جاهز لـ predicate pushdown، يعمل مع كل أداة بيانات حديثة.
كل صف هو حدث واحد مفكك. إليك الأعمدة الأساسية التي ستستخدمها كل يوم (المواصفات الكاملة لـ 19 عموداً موجودة في مستندات التنزيل):
صف واحد = سجل واحد واضح تماماً وجاهز للتحليل. لا فك تشفير ABI في الكود الخاص بك مرة أخرى أبداً.
انتقل إلى العينة الرسمية:
https://huggingface.co/datasets/MikeKuykendall/ethereum-signals-sample
أو مرآة Kaggle: https://www.kaggle.com/datasets/mikekuykendall/ethereum-onchain-signals
قم بتنزيل ملف Parquet (حوالي 5-10 MB، 10,000 صف مقسم يغطي كل signal_type).
أوصي بـ DuckDB — إنه سحري لهذا الغرض.
pip install duckdb pandas pyarrow
# أو فقط brew install duckdb على Mac
افتح دفتر Jupyter أو فقط DuckDB CLI.
Python + Pandas (للاستكشاف الصغير)
import pandas as pd
df = pd.read_parquet("ethereum_signals_sample.parquet")
print(df.shape) # (10000, 19)
print(df['signal_type'].value_counts())
print(df.head())
DuckDB SQL (هنا يحدث السحر — ذاكرة صفر للملفات الضخمة)
-- Launch DuckDB
duckdb
-- Attach the sample
SELECT * FROM read_parquet('ethereum_signals_sample.parquet') LIMIT 10;
"كم عدد تحويلات ERC20 التي قام بها هذا العنوان؟"
SQL
SELECT COUNT(*) as transfers,
SUM(amount) as total_volume
FROM read_parquet('your_full_dataset.parquet')
WHERE from_address = '0x1234...'
OR to_address = '0x1234...'
AND signal_type = 'ERC20_Transfer';
"أفضل 10 رموز من حيث عدد التحويلات في 2024"
SQL
SELECT contract_address,
COUNT(*) as tx_count
FROM read_parquet('your_full_dataset.parquet')
WHERE signal_type = 'ERC20_Transfer'
AND timestamp >= 1704067200 -- Jan 1 2024
AND timestamp < 1735689600 -- Jan 1 2025
GROUP BY contract_address
ORDER BY tx_count DESC
LIMIT 10;
"جميع مقايضات Uniswap V3 لمجمع محدد، مع تأثير السعر"
SQL
SELECT timestamp,
amount0,
amount1,
sqrtPriceX96,
(amount1::double / NULLIF(amount0,0)) as price_impact
FROM read_parquet('full_dataset.parquet')
WHERE signal_type = 'UniswapV3_Swap'
AND contract_address = '0x88e6a0c2ddd26feeb64f039a2c41296fcb3f5640' -- USDC/ETH 0.05%
ORDER BY block_number DESC
LIMIT 1000;
"تحديثات سعر Chainlink لـ ETH/USD بمرور الوقت" (مثالي للاختبار الرجعي)
SQL
SELECT
date_trunc('day', to_timestamp(timestamp)) as day,
AVG(price) as avg_eth_price
FROM read_parquet('full_dataset.parquet')
WHERE signal_type = 'Chainlink_PriceUpdate'
AND contract_address = '0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419' -- ETH/USD
GROUP BY day
ORDER BY day;
نصيحة احترافية: DuckDB يمكنه قراءة المجلدات المقسمة أيضاً:
SQL
SELECT COUNT(*) FROM read_parquet('mainnet_parquets/*.parquet');
يستخدم تلقائياً predicate pushdown — التصفية على block_number أو signal_type تتخطى 99% من البيانات على القرص. ستستعلم عن مليارات الصفوف بشكل أسرع من معظم الناس عند تصفح Twitter.
ملاحظة التخزين: مجموعة BSC الكاملة كبيرة لكنها قابلة للضغط وتعمل بشكل جيد على جهاز بذاكرة RAM سعة 64 GB. لسير العمل الأكبر، قم فقط بتشغيل صندوق Hetzner رخيص بذاكرة RAM سعة 128 GB وسيظل DuckDB يتفوق على مستودعات البيانات السحابية من حيث التكلفة.
قال لي أحد المشترين: "ألغيت خطة RPC بقيمة 1,200 دولار شهرياً في نفس اليوم الذي وصلت فيه مجموعة البيانات."
النهجالتكلفةالسرعة لتاريخ 3 سنواتالصيانةالملكيةحلقات RPC الأولية200-2000 دولار شهرياًساعات-أيامثابتةأنت تعيد البناءSubgraphs/The Graphمجاني-مدفوعسريع لكن غير مكتملمخاطرة مزودلااستخراج Cryo الذاتيوقتك + عقدةأيام للاستخراجمستمرنعمDelta Zero Parquetمرة واحدة 999+ دولارثوانٍصفرللأبد
أول 1,000 مشترٍ على الشبكة الرئيسية/BSC يحصلون على خصم 25% مع الكود EARLY25 عند الدفع.
أسئلة؟ راسلني على X @_MikeKuykendall أو انضم إلى قناة Telegram المرتبطة على الموقع. أجيب على كل واحد — هذه عملية فردية مملوكة لمحارب قديم وأهتم فعلاً بأن تنجح مع البيانات.
توقف عن دفع إيجار للبيانات التي يجب أن تكون ملكك.
قم بتنزيل العينة. قم بتشغيل الاستعلامات. ثم لا تستدعي eth_getLogs آخر مرة أخرى أبداً.
أراك على السلسلة (دون اتصال).
— Mike Kuykendall Delta Zero Labs ملاحظة: الإصدار التالي من السلسلة قادم قريباً. تريد وصولاً مبكراً + أنواع إشارات مخصصة؟ راسلني.
تم نشر I Ditched RPC Hell for Good: Your Complete Genesis-to-Tip Parquet Handbook for Lightning-Fast… في الأصل في Coinmonks على Medium، حيث يواصل الناس المحادثة من خلال تسليط الضوء على هذه القصة والرد عليها.


