חוזה חכם לשוק תחזיות (בסגנון Polymarket)

הפרוטוקול שלך ב-DeFi מאבד כספים בגלל פרצות בחוזי תחזיות? אנחנו בונים חוזים בסגנון Polymarket מאפס, ומבטלים סיכוני reentrancy ומניפולציות אורקל. הצוות שלנו מספק את הפרויקט במפתח מלא—מהארכיטקטורה ועד הביקורת והתמיכה השוטפת.

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

שאלות נפוצות

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

  • פיתוח אתר חברה B2B ADVANCE
    פיתוח אתר חברה B2B ADVANCE
    1481
  • פיתוח אפליקציית ווב עבור FEEDME
    פיתוח אפליקציית ווב עבור FEEDME
    1335
  • פיתוח אתר עבור BELFINGROUP
    פיתוח אתר עבור BELFINGROUP
    1034
  • פיתוח חנות מקוונת לחברת FURNORO
    פיתוח חנות מקוונת לחברת FURNORO
    1293
  • עיצוב לוגו לחברת B2B Advance
    עיצוב לוגו לחברת B2B Advance
    738
  • פיתוח אפליקציית ווב עבור Enviok
    פיתוח אפליקציית ווב עבור Enviok
    1031

אתה משיק פרוטוקול DeFi שבו משתמשים מהמרים על תוצאות אירועים — ממשחקי ספורט ועד מחיר ETH. הגרסה הראשונה של החוזה שלך ב-JavaScript עם Web3 נכשלת תחת עומס: כניסה חוזרת (reentrancy) ב-positionId, מניפולציה על אורקל מובילה לאובדן כספים, ועלות הגז ב-AMM חורגת ממגבלת הבלוק של 15 מיליון. נשמע מוכר? אנחנו כותבים חוזים כאלה מחדש מאפס.

איך שווקי תחזיות עובדים על בלוקצ'יין

כל שוק הוא זוג של טוקנים מותנים: YES ו-NO. משתמש מפקיד 1 USDC ומקבל 1 YES + 1 NO דרך מסגרת הטוקנים המותנים (CTF) של Gnosis. לאחר מכן הם מוכרים את התוצאה הלא רצויה ב-AMM או CLOB. לאחר ההכרעה, הטוקן הזוכה נפדה תמורת 1 USDC, והטוקן המפסיד תמורת 0.

מסגרת הטוקנים המותנים (CTF) — תקן ERC-1155 לטוקנים מותנים. כל תוצאה מיוצגת כפוזיציה עם // Gnosis CTF interface interface IConditionalTokens { function prepareCondition( address oracle, bytes32 questionId, uint outcomeSlotCount ) external; function reportPayouts( bytes32 questionId, uint[] calldata payouts ) external; function redeemPositions( IERC20 collateralToken, bytes32 parentCollectionId, bytes32 conditionId, uint[] calldata indexSets ) external; } ייחודי. בעת ההכרעה, CTF מאפשר פדיון של פוזיציות זוכות.

// Gnosis CTF interface
interface IConditionalTokens {
    function prepareCondition(
        address oracle,
        bytes32 questionId,
        uint outcomeSlotCount
    ) external;

    function reportPayouts(
        bytes32 questionId,
        uint[] calldata payouts
    ) external;

    function redeemPositions(
        IERC20 collateralToken,
        bytes32 parentCollectionId,
        bytes32 conditionId,
        uint[] calldata indexSets
    ) external;
}

AMM מול CLOB: מה לבחור לשוק שלך

פרמטר AMM (LMSR או Constant Product) CLOB (ספר הזמנות מרכזי)
ביזור מלא (תיאום על השרשרת) דורש מתאם מחוץ לשרשרת
מהירות מסחר תלויה בגז הבלוק מילישניות (תיאום מחוץ לשרשרת)
נזילות אוטומטית מספקי נזילות (LPs) תלויה בספר ובמרווח
עלות גז גבוהה (אקספוננציאלית ב-LMSR) נמוכה (רק סילוק)
מתאים ל פלטפורמות מבוזרות לחלוטין מסחר בתדירות גבוהה

Polymarket משתמש ב-CLOB למהירות. לשוק מבוזר לחלוטין, AMM עדיף. LMSR הוא אלגנטי מתמטית, אבל AMM עם Constant Product זול בכ-3x בגז — בחירה טובה לשווקים עם נזילות מאוזנת.

למה AMM עדיף לשוק מבוזר לחלוטין

LMSR (כלל ניקוד שוק לוגריתמי) — ה-AMM הקלאסי לשווקי תחזיות. המחיר תלוי בכמות הטוקנים YES ו-NO שנמכרו:

price_yes = e^(q_yes/b) / (e^(q_yes/b) + e^(q_no/b)) 

כאשר price_yes = e^(q_yes/b) / (e^(q_yes/b) + e^(q_no/b)) הוא פרמטר הנזילות. LMSR מבטיח שעושה השוק תמיד מקבל הימורים, וההפסד המקסימלי מוגבל על ידי b. AMM עם Constant Product (כמו Uniswap v2) פשוט יותר בגז, אבל המחירים פחות מדויקים קרוב ל-0% או 100%. אנחנו משתמשים ב-Constant Product מותאם עם מגבלת טווח מחירים [0.02, 0.98] — זה מגן מפני הפסדים אינסופיים בתוצאות קיצוניות.

אורקל והכרעה: איפה מסתתרת המורכבות העיקרית

