Polymarket底层算法全面解析

数字货币趋势狂人18 小时前
可能是推特上唯一一篇一次性用大白话讲清楚所有Polymarket底层设计的文章。

原作:@MrRyanChi,@insidersdotbot 预测市场交易平台创始人

序言:你不知道的 Polymarket B面

在过去的六个月间,推特上出现了数亿千计的预测市场文章。其中90%是再讲AI写程序怎么带来暴富神话。这是“缘”,是你接触这个刚刚开始的市场的第一步。

另外9%讲的是具体的交易策略,市场分享,聪明钱策略解析。这便是“道”,是你开始摸索自己交易策略,开始理解预测市场上赚钱思路的第一步。

然而这“法”,也就是预测市场底层的交易设计,PNL计算,金钱流动的规则,虽有那1%的人讲,但大多分散在一些短小精悍的推文当中。这些隐士高手,似乎始终不愿意,或者没有精力,将自己完整的法门一次性分享给所有人。

所以,在 insiders.bot 刚刚上线,Polymarket刚刚完成v2更新的今天,我想从最底层的技术,来一次性解构这个我们一直交易的市场底层的“法”。

去年10月,我写了一篇简易版,大致带大家了解了Polymarket的几个核心组件。这次,我想真正把所有技术上的设计细节展示给大家看,并且用大白话解释清楚。

这篇文章包含了我们团队过去八个月的心血。

这八个月间,@insidersdotbot 团队拆解了所有Polymarket的底层智能合约与算法架构,来实现最快速的交易,以及最精准的PNL计算。这点,只有我们自己做的API能够实现,直到今天,没有别人做得到。

所以,我想,我们或许正式最能拆解Polymarket底层的“法”的人。

这篇文章中,我会带你理解底层的 ctf-exchange-v2 智能合约如何处理每一笔资金,Relayer 是如何帮你垫付 Gas ,一路明白 Negative Risk 是如何在数学上保证价值守恒的。

这不是一篇简单的科普。这是我用开发者的视角重新拆解 Polymarket 底层机制的算法全解。

我们先从最基础的开始。也就是,当你下达一个订单时,你到底发送了什么?

P.S 这篇文章也经过了AI进行文风和结构适配,欢迎发给你的OpenClaw,Manus,Hermes,或者任何AI Agent作为训练语料!!!

第一章:从点击到上链,到底发生了什么

1.1 订单不是交易,是“意图”

在传统的去中心化交易所(比如 Uniswap),当你交易时,你的钱包会弹出一个确认框,你需要支付 Gas 费,然后把一笔交易(Transaction)发送到区块链的网络(Mempool)里等待矿工打包。

但在 Polymarket,当你下单时,你的钱包弹出的通常是一个“签名”(Sign)请求,而不是“交易”(Transaction)请求。而且,你不需要支付任何 Gas。

这不仅仅是用户体验的优化,这是整个底层架构的根本区别。

在 Polymarket 上,一个订单(Order)本质上是一段符合 EIP-712 标准的结构化数据。这段数据包含了你想要做什么:

  • 你是 Maker 还是 Taker?
  • 你想买哪个 Token(tokenId)?
  • 你想付出多少(makerAmount)?
  • 你想得到多少(takerAmount)?

当你签名时,你只是用你的私钥对这段数据盖了个章,证明“我确实想这么干”。然后,这段带有签名的数据被发送到了 Polymarket 的中心化服务器上,存入了一个链下(Off-chain)的中央限价订单簿(CLOB)。

在这个阶段,区块链上什么都没有发生。

你的钱还在你的钱包里,代币也没有转移。你的订单只是数据库里的一行记录。

1.2 价格的隐式表达

我们先将时间暂停到你发送订单的这个瞬间。如果你仔细看 Polymarket 底层合约的订单结构,你会发现一个非常反直觉的事情:订单签名数据里没有“价格”(Price)这个字段。

这怎么可能?没有价格怎么交易?

在 Polymarket 的协议底层设计中,价格是隐式的。它是由你愿意付出的数量和你想得到的数量算出来的。

如果你想以 $0.60 的价格买入 100 个 YES 合约:

  • 你需要付出:$60 pUSD(makerAmount = 60)
  • 你想得到:100 个 YES 合约(takerAmount = 100)
  • 隐含价格 = makerAmount / takerAmount = 60 / 100 = $0.60

如果你想以 $0.60 的价格卖出 100 个 YES 合约:

  • 你需要付出:100 个 YES 合约(makerAmount = 100)
  • 你想得到:$60 pUSD(takerAmount = 60)
  • 隐含价格 = takerAmount / makerAmount = 60 / 100 = $0.60

