آموزش Polymarket Bot · فصل 3 از 32

استک Polymarket bot خود را انتخاب کنید: Python (py-clob-client 0.34.6)، Node.js (@polymarket/clob-client-v2 v1.0.6)، یا Rust (بدون SDK رسمی، بر پایه ethers-rs). مزایا، معایب، latency، نمونه کد.

این فصل چه مواردی را پوشش می‌دهد

انتخاب زبان خیلی کم‌اهمیت‌تر از چیزی است که بیشتر سازندگان فکر می‌کنند. Polymarket همان endpoints REST و WebSocket را برای هر زبانی ارائه می‌دهد؛ انتخاب SDK بیشتر تعیین می‌کند که چقدر glue code باید خودتان بنویسید. Python و Node هر دو SDK رسمی و نگهداری‌شده دارند؛ Rust چنین چیزی ندارد، اما برای hot path کاملاً شدنی است. این فصل trade-offها را بررسی می‌کند، همان کار "fetch order book" را در هر زبان نشان می‌دهد تا تفاوت‌ها ملموس شود، و در پایان به یک mixed-stack pattern می‌رسد که در عمل اکثر botهای production به آن می‌رسند.

  • Decision framework
  • Python (default choice)
  • Node.js (full-stack devs)
  • Rust (latency-critical hot path)
  • Setup commands per stack
  • Code skeleton: fetch order book in 3 languages
  • When to mix stacks (Python control plane + Rust hot path)

Decision framework

سه سؤال، 90% انتخاب stack را مشخص می‌کنند.

  1. آیا یک skill موجود و قوی دارید؟ اگر هر روز Python می‌نویسید، bot را با Python بنویسید. اگر هر روز TypeScript می‌نویسید، bot را با Node بنویسید. تفاوت کیفیت SDKها در ادامه واقعی است، اما از هزینه جنگیدن با یک زبان ناآشنا کمتر است.
  2. آیا strategy به latency حساس است؟ اگر edge شما به واکنش در کمتر از 50ms وابسته است (بازارهای crypto پنج‌دقیقه‌ای، market-making هنگام خبر)، hot path از Rust یا Go سود می‌برد. بیشتر strategyها به این نیاز ندارند.
  3. آیا بیش از یک strategy اجرا می‌کنید؟ یک Python process واحد می‌تواند به‌راحتی 10-20 market را مدیریت کند. فراتر از آن، async Node یا Python با چند process جدا بهتر scale می‌شود.

default صادقانه برای bot اول، Python است. فقط وقتی محدودیت اندازه‌گیری‌شده شما را مجبور کرد، تغییر دهید.

Python (default choice)

Python default است چون SDK کامل‌تر است و iteration loop سریع‌تر است. py-clob-client در نسخه 0.34.6 (مه 2026) همه endpointهای مهم CLOB v2 را پوشش می‌دهد: market و limit order، انواع FOK/FAK/GTC، خواندن order book، خواندن balance/allowance، و عملیات مستقیم chain از طریق web3.py.

مزایا: SDK بالغ، data analysis آسان با pandas، community بزرگ، web3.py برای خواندن on-chain. معایب: ergonomics در async نسبت به JavaScript دست‌وپاگیرتر است، GIL سرعت‌گیری multi-core را محدود می‌کند (که برای botهای I/O-bound معمولاً مهم نیست)، زمان startup روی cold containerها کند است.

مناسب برای: 80% سازندگان. به‌خصوص هر کسی که strategy او شامل backtesting، statistical analysis، یا هر کار data دیگری در کنار execution باشد.

Node.js (full-stack devs)

Node.js دومین stack با پشتیبانی بهتر است. @polymarket/clob-client-v2 در نسخه 1.0.6 همان endpointهای Python SDK را با TypeScript types در سراسر آن پوشش می‌دهد. Async بومی و سریع است؛ handling مربوط به WebSocket عالی است.