שוק תחזיות ללא אורקל אמין הוא שוק עם ארביטראז' ידני, תמיד תחת איום. שלוש גישות:

  • Chainlink Data Feeds — לשווקים פיננסיים (מחיר ETH מעל $5000?). דטרמיניסטי, מבוזר, אבל מכסה רק פיננסים.
  • UMA Optimistic Oracle — לשאלות סובייקטיביות (תוצאת בחירות). הצעה + תקופת ערעור + ערעור דרך מחזיקי טוקן UMA. עיכוב של 2–48 שעות, אבל עובד לכל שאלה.
  • אורקל multisig מותאם אישית — קבוצה של גורמים מהימנים (5/9 multisig) מצביעים על התוצאה. מרכזי אבל שקוף ומהיר. לשווקים פרטיים.
contract PredictionMarket {
    struct Market {
        bytes32 conditionId;
        address oracle;
        uint256 endTime;
        uint256 resolutionTime;
        MarketStatus status;
        uint128 yesReserve;
        uint128 noReserve;
        uint256 totalVolume;
    }

    enum MarketStatus { Open, Closed, Resolved, Disputed }

    mapping(bytes32 => Market) public markets;

    // AMM pricing function
    function getPrice(bytes32 marketId, bool isYes) public view returns (uint256) {
        Market storage m = markets[marketId];
        uint256 yesR = m.yesReserve;
        uint256 noR = m.noReserve;
        // constant product: price_yes = noR / (yesR + noR) в fixed point
        return (noR * 1e18) / (yesR + noR);
    }
}

איך להגן מפני מניפולציות והתקפות

וקטור התקפה הגנה
מניפולציה על אורקל TWAP על פני 24–48 שעות + מקורות מרובים
Front-running של הכרעה הפסקת מסחר X שעות לפני ההכרעה
Griefing דרך ערעורי ספאם דרישת ערבות לערעורים
כניסה חוזרת במהלך פדיון Check-Effects-Interactions + ReentrancyGuard
conditionId שגוי בדיקה כפולה לפני פריסה
  • מניפולציה על אורקל. אם שוק נכרע על סמך מחיר על השרשרת ברגע מסוים, התקפת flash loan אפשרית. הגנה: TWAP על פני 24–48 שעות במקום מחיר ספוט, מקורות עצמאיים מרובים.
  • Front-running של הכרעה. מישהו לומד את התוצאה לפני ההכרזה הרשמית וקונה טוקנים במחירים ישנים. פתרון: הפסקת מסחר X שעות לפני ההכרעה.
  • Griefing דרך ערעורי ספאם. במערכות אורקל אופטימיות, תוקף מערער על כל הכרעה. הגנה: דרישת ערבות לערעורים (הערבות מופסדת אם הערעור נכשל).
  • כניסה חוזרת במהלך פדיון. CTF.redeemPositions מעביר טוקנים לפני עדכון מצב. השתמש ב-Check-Effects-Interactions + ReentrancyGuard.
  • conditionId שגוי. CTF משתמש ב-b * ln(2). ודא את conditionId פעמיים לפני פריסה.

ממשל ויצירת שווקים

מי יכול ליצור שווקים? אפשרויות:

  • עם הרשאות. רק מפעילים ברשימה לבנה. מרכזי אבל מגן מפני שווקי ספאם.
  • ללא הרשאות עם ערבות. כל מי שמשלם ערבות. הערבות מוחזרת בהכרעה נכונה.
  • ממשל DAO. הצבעה לכל שוק. איטי אבל מבוזר.

ל-MVP — עם הרשאות עם מפת דרכים ל-DAO.

ערימת הפיתוח

  • Foundry — הכלי העיקרי. בדיקות fuzz למתמטיקת AMM.
  • Gnosis CTF — השתמש ביישום המוכן.
  • Chainlink — אורקל לשווקים פיננסיים.
  • OpenZeppelin — AccessControl, ReentrancyGuard, Pausable.
  • Slither + Echidna — ניתוח סטטי ובדיקות מבוססות תכונות.
רשימה מלאה של שלבי העבודה
  1. עיצוב (3–5 ימים). בחירת AMM/CLOB, אסטרטגיית אורקל, מודל ממשל. מסמך לבן עם מתמטיקה.
  2. פיתוח חוזים (7–10 ימים). מפעל שווקים, לוגיקת AMM, אינטגרציית CTF. לכל מודול יש בדיקות יחידה.
  3. ביקורת ו-fuzzing (3–5 ימים). Fuzzer של Foundry, Echidna לבדיקת invariant, Slither על כל בסיס הקוד.
  4. Frontend ו-The Graph (5–7 ימים). Subgraph, TypeScript SDK, ממשק React.
  5. בדיקות על Testnet (3–5 ימים). מחזור מלא: יצירה → מסחר → הכרעה → פדיון.

ציר זמן כולל — מ-1–2 שבועות (חוזים בלבד) עד 4–6 שבועות (פלטפורמה מלאה).

מה כלול

  • תיעוד: מפרט טכני, מסמך לבן, מפרטי API.
  • קוד מקור של חוזים חכמים עם רישיון פתוח.
  • פריסה לרשת הנבחרת (Ethereum, Polygon, Arbitrum, BNB Chain).
  • ביקורת אבטחה עם דוח.
  • אינטגרציה עם frontend (אופציונלי) ו-subgraph של The Graph.
  • תמיכה טכנית למשך 3 חודשים לאחר הפריסה.

נעריך את הפרויקט שלך תוך 1–2 ימים. צור קשר כדי לדון בפרטים. קבל ייעוץ על הפרוטוקול שלך.