(注:虽然在最新的 V2 SDK 中,开发者可以直接传入 price 和 size,但 SDK 在底层签名时,依然会将其转换为 makerAmount 和 takerAmount。这种设计的巧妙之处在于,智能合约不需要理解什么是“价格”,它只需要处理“资产 A 换资产 B”的逻辑。这大大简化了链上的计算逻辑,降低了 Gas 消耗。)

1.3 Operator:Polymarket 的“交通警察”

既然订单都在链下,那它们是怎么变成链上真实的资产转移的?

这就引出了 Polymarket 架构中最核心的黑盒角色:Operator(操作员)。

在 ctf-exchange-v2 智能合约中,有一个极其关键的修饰符:onlyOperator。这意味着,只有 Polymarket 官方控制的那个特定地址,才有权限调用 matchOrders 和 fillOrder 等执行函数。

这与传统的 DeFi 完全不同。在 Uniswap,任何人都可以调用路由合约。但在 Polymarket,你不能自己去链上撮合交易。所有的匹配,必须由 Operator 来提交。

为什么要这么设计?为了消灭 MEV(矿工可提取价值)和抢跑(Front-running)。

在传统的链上订单簿中,如果有人挂了一个价格很低的大单,所有的套利机器人都会在 Mempool 里疯狂竞价(提高 Gas 费),试图抢在别人前面吃掉这个单子。这会导致 Gas 费飙升,普通用户体验极差。

而在 Polymarket,所有的订单都在链下的 CLOB 里。Operator 的匹配引擎(Matching Engine)在服务器上计算出谁和谁应该成交,然后把结果打包成一笔交易,由 Operator 发送到链上。

因为只有 Operator 能提交匹配结果,Mempool 里的机器人就算看到了这笔交易,也无法抢跑,因为他们没有权限调用执行函数。

这是一种典型的“混合去中心化”架构。撮合和排序是中心化的(由 Operator 决定),但结算和资金保管是去中心化的(由智能合约执行)。

Operator 可以决定先匹配谁后匹配谁,但它绝对无法盗走你的资金,因为它必须提供你签名的那段 EIP-712 数据,合约会严格验证签名。

P.S: 不过,这里还是要稍微提一嘴。我们 @insidersdotbot 最近似乎发现了这个机制一个可以利用地方,能够让跟单进行抢跑,或者进行极大幅度的延迟降低。如果有任何更新,我们会第一时间在官方账号公布。

第二章:Relayer 的经济学

2.1 “免 Gas”的错觉

Polymarket 最大的卖点之一就是对用户“免 Gas”(Gasless Transactions)。你只需要有 pUSD 就可以交易,不需要买 POL(前 MATIC)放在钱包里。

但区块链的物理定律是不可违背的:只要在 Polygon 上发生了状态改变(比如资产转移),就必须有人支付 Gas 费。

既然你没付,那是谁付的?答案是:Relayer(中继器)。

2.2 Relayer 的接力网络

Polymarket 并没有让用户自己去发交易,而是部署了一套名为 Relayer Client 的基础设施(relayer-v2.polymarket.com)。

在早期架构中,这类服务通常依赖 OpenZeppelin Defender Relay 这样的企业级服务,通过维护一个签名器池(Signer Pool)来解决高并发下的 nonce(交易序号)冲突问题。

当你的 App 创建了一笔交易(比如 Approve 代币、Redeem 收益),你用私钥签名后发给 Relayer。Relayer 会作为“交易赞助商”(Transaction Sponsor),把这笔交易提交到链上,并用自己的资金池为你垫付 Gas 费。

图像

Relayer架构与经济循环

2.3 羊毛出在羊身上?

在早期的很多元交易(Meta-transaction)架构中,Relayer 垫付 Gas 后,通常会从用户的存款中扣除一笔手续费(比如 0.3% 或固定几美元)来弥补 Gas 成本。

但 Polymarket 极其激进:在当前的 V2 架构中,他们真的为你全额买单了。

官方文档明确写道:“Polymarket pays gas for all operations routed through the relayer”。无论是部署钱包、授权代币,还是拆分(Split)、合并(Merge)、赎回(Redeem),全部免 Gas 费,且不收任何隐性操作费。

为什么 Polymarket 愿意做这个亏本买卖?

因为 Polygon 上的 Gas 成本极低(通常只有几美分),而免 Gas 带来的丝滑体验,能吸引海量的 Web2 用户入场。只要用户在交易中产生了微小的 Taker 手续费(后面会讲),就足以覆盖这笔极低的 Gas 成本。

