ניתוח נתוני און-צ'יין: עסקאות, יתרות, חוזים

ניתוח נתוני און-צ'יין (עסקאות, יתרות, חוזים) אתם מנסים לאחזר יתרות היסטוריות של ארנקי Ethereum, אבל `eth_getBalance` מחזיר רק את המצב הנוכחי? או שאתם צריכים לעקוב אחר עסקאות פנימיות בחוזים שאינן נראות בעסקאות רגילות? נתקלנו במשימות אלה...

שירותי פיתוח בלוקצ'יין

שאלות נפוצות

העבודות האחרונות

  • image_website-b2b-advance_0.webp
    פיתוח אתר חברה B2B ADVANCE
    1451
  • image_web-applications_feedme_466_0.webp
    פיתוח אפליקציית ווב עבור FEEDME
    1309
  • image_websites_belfingroup_462_0.webp
    פיתוח אתר עבור BELFINGROUP
    1005
  • image_ecommerce_furnoro_435_0.webp
    פיתוח חנות מקוונת לחברת FURNORO
    1270
  • image_logo-advance_0.webp
    עיצוב לוגו לחברת B2B Advance
    719
  • image_crm_enviok_479_0.webp
    פיתוח אפליקציית ווב עבור Enviok
    1011

ניתוח נתוני On-Chain (עסקאות, יתרות, חוזים)

אתם מנסים לאחזר יתרות ארנק Ethereum היסטוריות, אבל eth_getBalance מחזיר רק את המצב הנוכחי? או שאתם צריכים לעקוב אחר עסקאות פנימיות בחוזים שאינן נראות בעסקאות רגילות? נתקלנו במשימות אלה מאות פעמים ואנחנו יודעים כיצד לפתור אותן ביעילות. במקום להסתמך על Dune או Etherscan עם המגבלות שלהם, אתם יכולים לפרוס מנתח (Parser) משלכם שמעניק שליטה מלאה על נתונים, מהירות ועלות. אנו בונים פתרונות כאלה כבר למעלה מ-10 שנים (50+ פרויקטים שהושלמו), ובמאמר זה נסקור את ההיבטים המרכזיים של ניתוח נתוני on-chain: מבחירת מקור ועד אופטימיזציית אחסון. החיסכון בתשתית בגישה זו יכול להגיע ל-60%, כלומר חיסכון של עד $2,000 לחודש עבור פרויקטים עם נפח גבוה.

Ethereum JSON-RPC API — תיעוד רשמי שעליו מבוססות הדוגמאות להלן.

אילו סוגי נתונים ומקורות זמינים?

עסקאות ברמת בלוק (eth_getBlockByNumber עם fullTx: true): from/to/value/gas/gasPrice/nonce, נתוני קלט (calldata בהקס), קבלה (status, gasUsed, logs).

עסקאות פנימיות — קריאות בין חוזים, שאינן נראות בעסקאות רגילות. דורשות debug_traceTransaction או trace_block (מרחב trace של Erigon/OpenEthereum).

אירועים (logs) — נפלטים דרך emit Event(...) ב-Solidity, נגישים דרך eth_getLogs. הדרך היעילה ביותר היא סינון לפי כתובת + topic ברמת הצומת.

מצב אחסון — משתני אחסון של חוזה דרך eth_getStorageAt(address, slot, blockNumber). עם צומת ארכיון, בכל בלוק היסטורי.

יתרות ERC-20 — דרך קריאת view של balanceOf(address) או דרך היסטוריית אירועי Transfer.

טבלת השוואת מקורות
מקור מה הוא מספק מגבלות
RPC ציבורי (Infura/Alchemy) JSON-RPC סטנדרטי מגבלות קצב, ללא traces
Geth באירוח עצמי JSON-RPC מלא ללא traces ללא --gcmode=archive
Erigon באירוח עצמי JSON-RPC + מרחב trace ~2.5 TB, סנכרון של 3-5 ימים
Alchemy/QuickNode (תוכניות בתשלום) API מורחב + traces עלות ב-RPS גבוה
Firehose (StreamingFast) סטרימינג בינארי, נתונים מלאים התקנה מורכבת
Dune Analytics / Flipside ממשק SQL לנתונים מתועדים פיגור, מגבלות סכמה

Erigon באירוח עצמי מהיר פי 10 מ-Geth לניתוח traces ומתאים יותר לעומסים גבוהים.

כיצד לנתח עסקאות, אירועים ויתרות?

ניתוח עסקאות — מנתח בלוקים בסיסי עם אחזור קבלות:

import { createPublicClient, http } from 'viem'; const client = createPublicClient({ transport: http(RPC_URL), }); async function processBlock(blockNumber: bigint) { const block = await client.getBlock({ blockNumber, includeTransactions: true, }); for (const tx of block.transactions) { if (typeof tx === 'string') continue; const receipt = await client.getTransactionReceipt({ hash: tx.hash }); await db.insertTransaction({ hash: tx.hash, blockNumber: Number(tx.blockNumber), blockTimestamp: Number(block.timestamp), from: tx.from, to: tx.to, value: tx.value.toString(), gasPrice: tx.gasPrice?.toString(), gasLimit: tx.gas.toString(), input: tx.input, nonce: tx.nonce, status: receipt.status === 'success', gasUsed: receipt.gasUsed.toString(), }); } } 

