Polymarket Bot 教程 · 第 6 章,共 32 章

Polymarket bot 认证与钱包设置:proxy wallet vs EOA、通过 SDK 生成 API key、Gnosis Safe 的 sigType 2、密钥存储最佳实践,以及从 Magic 迁移到 Privy。

本章内容

Polymarket 的钱包模型有三个部分:用于签名订单的 externally owned account(EOA)、保存资金的智能合约 proxy,以及用于验证 HTTP 请求的 Polymarket CLOB API key。把这三者正确连接起来,是新开发者在第 1 天最常见的失败原因;而在 2025 年 8 月 Magic Labs 迁移到 Privy 之后,这件事又变得更容易混淆。本章会按设置顺序逐一讲解每个部分,并给出生产代码所需的具体环境变量和签名类型标志。

  • Proxy wallet vs EOA:bot 应该用哪个
  • 生成 API key(SDK 步骤]
  • sigType 2 和 POLY_FUNDER_ADDRESS(Gnosis Safe)
  • 密钥存储:.env、vault、KMS
  • 从 Magic Labs 迁移到 Privy
  • 批准 USDC/pUSD 支出
  • 钱包恢复与备份

Proxy wallet vs EOA:bot 应该用哪个

Polymarket 使用智能合约 proxy wallet 模式。你的 EOA-也就是与你的私钥绑定的地址-负责签署交易和订单。部署在确定性地址上的 Gnosis Safe 持有实际的 pUSD 和 outcome shares。Proxy 地址会显示在 Polymarket UI 的 “wallet” 面板中;EOA 才是实际签名者。

对于 bot,你始终使用 EOA(环境变量中的 PRIVATE_KEY)进行签名,并在 CLOB client 配置中将 proxy 地址作为 POLY_FUNDER_ADDRESS 引用。如果把 EOA 当作 funder 来发送订单,即使 proxy 已经有资金,也会出现 “insufficient balance” 错误。

你不能只用 EOA 来做 bot-Polymarket 的 web 流程在注册时总会创建一个 proxy。可以通过 CLI 使用 polymarket wallet show 确认两个地址,或者在 Polymarket UI 的设置中读取 proxy 地址。

生成 API key(SDK 步骤]

CLOB API 需要三项凭证:keysecretpassphrase。这些不是你的钱包私钥-它们是一组绑定到你钱包的 HMAC 风格凭证,仅用于 HTTP 请求认证。

使用 SDK 一次性生成它们:

# Python
from py_clob_client.client import ClobClient
c = ClobClient(host="https://clob.polymarket.com", chain_id=137,
               key="<PRIVATE_KEY>", signature_type=2,
               funder="<PROXY_ADDRESS>")
creds = c.create_or_derive_api_creds()
print(creds.api_key, creds.api_secret, creds.api_passphrase)

将输出保存到 JSON 文件中,并在每次 bot 启动时加载;不要每个 session 都重新生成-API server 会缓存这组凭证,频繁轮换可能触发 rate-limit 逻辑。这些凭证不会自动过期。只有在你怀疑泄漏时才轮换它们。

sigType 2 和 POLY_FUNDER_ADDRESS(Gnosis Safe)

signature_type 参数控制 CLOB 如何验证你的订单签名。共有三个值;其中两个是实际使用的:

  • 0 / EOA:EOA 同时作为签名者和 funder。用于一些非常规设置,例如用户直接导入私钥的场景。
  • 1 / POLY_PROXY:旧版 Magic Labs proxy 合约。适用于大多数 2025 年之前的账户。
  • 2 / POLY_GNOSIS_SAFE:当前标准。资金在 Gnosis Safe 中,由 EOA 签名。

对于 2025 年 8 月之后创建的任何账户(Privy 迁移之后),或在 Polymarket UI 中能看到 Gnosis Safe 地址的任何账户,请使用 signature_type=2POLY_FUNDER_ADDRESS 环境变量必须是 Safe 地址,而不是 EOA。signature_type 与 funder 类型不匹配时,会静默地产生订单拒绝,看起来像 “insufficient allowance” 或 “balance: 0”-这个错误信息具有误导性。

密钥存储:.env、vault、KMS

EOA 私钥有三种合理的存储层级。

  1. .env 文件(单机开发)。文件存放在 VPS 上,bot 启动时读取,密钥不会离开主机。对于资产低于 <$1k 的钱包足够使用。chmod 600 .env,并确保仓库的 .gitignore 将其排除。
  2. 自托管 vault(HashiCorp Vault、age 加密文件或 systemd-creds)。在 bot 启动时增加一次解锁步骤。对于 $1k-$10k 区间的钱包值得使用。
  3. Cloud KMS(AWS KMS、GCP KMS)。bot 调用 KMS 在内存中解密密钥;密钥不会触碰磁盘。只有在超过 $10k 或用于多 bot fleet 时,这种额外的运维复杂度才值得。

绝对不要做的事:把私钥提交到 git,把它粘贴到聊天里,或者存到会同步到云服务、且不是仅本地模式的密码管理器中。Polymarket EOA 泄漏的链上影响范围,就是你全部的 pUSD 余额和 outcome share 库存。