مزایا: بهترین story برای async، TypeScript types بومی، ecosystem بزرگ برای HTTP + WS، deploy آسان روی همان Node runtime که dashboard وب هم از آن استفاده می‌کند. معایب: دقت عددی برای token IDهای بزرگ نیاز به BigInt یا handling به‌صورت string دارد (ERC-1155 IDها 256-bit هستند)، ابزارهای داده‌ای هم‌سطح pandas ضعیف‌ترند.

مناسب برای: سازندگانی که از قبل یک JavaScript stack را نگه می‌دارند و یک runtime می‌خواهند. همچنین هر کسی که هم‌زمان با bot یک dashboard می‌سازد - sharing typeها بین core bot و یک Next.js dashboard یک کلاس از bugها را حذف می‌کند.

Rust (latency-critical hot path)

Rust هیچ official Polymarket SDK ندارد. شما مستقیماً با V2 REST و WebSocket APIها با استفاده از reqwest (HTTP)، tokio-tungstenite (WebSocket)، و ethers-rs یا alloy برای signing کار می‌کنید. این یعنی حدود دو روز زمان setup در برابر 30 دقیقه در Python.

مزایا: EIP-712 signing بومی بدون subprocess جاوااسکریپت، ساخت order در sub-millisecond، memory profile قابل پیش‌بینی زیر load، بدون pause ناشی از GC. معایب: چون SDK وجود ندارد، باید چیزهایی را که Python کاربران رایگان می‌گیرند خودتان پیاده‌سازی کنید (parsing شناسه clobToken، اعتبارسنجی schema پاسخ، مدیریت salt/nonce). سود latency چیزی حدود 20-100ms نسبت به Python بهینه‌شده است، که فقط برای strategyهای زیر-ثانیه‌ای مهم می‌شود.

مناسب برای: hot path یک market-making bot، یا بخش اجرای معامله در یک news-arb bot. تقریباً هیچ‌وقت کل bot نیست.

Setup commands per stack

حداقل commandها برای رسیدن به یک signed order کارکردی روی mainnet (یک endpoint واحد CLOB v2).

Python:

python -m venv venv && source venv/bin/activate
pip install py-clob-client==0.34.6 web3 python-dotenv
# Set POLYGON_RPC, PRIVATE_KEY, POLY_FUNDER in .env

Node:

npm init -y
npm install @polymarket/[email protected] ethers dotenv
# Set POLYGON_RPC, PRIVATE_KEY, POLY_FUNDER in .env

Rust:

cargo new --bin pmt
cd pmt
cargo add tokio reqwest serde serde_json ethers alloy tungstenite tokio-tungstenite
# Hand-write signer + endpoint client; no SDK shortcut.

Time-to-first-order: حدود 10 دقیقه Python، 15 دقیقه Node، 4-8 ساعت Rust.

Code skeleton: fetch order book in 3 languages

همان task - دریافت order book برای یک Polymarket token - در هر stack. هر سه به همان CLOB v2 REST endpoint وصل می‌شوند.

Python (py-clob-client):

from py_clob_client.client import ClobClient
client = ClobClient(host="https://clob.polymarket.com", chain_id=137)
book = client.get_order_book("<token_id>")
print(book.bids[:3], book.asks[:3])

Node (@polymarket/clob-client-v2):

import { ClobClient } from "@polymarket/clob-client-v2";
const c = new ClobClient({ host: "https://clob.polymarket.com", chain: 137 });
const book = await c.getOrderBook("<token_id>");
console.log(book.bids.slice(0,3), book.asks.slice(0,3));

Rust (direct HTTP):

let url = format!("https://clob.polymarket.com/book?token_id={}", token);
let book: serde_json::Value = reqwest::get(&url).await?.json().await?;
println!("{:?} {:?}", &book["bids"][..3], &book["asks"][..3]);

ساختار پاسخ در هر سه یکی است. هزینه Rust تقریباً همه‌جای دیگر است - signing، ساخت order، error handling - نه در read path.

When to mix stacks (Python control plane + Rust hot path)

الگویی که بسیاری از botهای production به آن می‌رسند: Python برای هر چیزی که شامل تصمیم‌گیری است، Rust برای بخش اجرای میلی‌ثانیه‌ای.

