法律合規提醒:在使用 Polymarket 服務或 API 前,請確認您所在地區的法律規定。Polymarket 目前不支援比利時、法國、新加坡、泰國、中國大陸等地區,政策可能隨時變化。
Polymarket CLOB API 使用基於籤名的認證機制來驗證訂單和 API 請求。本指南將解釋不同的認證方法和籤名類型。
認證概述
CLOB 認證涉及兩個主要組件:
- API 憑據:用於認證 REST API 請求
- 訂單籤名:用於驗證訂單的真實性
API 憑據
創建 API 憑據
API 憑據用於認證對 CLOB 的 HTTP 請求。
# Python
from py_clob_client.client import ClobClient
client = ClobClient(
host="https://clob.polymarket.com",
key=private_key,
chain_id=137
)
# 創建或派生 API 憑據
api_creds = client.create_or_derive_api_creds()
client.set_api_creds(api_creds)
print(f"API Key: {api_creds['apiKey']}")
print(f"API Secret: {api_creds['apiSecret']}")
print(f"API Passphrase: {api_creds['apiPassphrase']}")
// TypeScript
import { ClobClient } from '@polymarket/clob-client';
import { ethers } from 'ethers';
const wallet = new ethers.Wallet(privateKey);
const client = new ClobClient('https://clob.polymarket.com', 137, wallet);
// 創建或派生 API 憑據
const apiCreds = client.createOrDeriveApiCreds();
await client.setApiCreds(apiCreds);
console.log(`API Key: ${apiCreds.apiKey}`);
console.log(`API Secret: ${apiCreds.apiSecret}`);
console.log(`API Passphrase: ${apiCreds.apiPassphrase}`);
API 憑據的工作原理
API 憑據基於您的私鑰派生,確保:
- 唯一性:每個錢包地址有唯一的憑據
- 安全性:憑據可以從私鑰重新派生
- 持久性:相同的私鑰總是生成相同的憑據
籤名類型
Polymarket 支援三種籤名類型,取決於您如何創建帳戶:
Type 0: EOA(外部擁有帳戶)
用於直接使用以太坊錢包地址交易的高級用戶。
# Python
client = ClobClient(
host="https://clob.polymarket.com",
key=private_key,
chain_id=137
# 不指定 signature_type 和 funder,默認為 EOA
)
// TypeScript
const client = new ClobClient(
'https://clob.polymarket.com',
137,
wallet
// 不指定 signatureType 和 funder,默認為 EOA
);
特點:
- 直接控制資金
- 需要設置 USDC 授權
- 適合有經驗的用戶
Type 1: Poly Proxy(Magic/Email 登錄)
用於通過電子郵件或 Magic Link 登錄的用戶。
# Python
client = ClobClient(
host="https://clob.polymarket.com",
key=private_key,
chain_id=137,
signature_type=1,
funder=proxy_address # 您的代理錢包地址
)
// TypeScript
const client = new ClobClient(
'https://clob.polymarket.com',
137,
wallet,
1, // signatureType
proxyAddress // 您的代理錢包地址
);
特點:
- 最簡單的登錄方式
- 無需手動設置授權
- 適合大多數用戶
Type 2: Poly Gnosis Safe(瀏覽器錢包)
用於通過 MetaMask、Coinbase Wallet 等瀏覽器錢包登錄的用戶。
# Python
client = ClobClient(
host="https://clob.polymarket.com",
key=private_key,
chain_id=137,
signature_type=2,
funder=proxy_address
)
// TypeScript
const client = new ClobClient(
'https://clob.polymarket.com',
137,
wallet,
2,
proxyAddress
);
特點:
訂單籤名
訂單必須使用 EIP-712 籤名進行籤署,以證明您授權該訂單。
EIP-712 籤名
EIP-712 是一種標準化的籤名格式,使訂單:
- 可讀:錢包可以顯示您正在籤署的內容
- 安全:防止籤名重放攻擊
- 標準化:符合以太坊標準
訂單籤名流程
# Python
from py_clob_client.clob_types import OrderArgs
from py_clob_client.order_builder.constants import BUY
# 1. 創建訂單參數
order_args = OrderArgs(
price=0.55,
size=100.0,
side=BUY,
token_id="YOUR_TOKEN_ID"
)
# 2. 客戶端自動籤署訂單
signed_order = client.create_order(order_args)
# 3. 提交已籤名的訂單
response = client.post_order(signed_order, OrderType.GTC)
籤名的訂單包含:
- 訂單數據:價格、數量、方向等
- 籤名:EIP-712 籤名
- Nonce:防止重放的唯一數字
- 到期時間:訂單的有效期
獲取代理地址
方法 1:從網站獲取
- 訪問 Polymarket.com
- 登錄您的帳戶
- 點擊右上角的個人資料圖片
- 複製顯示的地址
方法 2:通過 API 獲取
# Python
# 如果您不知道代理地址,可以先創建一個不帶 funder 的客戶端
temp_client = ClobClient(
host="https://clob.polymarket.com",
key=private_key,
chain_id=137
)
# 然後查詢您的代理地址
# 注意:這需要您之前在 Polymarket 上創建過代理錢包
安全最佳實踐
重要安全提示:
-
永遠不要共享私鑰
- 私鑰等同於您的資金
- 不要將私鑰提交到 Git
- 使用環境變量存儲敏感信息
-
使用環境變量
import os
private_key = os.getenv('POLYMARKET_PRIVATE_KEY')
proxy_address = os.getenv('POLYMARKET_PROXY_ADDRESS')
-
定期輪換 API 憑據
-
限制 API 密鑰權限
-
使用 HTTPS
環境變量設置
Python 示例
創建 .env 文件:
# .env
POLYMARKET_PRIVATE_KEY=your_private_key_here
POLYMARKET_PROXY_ADDRESS=your_proxy_address_here
POLYMARKET_SIGNATURE_TYPE=1
使用 python-dotenv:
from dotenv import load_dotenv
import os
load_dotenv()
client = ClobClient(
host="https://clob.polymarket.com",
key=os.getenv('POLYMARKET_PRIVATE_KEY'),
chain_id=137,
signature_type=int(os.getenv('POLYMARKET_SIGNATURE_TYPE')),
funder=os.getenv('POLYMARKET_PROXY_ADDRESS')
)
TypeScript 示例
創建 .env 文件:
# .env
POLYMARKET_PRIVATE_KEY=your_private_key_here
POLYMARKET_PROXY_ADDRESS=your_proxy_address_here
POLYMARKET_SIGNATURE_TYPE=1
使用 dotenv:
import * as dotenv from 'dotenv';
dotenv.config();
const client = new ClobClient(
'https://clob.polymarket.com',
137,
new ethers.Wallet(process.env.POLYMARKET_PRIVATE_KEY!),
parseInt(process.env.POLYMARKET_SIGNATURE_TYPE!),
process.env.POLYMARKET_PROXY_ADDRESS
);
常見認證錯誤
”Invalid Signature” 錯誤
原因:
- 使用了錯誤的籤名類型
- 私鑰與代理地址不匹配
- NegRisk 市場需要特殊標誌
解決方案:
# 確認籤名類型
# Magic/Email: signature_type=1
# Browser Wallet: signature_type=2
# 對於 NegRisk 市場
order_args = OrderArgs(
price=0.55,
size=100.0,
side=BUY,
token_id="YOUR_TOKEN_ID",
negrisk=True # 添加這個標誌
)
“Unauthorized” 錯誤
原因:
- API 憑據未設置
- API 憑據已過期
解決方案:
# 重新創建並設置 API 憑據
api_creds = client.create_or_derive_api_creds()
client.set_api_creds(api_creds)
“Insufficient Allowance” 錯誤(僅 EOA)
原因:
USDC 授權額度不足
解決方案:
需要在鏈上批准 Polymarket 合約使用您的 USDC。詳見官方文檔。
驗證認證設置
# Python: 驗證設置的腳本
def verify_authentication(client):
try:
# 1. 檢查 API 憑據
api_creds = client.create_or_derive_api_creds()
client.set_api_creds(api_creds)
print("✓ API 憑據設置成功")
# 2. 嘗試獲取餘額
balance = client.get_balance()
print(f"✓ 認證成功,餘額: {balance}")
# 3. 嘗試獲取訂單
orders = client.get_orders()
print(f"✓ 可以訪問訂單,當前活躍訂單: {len(orders)}")
return True
except Exception as e:
print(f"✗ 認證失敗: {e}")
return False
# 使用
verify_authentication(client)
下一步