Skip to main content
還沒有帳號?點擊這裡註冊 Polymarket 並完成入金,才能用錢包私鑰為訂單籤名、實際成交。
法律合規提醒:在使用 Polymarket 服務或 API 前,請確認您所在地區的法律規定。Polymarket 目前不支援比利時、法國、新加坡、泰國、中國大陸等地區,政策可能隨時變化。
Polymarket CLOB API 使用基於籤名的認證機制來驗證訂單和 API 請求。本指南將解釋不同的認證方法和籤名類型。

認證概述

CLOB 認證涉及兩個主要組件:
  1. API 憑據:用於認證 REST API 請求
  2. 訂單籤名:用於驗證訂單的真實性

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:從網站獲取

  1. 訪問 Polymarket.com
  2. 登錄您的帳戶
  3. 點擊右上角的個人資料圖片
  4. 複製顯示的地址

方法 2:通過 API 獲取

# Python
# 如果您不知道代理地址,可以先創建一個不帶 funder 的客戶端
temp_client = ClobClient(
    host="https://clob.polymarket.com",
    key=private_key,
    chain_id=137
)

# 然後查詢您的代理地址
# 注意:這需要您之前在 Polymarket 上創建過代理錢包

安全最佳實踐

重要安全提示
  1. 永遠不要共享私鑰
    • 私鑰等同於您的資金
    • 不要將私鑰提交到 Git
    • 使用環境變量存儲敏感信息
  2. 使用環境變量
    import os
    private_key = os.getenv('POLYMARKET_PRIVATE_KEY')
    proxy_address = os.getenv('POLYMARKET_PROXY_ADDRESS')
    
  3. 定期輪換 API 憑據
    • 如果懷疑洩露,重新生成憑據
  4. 限制 API 密鑰權限
    • 只授予必要的權限
  5. 使用 HTTPS
    • 始終通過 HTTPS 連接到 API

環境變量設置

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” 錯誤

原因
  1. 使用了錯誤的籤名類型
  2. 私鑰與代理地址不匹配
  3. 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” 錯誤

原因
  1. API 憑據未設置
  2. 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)

下一步