אינטגרציה עם Dune Analytics API
Dune כבר מזמן הפסיק להיות רק כלי לניתוח ידני בדפדפן. עם השקת ה-Dune API, התאפשר להטמיע אנליטיקת on-chain ישירות לתוך המוצר שלך: דשבורדים, דוחות, התראות — ללא צורך בהקמת אינדקסר משלך וללא כתיבת SQL מאפס. כצוות הנדסי עם ניסיון באינטגרציה של למעלה מ-10 פרויקטים, אנחנו נתקלים כל הזמן בלקוחות שמביאים dump גולמי של עסקאות ורוצים לקבל במהירות מודול אנליטי עובד. ה-Dune API מציע פתרון מוכן לייצור עם עלויות תשתית מינימליות.
מה Dune API בעצם עושה
ה-API מספק שני תרחישים עיקריים: ביצוע שאילתה לפי ה-ID שלה (POST /execute/{queryId}) ושליפת תוצאות של הביצוע האחרון (GET /results/{queryId}). האפשרות השנייה זולה משמעותית בקרדיטים — אם הנתונים טריים מספיק, אין צורך להפעיל ביצוע חדש.
import requests, time DUNE_API_KEY = "your_api_key" QUERY_ID = 3540604 # пример: Uniswap V3 pool stats def get_query_results(query_id: int, params: dict = None) -> list[dict]: headers = {"X-Dune-API-Key": DUNE_API_KEY} # Запускаем выполнение с параметрами execute_resp = requests.post( f"https://api.dune.com/api/v1/query/{query_id}/execute", headers=headers, json={"query_parameters": params or {}} ) execution_id = execute_resp.json()["execution_id"] # Ждём завершения while True: status_resp = requests.get( f"https://api.dune.com/api/v1/execution/{execution_id}/status", headers=headers ) state = status_resp.json()["state"] if state == "QUERY_STATE_COMPLETED": break if state == "QUERY_STATE_FAILED": raise RuntimeError(f"Query failed: {status_resp.json()}") time.sleep(2) results = requests.get( f"https://api.dune.com/api/v1/execution/{execution_id}/results", headers=headers ) return results.json()["result"]["rows"] זמן ביצוע שאילתה טיפוסי: מ-5 שניות ועד מספר דקות. עבור מערכות ייצור, זה לא מקובל כקריאה סינכרונית — יש צורך בתוצאות שמורות במטמון או בעדכונים ברקע.
למה חשוב לשמור תוצאות Dune API במטמון
קרדיטים נצרכים עבור כל ביצוע שאילתה, לא עבור קריאת נתונים מהמטמון. אנחנו משתמשים בסכמה תלת-שכבתית:
- נתונים מ-24 השעות האחרונות מתעדכנים כל שעה באמצעות cron.
- נתונים היסטוריים (מעל 7 ימים) מתעדכנים פעם ביום.
- התוצאות נשמרות ב-Redis או PostgreSQL עם TTL השווה למרווח העדכון.
Dune גם מחזיר import requests, time DUNE_API_KEY = "your_api_key" QUERY_ID = 3540604 # пример: Uniswap V3 pool stats def get_query_results(query_id: int, params: dict = None) -> list[dict]: headers = {"X-Dune-API-Key": DUNE_API_KEY} # Запускаем выполнение с параметрами execute_resp = requests.post( f"https://api.dune.com/api/v1/query/{query_id}/execute", headers=headers, json={"query_parameters": params or {}} ) execution_id = execute_resp.json()["execution_id"] # Ждём завершения while True: status_resp = requests.get( f"https://api.dune.com/api/v1/execution/{execution_id}/status", headers=headers ) state = status_resp.json()["state"] if state == "QUERY_STATE_COMPLETED": break if state == "QUERY_STATE_FAILED": raise RuntimeError(f"Query failed: {status_resp.json()}") time.sleep(2) results = requests.get( f"https://api.dune.com/api/v1/execution/{execution_id}/results", headers=headers ) return results.json()["result"]["rows"] — אנחנו משתמשים בזה כחותמת זמן למטמון כדי להראות למשתמש את טריות הנתונים. גישה זו מבטיחה שהדשבורד שלך לא מפגר ולא שורף את המכסה שלך.
שאילתות עם פרמטרים: שימוש ב-SQL אחד לאלפי טוקנים
תכונה חזקה של Dune API היא פרמטריזציה. שאילתה בדפדפן יכולה להפוך לאוניברסלית באמצעות תחביר result_metadata.execution_started_at, וניתן להעביר ערכים דרך ה-API. זה מאפשר ל-SQL אחד לכסות, למשל, כל כתובת ERC-20:
SELECT date_trunc('day', block_time) AS day, sum(amount / 1e18) AS volume FROM erc20_ethereum.evt_Transfer WHERE contract_address = {{token_address}} AND block_time >= now() - interval '{{days}}' day GROUP BY 1 ORDER BY 1 DESC קריאה עם פרמטרים:
results = get_query_results( query_id=MY_QUERY_ID, params={"token_address": "0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2", "days": "30"} ) אנחנו נתקלים לעתים קרובות במצבים שבהם לקוח רוצה לראות אנליטיקה למאות טוקנים. פרמטריזציה מצמצמת את מספר השאילתות ל-Dune לתבנית אחת בלבד — אתה פשוט מציב כתובות בצד שלך.
השוואת תוכניות Dune API
| תוכנית | שאילתות בחודש | המלצה |
|---|---|---|
| חינם | 40 | רק לאב-טיפוס |
| Plus | 2000 | ייצור קטן (עד 5 דשבורדים) |
| Premium | 15000+ | פרויקטים בעומס גבוה הדורשים טריות נתונים |
עבור פרויקט טיפוסי עם דשבורד של 10–20 ווידג'טים, Plus מספיקה, אבל אנחנו תמיד ממליצים ללקוחות להתחיל עם Premium במהלך פיתוח פעיל כדי להימנע מחסימה על ידי מגבלות ברגע קריטי.
איך אנחנו מאיצים את האינטגרציה
הניסיון שלנו מראה שנקודות הכאב הגדולות ביותר הן מגבלות קצב (rate limits) והשהיה. אנחנו מגדירים את ספריית {{param}} עם מאגר חיבורים וניסיונות חוזרים. בייצור, אנחנו משתמשים בקריאה אסינכרונית דרך תור משימות (Celery / RabbitMQ): שאילתה חדשה נכנסת לתור, והמשתמש רואה את פרוסת המטמון האחרונה. משימת רקע בודקת מעת לעת אם יש צורך בעדכון.
אנחנו גם עוקבים אחר גרסאות ה-API — Dune מציגה מדי פעם שינויים שבירתיים (למשל, מעבר מ-v1 ל-v2). באינטגרציות שלנו, אנחנו כוללים שכבת מתאם (adapter) שמאפשרת מעבר בין גרסאות ללא שינוי בקוד הדשבורד.
מה כלול בעבודת אינטגרציית Dune API
- ניתוח דרישות הדשבורד ובחירת מדדים
- כתיבה ואופטימיזציה של שאילתות SQL עבור ה-API (תוך התחשבות במגבלות, פגינציה)
- הטמעת מטמון עם TTL ניתן להגדרה
- אינטגרציה עם הקצה האחורי (REST/gRPC/WebSocket) והקצה הקדמי (React/Vue)
- הגדרת עדכונים אוטומטיים באמצעות cron או תור משימות
- תיעוד שכבת ה-API עבור הצוות
- הדרכת המפתחים שלך על עבודה עם Dune API (1–2 מפגשים)
- אחריות תמיכה ל-30 יום לאחר המסירה
מגבלות ופתרונות עוקפים
מגבלות קצב: בתוכנית החינמית — 40 שאילתות בחודש, ב-Plus — 2000, ב-Premium — 15000+. לייצור עם משתמשים מרובים, Plus היא המינימום.
גודל תגובה: כברירת מחדל, מוחזרות עד 25,000 שורות. עבור מערכי נתונים גדולים יותר — השתמש בפגינציה באמצעות פרמטרים SELECT date_trunc('day', block_time) AS day, sum(amount / 1e18) AS volume FROM erc20_ethereum.evt_Transfer WHERE contract_address = {{token_address}} AND block_time >= now() - interval '{{days}}' day GROUP BY 1 ORDER BY 1 DESC ו-results = get_query_results( query_id=MY_QUERY_ID, params={"token_address": "0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2", "days": "30"} ) בבקשה לתוצאות.
השהיה: dune-client ללא ביצוע מחדש (תוצאות שמורות במטמון) חוזר מיידית. השתמש ב-endpoint זה עבור אינטגרציות עם קריאות קריאה מרובות והפעל ביצוע חדש רק על פי לוח זמנים.
אינטגרציה מאפס ועד דשבורד עובד עם מטמון — 1–2 ימים. אם יש לך דרישות ספציפיות (למשל, נתונים בזמן אמת דרך WebSocket), לוח הזמנים עשוי להתארך, אבל אנחנו תמיד מספקים הערכה מדויקת לאחר ביקורת חינמית של הפרויקט שלך. צור קשר כדי לדון בפרטים.