ניתוח אירועים (Logs) — דוגמה ל-ERC-20 Transfer:

const logs = await client.getLogs({ address: TOKEN_ADDRESS, event: parseAbiItem('event Transfer(address indexed from, address indexed to, uint256 value)'), fromBlock: 19_000_000n, toBlock: 19_100_000n, }); for (const log of logs) { await db.insertTransfer({ txHash: log.transactionHash, blockNumber: Number(log.blockNumber), from: log.args.from, to: log.args.to, value: log.args.value.toString(), }); } 

מגבלה: טווח import { createPublicClient, http } from 'viem'; const client = createPublicClient({ transport: http(RPC_URL), }); async function processBlock(blockNumber: bigint) { const block = await client.getBlock({ blockNumber, includeTransactions: true, }); for (const tx of block.transactions) { if (typeof tx === 'string') continue; const receipt = await client.getTransactionReceipt({ hash: tx.hash }); await db.insertTransaction({ hash: tx.hash, blockNumber: Number(tx.blockNumber), blockTimestamp: Number(block.timestamp), from: tx.from, to: tx.to, value: tx.value.toString(), gasPrice: tx.gasPrice?.toString(), gasLimit: tx.gas.toString(), input: tx.input, nonce: tx.nonce, status: receipt.status === 'success', gasUsed: receipt.gasUsed.toString(), }); } } מוגבל ל-2000 בלוקים ברוב הצמתים הציבוריים. אנו מיישמים חלוקה אוטומטית למקטעים.

קבלת יתרות היסטוריות — השתמשו בצומת ארכיון עם const logs = await client.getLogs({ address: TOKEN_ADDRESS, event: parseAbiItem('event Transfer(address indexed from, address indexed to, uint256 value)'), fromBlock: 19_000_000n, toBlock: 19_100_000n, }); for (const log of logs) { await db.insertTransfer({ txHash: log.transactionHash, blockNumber: Number(log.blockNumber), from: log.args.from, to: log.args.to, value: log.args.value.toString(), }); } :

const historicalBalance = await client.readContract({ address: TOKEN_ADDRESS, abi: erc20Abi, functionName: 'balanceOf', args: [walletAddress], blockNumber: 18_500_000n, }); 

לשאילתות המוניות, השתמשו ב-multicall כדי לשלב עד 100 קריאות יתרה בבקשת RPC אחת, תוך הפחתת זמן של עד 90%.

ביצועים, אחסון ותמיכה בריבוי רשתות

לניתוח מלא של Ethereum: ~6500 בלוקים ליום × ~6000 עסקאות/בלוק = ~40 מיליון עסקאות ליום. כל אחת עם קבלות: ~1-5 KB. סה"כ: ~40-200 GB ליום. המנתחים שלנו מתמודדים עם עד 100,000 עסקאות בשנייה עם עיבוד אצווה אופטימלי.

המלצת אחסון: PostgreSQL + TimescaleDB לסדרות זמן + S3 לארכיון גולמי. אינדקסים מרכזיים: eth_getLogs, const historicalBalance = await client.readContract({ address: TOKEN_ADDRESS, abi: erc20Abi, functionName: 'balanceOf', args: [walletAddress], blockNumber: 18_500_000n, }); .

דוגמה לתצורת ריבוי רשתות:

import { multicall } from 'viem'; const balances = await client.multicall({ contracts: addresses.map(addr => ({ address: TOKEN_ADDRESS, abi: erc20Abi, functionName: 'balanceOf', args: [addr], })), allowFailure: true, }); 

אנו תומכים ביותר מ-20 רשתות תואמות EVM מחוץ לקופסה.

תהליך הפיתוח שלנו

  1. ניתוח דרישות ועיצוב סכמת נתונים.
  2. ארכיטקטורת מנתח ותצורת צומת.
  3. יישום עם בדיקות אוטומטיות.
  4. פריסה לתשתית שלכם (ענן או מקומי).
  5. ניטור וכיוונון ביצועים.

מה כלול בתוצרים

  • תיעוד ארכיטקטוני
  • קוד מקור מלא עם הערות
  • תשתית פרוסה
  • הדרכת צוות
  • 3 חודשי תמיכה לאחר הפריסה

עם למעלה מ-10 שנות ניסיון בפיתוח בלוקצ'יין ו-50+ פרויקטים מוצלחים, הצוות שלנו מביא מומחיות שאין שני לה. אנו מבטיחים דיוק נתונים עם יומני ביקורת מלאים. התמחור מתחיל מ-$3,000 למנתח בסיסי, עם חיסכון שוטף של עד 60% בהשוואה לשירותי אינדוקס של צד שלישי. החיסכון החודשי האופייני נע בין $1,000 ל-$5,000 בהתאם לנפח. צרו קשר לקבלת הצעת מחיר מותאמת.