สวัสดีครับ ผมชื่อ Mike Kuykendall — วิศวกรซอफต์แวร์มากกว่า 20 ปี อดีตจ่าสิบเอก USAF พ่อของเด็กสองคน และตอนนี้เป็นคนที่อยู่เบื้องหลัง Delta Zero Labs (@_MikeKuykendall บน X)
เป็นเวลาหลายปีที่ผมใช้ชีวิตกับ RPC ต้องการทุก ERC20 transfer สำหรับกระเป๋าเงินวาฬตั้งแต่ปี 2020 หรือ? เริ่มสคริปต์ที่วนลูป eth_getLogs ด้วยช่วงบลอก 10,000 บลอก จัดการข้อจำกัดอัตรา ลองใหม่เมื่อเจอ 429s แบ่งหน้า ลบข้อมูลซ้ำ ถอดรหัส ABI ด้วยตัวเอง เก็บมันไว้ที่ไหนสักแห่ง... ล้างและทำซ้ำสำหรับ DEX swaps, oracle ticks, liquidations
โปรเจ็กต์สุดสัปดาห์หนึ่งกลายเป็นบิล Alchemy $400 ต่อเดือนและ archive node 14 TB ที่กิน SSD ของผม ผมสาบานว่าต้องมีวิธีที่ดีกว่านี้
มีจริงๆ
ผมสร้าง (และตอนนี้ขาย) ชุดข้อมูล Parquet ระดับ production ที่ถอดรหัสอย่างสมบูรณ์จาก genesis ถึง tip สำหรับ Ethereum mainnet, BSC และ Sepolia ดาวน์โหลดครั้งเดียว ไฟล์เดียว (หรือชุดที่แบ่งพาร์ติชันอย่างสะอาด) ไม่ต้องใช้ RPCs อีกต่อไป สืบค้น 7.77 พันล้านเหตุการณ์ BSC หรือ 334 ล้านเหตุการณ์ Sepolia ภายในไม่กี่วินาทีบนแล็ปท็อปของคุณด้วย DuckDB หรือ Polars
นี่ไม่ใช่ indexer หรือ subgraph อีกตัวหนึ่ง นี่คือข้อมูลที่คุณควรจะดึงเองมาแล้ว — แต่ทำเสร็จแล้ว ถอดรหัสแล้ว จัดประเภทตาม signal_type บีบอัดแล้ว และพร้อมที่จะเป็นเจ้าของตลอดไป
ในโพสต์นี้ ผมจะให้คำแนะนำทีละขั้นตอนที่ชัดเจนซึ่งผมอยากได้เมื่อสองปีก่อน ท้ายที่สุดคุณจะรู้อย่างแม่นยำว่าจะ:
มาฆ่าภาษี RPC ด้วยกันเถอะ
ตรวจสอบความเป็นจริงอย่างรวดเร็ว (คุณรู้อยู่แล้ว แต่มาวัดความเจ็บปวดกัน):
ผมเบื่อมันจริงๆ ดังนั้นผมจึงเขียน zero-RPC extraction engine (patent-pending Fused Semantic Execution — FSE) มันอ่านข้อมูลเชนดิบครั้งเดียว ถอดรหัสทุกเหตุการณ์เป็นคอลัมน์ที่สะอาด ติดแท็กด้วย signal_type และถ่ายโอนตรงไปยัง Parquet
ผลลัพธ์? ชุดข้อมูลเช่น:
ทั้งหมดส่งมอบเป็น Parquet แบบคอลัมน์ บีบอัดอย่างไร้สาระ (เล็กกว่า CSV 5–10 เท่า) พร้อม 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 notebook หรือแค่ 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 transfers กี่ครั้ง?"
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 swaps ทั้งหมดสำหรับ pool เฉพาะ พร้อม price impact"
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 price ticks สำหรับ ETH/USD เมื่อเวลาผ่านไป" (สมบูรณ์แบบสำหรับ backtesting)
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 box ราคาถูกด้วย RAM 128 GB และ DuckDB ยังคงดีกว่า cloud warehouses ในเรื่องค่าใช้จ่าย
ผู้ซื้อคนหนึ่งบอกผมว่า: "ผมยกเลิกแผน RPC $1,200 ต่อเดือนในวันเดียวกับที่ชุดข้อมูลมาถึง"
วิธีการค่าใช้จ่ายความเร็วสำหรับประวัติ 3 ปีการบำรุงรักษาความเป็นเจ้าของRaw RPC loops$200–2000/เดือนชั่วโมง–วันคงที่คุณสร้างใหม่Subgraphs/The Graphฟรี–ชำระเงินเร็วแต่ไม่สมบูรณ์ความเสี่ยงผู้ให้บริการไม่Cryo self-extractเวลาของคุณ + nodeวันในการดึงข้อมูลอย่างต่อเนื่องใช่Delta Zero Parquetครั้งเดียว $999+วินาทีศูนย์ตลอดไป
ผู้ซื้อ 1,000 คนแรกบน mainnet/BSC ได้รับส่วนลด 25% ด้วยโค้ด EARLY25 ที่เช็คเอาท์
มีคำถาม? DM ผมบน X @_MikeKuykendall หรือเข้าร่วมช่อง Telegram ที่เชื่อมโยงบนเว็บไซต์ ผมตอบทุกคำถาม — นี่คือการดำเนินงานเดี่ยวที่เป็นเจ้าของโดยทหารผ่านศึกและผมใส่ใจจริงๆ ที่คุณจะชนะด้วยข้อมูล
หยุดจ่ายค่าเช่าสำหรับข้อมูลที่ควรเป็นของคุณ
ดาวน์โหลดตัวอย่าง รันคิวรี จากนั้นอย่าเรียก eth_getLogs อีกครั้ง
เจอกันบนเชน (ออฟไลน์)
— Mike Kuykendall Delta Zero Labs ปล. chain drop ถัดไปจะมาเร็วๆ นี้ ต้องการการเข้าถึงก่อนใคร + signal types ที่กำหนดเอง? DM ผม
I Ditched RPC Hell for Good: Your Complete Genesis-to-Tip Parquet Handbook for Lightning-Fast… ถูกตีพิมพ์ครั้งแรกใน Coinmonks บน Medium ซึ่งผู้คนกำลังสนทนาต่อโดยการเน้นและตอบกลับเรื่องราวนี้