从 Magic Labs 迁移到 Privy

2025 年 8 月,Polymarket 将其主要嵌入式钱包提供商从 Magic Labs 迁移到了 Privy。对 bot 来说,影响不大,但有一个明确差异。

迁移前的账户(通过 Magic 创建)通常使用 signature_type=1(POLY_PROXY)。迁移后的账户使用 signature_type=2(POLY_GNOSIS_SAFE)。有些用户迁移了旧账户;有些则保留了原始账户。无法通过公开 API 判断你的账户使用哪种类型-你需要尝试签名订单并观察拒绝结果来确认。

这次迁移还改变了 UI 展示 funder 地址的方式。旧版 Polymarket UI 流程会在仪表盘中显示 proxy 地址;当前流程则把它藏在账户设置里。无论账户何时创建,CLI 命令 polymarket wallet show 都是确认这两个值最干净的方式。

批准 USDC/pUSD 支出

为了让 CLOB 在订单成交时转移你的 pUSD,proxy 必须已经将 Polymarket 交易所合约批准为 spender。Polymarket UI 会在首次 deposit 时设置这些 approval。对于直接给 proxy 注资的 bot,你必须手动设置。

每个钱包只需设置一次的三个 approval:

  1. pUSD(ERC-20) → exchange contract
  2. Conditional Tokens(ERC-1155) → exchange contract(用于卖出 shares)
  3. Conditional Tokens(ERC-1155) → NegRisk exchange contract(用于卖出 NegRisk shares)

首次设置时,从 CLI 运行 polymarket approve。该交易只需花费几美分的 MATIC gas。使用 polymarket approve check 验证-三个都应返回 “approved.” 新开发者最常见的静默 bug 是遗漏 NegRisk approval,这个问题只会在从 multi-outcome market 卖出 shares 时失败,看起来像余额错误。

钱包恢复与备份

bot 的钱包有两个可恢复元素:EOA 私钥,以及 Polymarket 账户密码(它通过 web UI 限制访问,但不会通过 SDK 限制)。

EOA 私钥是对 bot 唯一重要的东西。丢失它,就等于丢失 proxy 中的一切。冷备份:写在纸上,装入信封密封,存放在异地。热备份:加密 USB 盘。绝不要发邮件给自己;也不要以未加密形式存到云存储中。

只要你仍然控制最初注册时使用的邮箱,Polymarket 账户密码可以通过 Magic Labs / Privy 的邮件恢复找回。它不会限制 bot 访问-bot 直接使用 EOA 私钥。

如果你怀疑密钥泄漏:立即 将 pUSD 和 outcome tokens 提到新钱包,生成新的 EOA,并使用新密钥重新部署 bot。泄漏的密钥无法撤销;它只能被清空。

常见问题

我的 bot 需要单独的钱包吗?
强烈建议需要。使用一个新的 EOA,或者一个全新的、仅由邮箱账户派生的 proxy wallet,并且只放入你分配给 bot 的资金。如果 bot 密钥泄漏,只有 bot 资金会面临风险-你的主资产仍然安全。
Polymarkets API 中的 sigType 2 是什么?
sigType 2 表示 Gnosis Safe(proxy wallet)签名,适用于你用 email/Google 登录并由 Polymarket 为你创建 proxy 的情况。对于 sigType 2,POLY_FUNDER_ADDRESS 环境变量必须是 PROXY 地址(也就是 Polymarket UI 中显示的那个),而不是底层 EOA。这是一个常见配置错误。
如何生成 Polymarket API key?
使用 SDK。Python 中:在通过钱包完成认证后,client.create_api_key() 会返回 ApiCreds。Node.js 中:通过 @polymarket/clob-client-v2 的 client.createApiKey() 方式类似。将返回的 key/secret/passphrase 保存到你的 .env 中(切勿提交到 git)。
Polymarket API key 可以撤销吗?
可以。你可以随时通过 SDK 派生新的 key;旧 key 会一直有效,直到通过 client.deleteApiKey(creds) 显式撤销。最佳实践是定期轮换密钥,并撤销任何在已受损机器上使用过的 key。
Polymarket 从 Magic Labs 迁移到 Privy 时发生了什么变化?
登录 OTP 代码从 3 位数(可被暴力破解,且在 2025 年 12 月的黑客事件中被利用)变成了更长的代码,并通过 Privy 增加了设备绑定。对 bot 来说,实际变化是认证流程-SDK 已经抽象掉了大部分细节。如果你的 bot 硬编码了 Magic Labs API endpoints(这种情况很少见),请更新为 Privy 流程。
我应该把密钥存到 .env 文件里吗?
对于单个 VPS 上的 bot-可以,但要设置正确的文件权限(chmod 600 .env,并由 bot 用户拥有)。对于多机器部署或生产级运维-请迁移到 secrets manager(AWS Secrets Manager、Vault、doppler.com)。永远不要把 .env 提交到 git。