知道了这个,下一个问题自然就来了:这个“免 Gas”架构对我们交易有什么影响?

最大的隐性成本就是延迟(Latency)。你的订单不仅要经过 Polymarket 的匹配引擎,如果是直接上链的操作,还要经过 Relayer 的验证、Gas 估算、队列分配。

第三章:三种匹配方式,以及为什么买家和买家也能成交?

现在我们进入了整个 Polymarket 架构中最硬核、最反直觉的部分。

在传统的交易所(比如币安的订单簿),匹配逻辑非常简单:Alice 想用 $60 买 1 个代币,Bob 想用 $60 卖 1 个代币。交易所把他们撮合在一起,代币从 Bob 到 Alice,钱从 Alice 到 Bob。结束。

但在 Polymarket(基于条件代币框架 CTF),事情完全不同。因为在这里,代币是可以被“凭空印出来”和“凭空销毁”的。

当你打开 ctf-exchange-v2 的源码,你会发现底层有三种完全不同的资产结算路径:COMPLEMENTARY、MINT 和 MERGE。

图像

Complementary, Mint, Merge 大致结构

3.1 COMPLEMENTARY(互补匹配):传统的二手交易

这是最容易理解的一种匹配方式,也是传统交易所唯一拥有的方式。

场景:

  • 市场已经存在一段时间,大家手里都有筹码。
  • Alice 想以 $0.60 买入 100 个 YES。
  • Bob 手里有 YES,他想以 $0.60 卖出 100 个 YES。

Operator 发现这两个订单(BUY vs SELL),把它们打包上链。智能合约执行直接的点对点转账:

  • 把 100 个 YES 从 Bob 的地址转给 Alice。
  • 把 $60 pUSD 从 Alice 的地址转给 Bob。

这个机制有如下数学与工程特征:

  • 零和游戏:系统的总代币供应量没有发生任何变化。
  • Gas 消耗最低:只涉及基础的转账,不涉及 CTF 的复杂操作。
  • 标准化:在一个成熟、流动性充足的市场中,绝大多数日常交易都是这种方式。

3.2 MINT(铸造匹配):凭空创造流动性

这或许是是 Polymarket,乃至整个金融史上最为革命性的创新。

为了更好的解释,我们可以参考这个场景:

  • 一个全新的市场刚刚上线,没有任何人手里有 YES 或 NO 代币。
  • Alice 极度看好,她想以 $0.60 买入 100 个 YES。
  • Bob 极度看衰,他想以 $0.40 买入 100 个 NO。

注意:他们两个都是买家!他们都没有对方想要的代币!

在传统的订单簿里,这两个订单只能干瞪眼,永远无法成交。在 Polymarket,如果遇到 BUY vs BUY(且代币互补),Operator 会把这两个订单撮合在一起!

  • 智能合约从 Alice 账户扣除 $60 pUSD。
  • 智能合约从 Bob 账户扣除 $40 pUSD。
  • 智能合约拿到这 $100 pUSD,将其锁定为抵押品,然后调用 _mint 函数,凭空铸造出 100 个 YES 和 100 个 NO。
  • 把 100 个 YES 发给 Alice。
  • 把 100 个 NO 发给 Bob。

这种机制的触发,必须基于一个严格的数学条件:买方出价之和必须大于等于 $1.00。

如果 Alice 出价 $0.60 买 YES,Bob 出价 $0.35 买 NO,加起来只有 $0.95。智能合约是无法用 $0.95 铸造出价值 $1.00 的完整代币对的。这个匹配会直接失败。

图像

MINT匹配机制

从做市商角度看,这个机制是解决“冷启动”问题的终极武器。当市场刚开盘时,做市商不需要自己先去花钱铸造一堆代币放在手里(这会占用大量资金)。他们只需要在 YES 和 NO 两边同时挂出买单(比如 $0.49 买 YES,$0.49 买 NO)。当散户来卖的时候,就会触发铸造逻辑。

3.3 MERGE(合并匹配):流动性的湮灭

有创造就有毁灭。MERGE 是 MINT 的反向过程。

我们看一个反过来的案例。市场即将结束,大家都在平仓。

  • Alice 手里有 100 个 YES,她想以 $0.60 卖出。
  • Bob 手里有 100 个 NO,他也想以 $0.40 卖出。

注意:他们两个都是卖家!

没有任何人愿意出 pUSD 来买他们的代币。