معماری: یک Python process state بازار را می‌خواند، logic استراتژی را اجرا می‌کند، و یک فایل command کوچک (مثلاً {"action":"buy","token":"...","size":10,"price":0.45}) را به یک Unix socket می‌نویسد. یک Rust daemon روی آن socket listen می‌کند، order را sign می‌کند، و آن را به CLOB ارسال می‌کند. Python می‌تواند کند و راحت باشد؛ Rust daemon سریع و مینیمال است.

handoff کلید ماجراست: با جدا کردن مرحله signed-order، بودجه crash در Python بدون قربانی‌کردن latency بازیابی می‌شود. ما دقیقاً از همین pattern در botهای production خودمان استفاده می‌کنیم - Python intentionها را تولید می‌کند، یک Node daemon روی /tmp/clob.sock signing را انجام می‌دهد. نسخه Node این daemon برای زیر-100ms عالی است؛ Rust فقط زیر 50ms واقعاً ارزشش را نشان می‌دهد.

سوالات متداول

آیا py-clob-client با Polymarket V2 سازگار است؟
بله. py-clob-client 0.34.6 (نسخه‌ای که ما در production روی VPS خودمان تا مه 2026 اجرا می‌کنیم) با V2 سازگار است و با مهاجرت collateral به pUSD کار می‌کند. این package با "pip install py-clob-client" نصب می‌شود.
SDK رسمی Polymarket برای Node.js چیست؟
@polymarket/clob-client-v2 (در حال حاضر v1.0.6 تا مه 2026). "v2" در نام package مهم است - package قدیمی‌تر @polymarket/clob-client نسخه V1 است و برای پروژه‌های جدید توصیه نمی‌شود. نصب با "npm install @polymarket/clob-client-v2".
آیا SDK رسمی Polymarket برای Rust وجود دارد؟
خیر. تا مه 2026 هیچ Rust SDK رسمی از طرف Polymarket وجود ندارد. کاربران Rust مستقیماً با V2 REST و WebSocket APIها با استفاده از ethers-rs (برای EIP-712 signing) و reqwest یا hyper (برای HTTP/WS) کار می‌کنند. کد بیشتری لازم است، اما مزیت latency و concurrency برای market making مهم است.
آیا می‌توانم برای Polymarket bot از Go استفاده کنم؟
بله، از نظر فنی - Go کتابخانه‌های خوبی برای HTTP و Ethereum دارد (go-ethereum). SDK رسمی Go وجود ندارد، بنابراین مستقیم با REST API کار می‌کنید. ما Go را به‌اندازه Python یا Node.js برای Polymarket botها رایج نمی‌بینیم، اما کاملاً شدنی است.
اگر هم Python را بلدم و هم Node.js را، کدام را استفاده کنم؟
Python اگر strategy شما research-heavy است (pandas، NumPy، scikit-learn). Node.js اگر strategy شما real-time / event-driven است و می‌خواهید client و server با یک زبان باشند. هر دو به همان CLOB endpointها می‌رسند؛ هر دو برای هر strategy غیر-HFT به‌اندازه کافی سریع هستند.
آیا برای Node SDK به TypeScript نیاز دارم؟
اجباری نیست، اما توصیه می‌شود. @polymarket/clob-client-v2 با TypeScript types عرضه می‌شود، و گرفتن type errorها در زمان compile وقتی payloadهای EIP-712 signature یا order typeها اشتباه باشند، کلی debugging را کم می‌کند.
یک Polymarket bot چقدر باید سریع باشد؟
بیشتر strategyها در حد میلی‌ثانیه کافی‌اند، نه میکروثانیه. microstructure بازارهای ورزشی و market making از زیر-100ms سود می‌برند؛ news arbitrage تا 500-1000ms را هم تحمل می‌کند. Python را برای logic استراتژی استفاده کنید، و فقط اگر latency profiling نشان داد که برای edge شما مهم است، hot path را به Rust منتقل کنید.