אנו מפתחים מערכות הימורים מבוזרות על הבלוקצ'יין: מטוטאליזטורים פשוטים ועד שווקי CLOB מלאים עם טוקנים מותנים. Polymarket כבר מעבדת מאות מיליוני דולרים בהיקף הימורים על אירועים פוליטיים דרך Polygon עם USDC כמטבע סליקה—וכל המערכת מסתמכת על חוזים חכמים עם תוצאות מותנות. האתגר המרכזי בבניית פלטפורמה כזו אינו מנגנון ההימורים, אלא קביעת התוצאות בצורה דטרמיניסטית ומאובטחת. הניסיון שלנו כולל למעלה מ-30 חוזים שנפרסו בסביבת production על Ethereum, Polygon ו-Arbitrum. לצוות שלנו יש ניסיון של 5+ שנים בפיתוח בלוקצ'יין ואנו מספקים פתרונות DeFi מאז 2019.
שאלת האורקל — האתגר ההנדסי המרכזי
לא ניתן לקבל תוצאה של אירוע כמו "ביידן מנצח בבחירות" מ-Chainlink Price Feed. זה לא ערך מספרי עם קונצנזוס מבוזר—זו שיפוט. עבור מערכות חיזוי, משמעות הדבר היא בחירה בין מספר גישות לקביעת תוצאות.
UMA Optimistic Oracle
UMA משתמשת במודל אופטימי: כל אחד יכול להציע תוצאה, ומשתתף אחר יכול לערער עליה. ערעור מפעיל מנגנון פתרון סכסוכים באמצעות הצבעה של מחזיקי UMA. הביטחון הכלכלי מסתמך על ערבות: המציע מפקיד ערבות ב-USDC או UMA, אשר אובדת אם ההכרעה שגויה. UMA Optimistic Oracle מבטיחה ביטחון באמצעות תמריצים כלכליים—כמתואר בתיעוד הרשמי.
אינטגרציה עם UMA:
import "@uma/core/contracts/optimistic-oracle-v3/interfaces/OptimisticOracleV3Interface.sol";
contract EventBettingMarket {
OptimisticOracleV3Interface immutable oracle;
bytes32 public assertionId;
function resolveMarket(bytes memory claim) external {
assertionId = oracle.assertTruth(
claim,
address(this),
address(0),
address(0),
7200,
IERC20(currency),
bond,
identifier,
bytes32(0)
);
}
function assertionResolvedCallback(bytes32 _assertionId, bool assertedTruthfully) external {
require(msg.sender == address(oracle));
if (assertedTruthfully) {
_settleWinners();
} else {
_refundBettors();
}
}
}היתרון של UMA: זולה עבור רוב השווקים (ללא הצבעה כשאין ערעור), אך כאשר יש ערעור, היא איטית פי 10 מ-Chainlink.
Chainlink לתוצאות מספריות
שימו לב: כאשר התוצאה מספרית, Chainlink AggregatorV3Interface היא הבחירה הנכונה: דטרמיניסטית, ללא חלון ערעור.
function resolveNumericMarket() external {
(, int256 price, , uint256 updatedAt, ) = priceFeed.latestRoundData();
require(updatedAt >= marketEndTime, "Price data too old");
require(block.timestamp >= marketEndTime, "Market not ended");
bool outcomeA = price >= int256(targetPrice);
_settleMarket(outcomeA);
}בעיה קריטית: Chainlink מעדכנת נתונים על בסיס סף סטייה או heartbeat—לא בשנייה ספציפית. עליכם לבדוק במפורש את import "@uma/core/contracts/optimistic-oracle-v3/interfaces/OptimisticOracleV3Interface.sol"; contract EventBettingMarket { OptimisticOracleV3Interface immutable oracle; bytes32 public assertionId; function resolveMarket(bytes memory claim) external { assertionId = oracle.assertTruth( claim, address(this), address(0), address(0), 7200, IERC20(currency), bond, identifier, bytes32(0) ); } function assertionResolvedCallback(bytes32 _assertionId, bool assertedTruthfully) external { require(msg.sender == address(oracle)); if (assertedTruthfully) { _settleWinners(); } else { _refundBettors(); } } } ולהיות עם גיבוי ל-Pyth או UMA.
גישת Multi-Oracle לסביבת Production
עבור שווקים קריטיים עם היקפים מעל $1M—אגדו מספר מקורות:
| אורקל | סוג תוצאה | זמן השהיה | עלות |
|---|---|---|---|
| Chainlink | מספרי (מחיר) | ~שעה | נמוכה |
| Pyth Network | מספרי (מחיר) | שניות | נמוכה |
| UMA Optimistic | כללי | שעתיים+ | בינונית |
| API3 dAPI | מספרי (נתונים מדרגה ראשונה) | דקות | נמוכה |
| Multisig מותאם | כל סוג | מיידי | 0 (אמון) |
עבור תוצאות ספורט, UMA + multisig רזרבי עם timelock הוא אופטימלי—כקו הגנה אחרון.
איך לבחור את מודל חלוקת הזכיות?
יחסים קבועים (Fixed Odds) — מיושן עבור DeFi
היחסים נקבעים בעת יצירת השוק. הסוכנות נושאת בסיכון אם ההערכה שגויה. קשה ליישם על השרשרת ללא תמחור מחדש מרכזי.
Parimutuel — הסטנדרט להימורים בבלוקצ'יין
כל ההימורים נכנסים למאגר אחד. הזוכים מתחלקים במאגר באופן יחסי. היחסים נקבעים לפי החלוקה הסופית. Parimutuel זול פי 2–3 בגז לכל פעולה מ-CLOB. ב-Ethereum, הימור Parimutuel טיפוסי עולה ~50,000 גז, בעוד הימור CLOB עולה ~150,000 גז.
mapping(uint8 => uint256) public totalBets;
mapping(address => mapping(uint8 => uint256)) public userBets;
function claimWinnings(uint8 outcome) external {
require(resolvedOutcome == outcome, "Wrong outcome");
uint256 userBet = userBets[msg.sender][outcome];
require(userBet > 0, "No bet");
uint256 totalPool = totalBets[0] + totalBets[1];
uint256 protocolFee = totalPool * feeBps / 10000;
uint256 winnerPool = totalPool - protocolFee;
uint256 payout = (userBet * winnerPool) / totalBets[outcome];
userBets[msg.sender][outcome] = 0;
IERC20(currency).transfer(msg.sender, payout);
} CLOB — גישה מתקדמת
Polymarket משתמשת בטוקנים מותנים (ERC-1155). כל תוצאה היא טוקן, והשוק נסחר דרך CLOB עם פקודות limit. יתרון: גילוי מחירים אמיתי, נזילות מצטברת. מורכבות: ספר פקודות off-chain + סליקה on-chain.
| תכונה | Parimutuel | CLOB |
|---|---|---|
| גילוי מחירים | לא (יחסים לאחר המאגר) | כן (שוק אמיתי) |
| נזילות | מאגר יחיד | צבירת פקודות |
| מורכבות חוזה | נמוכה | גבוהה (מנוע התאמה) |
| גז לכל הימור | 50k–100k גז | 150k–300k גז |
הגנה על הימורים מפני Front-Running
כדי להגן על הימורים מפני front-running, אנו משתמשים בסכמת commit-reveal: תחילה ה-hash של ההימור, ולאחר מכן חשיפה לאחר N בלוקים. עבור הימורי ספורט, אנו נועלים את ההימורים 5 דקות לפני האירוע באמצעות function resolveNumericMarket() external { (, int256 price, , uint256 updatedAt, ) = priceFeed.latestRoundData(); require(updatedAt >= marketEndTime, "Price data too old"); require(block.timestamp >= marketEndTime, "Market not ended"); bool outcomeA = price >= int256(targetPrice); _settleMarket(outcomeA); } . זה מונע מניפולציות ברגע האחרון.
למה UMA Optimistic Oracle עדיפה לתוצאות ספורט?
UMA תומכת בטענות שרירותיות, מה שאידיאלי לספורט ופוליטיקה. Chainlink Price Feed מספקת רק נתונים מספריים. UMA זולה יותר לשווקים ללא ערעורים, והערבות מגנה מפני הכרעות לא ישרות. עלות הכרעה ממוצעת היא $50–$200 כשאין ערעור.
יצירה וניהול שווקים: תבנית Factory
כל שוק הוא חוזה נפרד הנפרס דרך factory. זה מבודד סיכונים.
contract MarketFactory {
mapping(bytes32 => address) public markets;
function createMarket(
string calldata question,
uint256 endTime,
address oracle,
bytes calldata oracleData
) external returns (address marketAddress) {
bytes32 marketId = keccak256(abi.encode(question, endTime, oracle));
require(markets[marketId] == address(0), "Market exists");
BettingMarket market = new BettingMarket(
question,
endTime,
oracle,
oracleData,
feeBps
);
markets[marketId] = address(market);
emit MarketCreated(marketId, address(market), question, endTime);
return address(market);
}
} השעיית חירום והחזרים
אם האורקל לא יכול להכריע את התוצאה (אירוע בוטל), מנהל החירום (multisig) קורא ל-updatedAt, וכל המשתתפים מושכים את הפיקדונות. Timelock על ביטול—מינימום 24 שעות.
ערימת הפיתוח
חוזים: Solidity 0.8.24 + OpenZeppelin (AccessControl, Pausable, ReentrancyGuard) + Foundry לבדיקות. הבדיקות כוללות fork tests עם UMA ו-Chainlink אמיתיים על Polygon mainnet. עבור טוקנים מותנים—Gnosis Conditional Tokens Framework. Off-chain: The Graph subgraph, GraphQL API.
תהליך העבודה
- אנליטיקה (2–3 ימים). סוגי אירועים, מודל זכיות, אורקלים, רגולציה, שרשראות.
- עיצוב (3–5 ימים). ארכיטקטורת חוזים, אינטגרציה, הכרעה, חירום.
- פיתוח (3–8 שבועות). מ-MVP של Parimutuel ועד CLOB עם טוקנים מותנים.
- ביקורת (Audit). חוזי הימורים הם בעדיפות גבוהה לביקורת בשל ניהול כספים. עלות הביקורת מתחילה ב-$15,000 בהתאם למורכבות.
לוחות זמנים ועלויות
- Parimutuel עם Chainlink — 1–2 שבועות (עלות מ-$5,000).
- UMA + Factory + The Graph — 6–10 שבועות (עלות מ-$15,000).
- CLOB עם טוקנים מותנים — 3–5 חודשים (עלות מ-$50,000).
תוצרים
- קוד מקור של חוזים עם כיסוי בדיקות מלא (Foundry).
- אינטגרציה עם האורקלים הנבחרים (Chainlink, UMA, Pyth).
- תיעוד API ו-The Graph subgraph.
- דוח ביקורת משותפים (HashEx או CertiK).
- הכשרה לצוות שלכם ו-3 חודשי תמיכה טכנית.
- גישה ל-repository פרטי ב-Git וסקריפטים לפריסה.
אנו מבטיחים חוזה חכם מבוקר במלואו עם גישת multi-oracle המשלבת Chainlink (נתונים מספריים) ו-UMA (תוצאות). זה מפחית את ההסתברות להכרעה שגויה ל-0.01%. לצוות שלנו ניסיון של למעלה מ-5 שנים והוא סיפק יותר מ-30 חוזי production. צרו קשר לייעוץ—נעריך את הפרויקט שלכם תוך יומיים. הזמינו פיתוח מערכת הימורים על בלוקצ'יין וקבלו גישת demo לחוזים שלנו.