Polymarket的机制这时候便会再度发力。当遇到 SELL vs SELL 时,Operator 再次施展魔法:

  • 智能合约从 Alice 那里拿走 100 个 YES。
  • 智能合约从 Bob 那里拿走 100 个 NO。
  • 智能合约调用 _merge 函数,将这 100 对 YES+NO 彻底销毁,并从金库中解锁 $100 pUSD。
  • 把 $60 pUSD 发给 Alice。
  • 把 $40 pUSD 发给 Bob。

而Merge机制则有以下数学与金融特征:

  • 通缩机制:系统的总代币供应量减少了。
  • 退出通道:它保证了即使没有“接盘侠”,只要 YES 和 NO 的卖家价格能凑够 $1.00(实际上是让出 $1.00 的空间),大家依然可以套现离场。

理解了这三种匹配方式,你就理解了 Polymarket 市场的生命周期:

  • 早期(MINT 主导):市场刚开,没有代币。多空双方通过 MINT 机制不断把资金注入系统,换取代币。总供应量迅速上升。
  • 中期(COMPLEMENTARY 主导):市场流动性充足,大部分交易都是现有代币的换手。总供应量稳定。
  • 晚期(MERGE 主导):结果逐渐明朗,大家开始平仓。多空双方通过 MERGE 机制销毁代币,换回资金。总供应量下降。

请注意,这三种路径不是由 Operator 主观选择的,而是由订单的买卖方向(BUY vs SELL)严格决定的智能合约路由规则。

图像

市场生命周期

第四章:Split/Merge/Redeem,以及你的 PnL 为什么是错的?

了解了匹配机制,我们再来看三个你可能每天都在用,但从未真正理解其财务影响的底层操作:Split(拆分)、Merge(合并) 和 Redeem(赎回)。

这三个操作是 Polymarket 的原子级操作。它们不是“交易”(不经过订单簿,不收取手续费),而是直接与智能合约交互的资产转换。

  • Split:你给合约 $1 pUSD,合约给你 1 个 YES 和 1 个 NO。成本永远是精确的 $1。
  • Merge:你给合约 1 个 YES 和 1 个 NO,合约还你 $1 pUSD。收益永远是精确的 $1。
  • Redeem:市场决出胜负后,赢的代币换回 $1 pUSD,输的代币清零。
图像

Split操作前后对比

4.1 谁在使用这些操作?

做市商(Market Makers):他们是 Split 的最大用户。做市商需要在两边同时挂单,但他们不想去市场上买代币(会被收手续费)。他们直接把 $10 万资金 Split 成 10 万个 YES 和 10 万个 NO,然后挂在订单簿上。

套利者(Arbitrageurs):他们是 Merge 的最大用户。当市场出现短暂的错价,比如 YES 跌到 $0.40,NO 跌到 $0.55。套利者会迅速买入 1 个 YES 和 1 个 NO(总成本 $0.95),然后立刻调用 Merge 换回 $1,无风险净赚 $0.05。这个数学条件非常清晰:当 Price(YES) + Price(NO) < 1 - 手续费 时,无脑买入并 Merge。

所以,当你试图跟单一个套利者的聪明钱,或者做市商的聪明钱时,你必须准确判断Split/Merge对PNL带来的影响。否则,这就不是一个值得参考的“聪明钱”。

而当今市场上,包括Polymarket本身在内,都无法解决PNL的计算问题。当然,你可能已经猜到了 - insiders.bot 已经在PNL计算和聪明钱浏览器中解决了这个问题。

4.2 PnL 陷阱:为什么你的利润是错的?

正如上文所说,这是整个 Polymarket 生态中最普遍的错误。几乎所有的第三方 PnL(盈亏)追踪工具,甚至包括官方的一些 API,都在这里栽了跟头。

我给你算一笔账,你就知道这个陷阱有多深。

步骤 0:假设你本金有 $100。你看好“以太坊突破 $5000”这个市场。

图像

步骤 1:你花了 $50 执行了一次 Split。现在你手里有 50 个 YES 和 50 个 NO。你的现金还剩 $50。

步骤 2:你觉得 50 个 YES 不够,又去市场上以 $0.40 的价格买了 50 个 YES。花费 $20。现金还剩 $30。

步骤 3:你把手里的 50 个 NO 以 $0.35 的价格卖掉。收回 $17.50。现金变成 $47.50。

现在,你手里有 100 个 YES 合约。你的真实成本是多少?

大多数排行榜是怎么算的(错误算法):

  • 他们只看你的“交易”记录。他们看到你买入了 50 个 YES,花费 $20。他们完全忽略了 Split(因为那不是交易)。
  • 所以他们认为你的成本是:$20 / 50 = $0.40/个。
  • 如果现在 YES 的市场价涨到了 $0.60,他们会显示你的利润是:100 × $0.60 - $20 = $40。

实际上你应该怎么算(正确算法,以及 insiders.bot 正在使用的算法):

  • 你的总现金流出:$50(Split) + $20(买入) = $70。
  • 你的总现金流入:$17.50(卖出 NO)
  • 你的净投入:$70 - $17.50 = $52.50
  • 你的真实成本:$52.50 / 100 = $0.525/个。
  • 如果现在 YES 的市场价是 $0.60,你的真实利润是:100 × $0.60 - $52.50 = $7.50

看到差距了吗?排行榜显示你赚了 $40,但你实际上只赚了 $7.50。中间那 $32.50 的“幻觉利润”,就是因为系统没有正确处理 Split 的成本和卖出 NO 的收益。

正确的 PnL 数学公式应该是:

总盈亏 = Σ(卖出收入) + Σ(Merge 收入) + Σ(Redeem 收入) - Σ(买入支出) - Σ(Split 支出) + 当前持仓市值

这就是为什么你在排行榜上看到某些大佬显示亏损几百万,但实际上他们赚得盆满钵满。因为赢的仓位被 Redeem 之后,很多工具会把这些持仓从历史记录中“抹掉”,只留下那些还在亏损的烂摊子。

图像

PnL计算陷阱

第五章:手续费曲线

如果你经常交易,你会发现 Polymarket 的手续费并不是一个固定的百分比。有时你买 $1000 的合约被收了 $10,有时却只收了 $2。

为什么?让我们来看看隐藏在代码深处的费用公式:

Fee = C × feeRate × p × (1 - p)

(其中 C 是交易数量,p 是价格)

5.1 为什么是 p(1-p)?

假设你想买 100 个 YES,费率是 2%:

  • 如果 YES 的价格是 $0.50:手续费 = 100 × 2% × 0.50 × 0.50 = $0.50
  • 如果 YES 的价格是 $0.90:手续费 = 100 × 2% × 0.90 × 0.10 = $0.18
  • 如果 YES 的价格是 $0.10:手续费 = 100 × 2% × 0.10 × 0.90 = $0.18

你发现规律了吗?当价格在 0.50(五五开)时,手续费最高。当价格接近 0 或 1(大局已定)时,手续费极低。

更重要的是对称性。买入 $0.90 的 YES,和买入 $0.10 的 NO,在数学上是等价的。如果你买 $0.90 的 YES 收费很高,而买 $0.10 的 NO 收费很低,套利者就会疯狂买入 NO 然后通过 MINT 机制套利。p(1-p) 这个设计,保证了无论你从哪一面表达观点,系统收取的摩擦成本都是绝对对称的。

5.2 隐藏的数学之美

如果你学过统计学,你会对 p(1-p) 这个公式非常眼熟。它是伯努利分布(抛硬币)的方差公式。

在 Polymarket 的整个系统设计中,p(1-p) 就是“上帝公式”:

  • 它是手续费曲线:不确定性(方差)越高,系统收取的费用越高。
  • 它是信息熵的体现:你在 50% 时下注,你为市场提供了最多的新信息,所以你付出的代价最大。

谁支付手续费?永远是 Taker(吃单者)。Maker(挂单者)永远免手续费。

这个机制完美地对齐了激励:在市场最迷茫(50/50)的时候,早期入场者会被收取最高的手续费,这保护了做市商免受无谓的冲击;而在市场几乎确定的时候,极低的手续费鼓励套利者进场,把价格推向最终的 1 或 0。

图像

手续费曲线

第六章:Negative Risk,aka DeFi 领域最优雅的魔术

如果你在 Polymarket 上玩过大选、奥斯卡或者体育比赛等多结果(Multi-outcome)市场,你一定接触过负风险(Negative Risk)市场。

这是整个文章中最烧脑,但也最能体现智能合约工程美学的部分。

P.S 这也是我们的联创 @DakshBigShit 在开发我们自己的API时,通过36小时马拉松爆肝才解决的部分。

6.1 传统多结果市场的痛点

假设有四个候选人:A、B、C、D。

  • 你极度讨厌 A,你确信 A 绝对赢不了。你想“做空” A。
  • 在传统的二元市场,你只需要买入 A 的 NO

免责声明:

1.资讯内容不构成投资建议,投资者应独立决策并自行承担风险

2.本文版权归属原作所有,仅代表作者本人观点,不代币币情的观点或立场