撰文:Pavel Naydanov
编译:Golem,Odaily 星球日报
编者按:Polymarket 在本次美国大选中获得了更多的关注,不仅是因为预测主题累计交易量突破 36 亿美元,而且因其相比于民调和传统媒体提前且成功预测了特朗普将会获胜,使人们更加意识到 Polymarket 不仅仅是一个下注网站,而且将成为一个更加真实可靠的新闻网站(推荐阅读:《Vitalik 新文:从预测市场到信息金融》)。Polymarket 可能是本轮区块链创新中最靓丽的「一道风景线」。
那么,具有「区块链革命」性意义的 Polymarket 在技术上是如何实现的呢?智能合约开发员 Pavel Naydanov 对 Polymarket 采用的技术进行了细致的拆分和讲解,对开发人员来说,或许具有启示意义。Odaily 星球日报将其中涉及技术实现的部分编译如下,接下来让我们深入研究该协议各个方面的技术细节吧。
CTF:使结果代币化
Polymarket 上所有的事件结果都是代币化的:
- 此类代币可以称为 Share token;
- Share 是用基础资产购买的,因此它们是完全抵押的;
- Share 可以被卖出以获得基础资产。
Share token 是基于 Gnosis 条件代币框架 (CTF) 实现的 ERC-1155 ,该框架已证明其有效性并已通过多种协议测试,CTF 最多可以支持每个事件 256 个结果。
每个预测都在 CTF 中被标识,为此它们会被分配一个唯一的条件 ID,由三个参数的哈希值组成:
- 预言机:将确定事件结果的预言机的地址,这确保只有指定的预言机才能结算预测;
- 问题 ID:预测标识符,由预测题的创建者设置。这可以是一个简单的计数器,每个新预测都会之前的预测题上增加一个计数,也可以是使用文本和其他数据哈希的更复杂的方案;
- outcomeSlotCount:预测的可能结果数。
下图直观地展示了 CTF(条件代币框架)的工作原理
用户在下注时提供基础资产并收到 Share token,在 CTF 中称为条件代币。在预言机确定预测后,用户可以根据预测结果从 CTF 领取奖励。
当用户收到条件代币时,他们被视为已确定特定立场。在 CTF 中,立场代表每个预测的一组可能结果组合。CTF 为每个预测生成这些立场,每个立场对应于用户可以选择的可能结果组合之一。
例如:
2024 年票房最高的电影是什么?
- 头脑特工队 2
- 疯狂的麦克斯 4
- 死侍 3
- 小丑 2
- 卑鄙的我 4
- 沙丘 2
- 其他
用户可以投票认为《头脑特工队 2 》将成为票房最高的电影,或者《沙丘 2 》绝对不会成为 2024 年票房最高的电影。这种预测组合将被视为他们的立场。
CTF 提供了两种有趣的处理立场的机制:拆分和合并。拆分机制允许将单个立场分成多个单独的结果,而合并将不同的结果合并为一个立场。这些机制使用户能够灵活地管理他们的立场。
CTF 为 Polymarket 提供了四个重要优势:
- Share token 可用于确认用户对特定预测结果的投票;
- 实现了一个灵活的系统,将用户的投票组合成各种立场;
- 根据预言机的信号,结果计算的责任委托给 CTF;
- 根据获胜结果的 Share token 数量计算奖励。
另外值得一提的是,CTF 允许组织相关活动,其中用户的立场是可以合并的。但是,Polymarket 上目前还没有这样的例子。想要了解关于 CTF 的更多内容,可以在官方文档中获取。
订单机制
为了进行购买,Polymarket 界面提供三种类型的订单:
- Market ——以当前市场价格立即购买;
- Limit——延迟订单,允许您指定达到该价格后进行购买的价格;
- AMM——以类似于去中心化交易所的价格自动确定的价格购买,基于池中的储备金额。
目前,AMM 订单功能似乎是无效的,没有找到允许通过 AMM 购买的预测。在 Polymarket 的 Discord 中一位用户的一条评论在一定程度上解释了这种情况。
AMM 已经过时了
根据 Polymarket 的文档,AMM 被作为条件令牌框架的一部分智能合约开发。因此,AMM 用于确定 Share token 的购买价格。这种基本机制需要流动性来确保稳定的定价并降低波动性。流动性提供者需要经济激励,从每次购买中获得奖励,以保持系统运行。
可能最初 Polymarket 是完全基于 CTF 的,使用 AMM 来确定价格。但随着时间的推移,该协议开发了一种带有订单簿的混合解决方案,另外两种类型的订单(限价和市价)开始在该定制的解决方案上工作。此解决方案称为 CLOB(中央限价订单簿)或 BLOB(二进制限价订单簿)。
CLOB 和 BLOB
CLOB(中央限价订单簿)或 BLOB(二进制限价订单簿)是一种代表混合分散式订单簿的系统。在这个系统中,专门的操作员负责处理订单匹配并启动智能合约的执行。
无需过多介绍,系统如下图所示:
用户创建要执行的订单,可以是限价订单或市价订单;操作员匹配用户订单并在智能合约上启动执行,创建订单意味着创建一个根据 EIP-712 标准用用户私钥签名的数据结构。由于订单在执行前存储在链下,因此可以快速且免费地调整订单条款,甚至完全取消。
不过与订单簿和订单匹配相关的所有内容只能通过 API 访问,为方便起见,Polymarket 提供了两个客户端:一个使用 JavaScript ,一个使用 Python。
然而,Exchange.sol 智能合约是公开的,负责在 CTF 中创建用户立场。它还允许管理用户立场并在他们之间转移资产,从而确保协议内的安全性和透明度。
该智能合约已通过审计,审计报告附在存储库中。
智能合约
Exchange 智能合约实际上有一个更具体的名称,即 CTFExchange.sol。它不是很大,只有大约 100 行代码,但它确实具有大量依赖项。
其中大多数是实现有限功能的小型智能合约:
- BaseExchange.sol:实现接收 ERC-1155 代币能力的抽象智能合约,还负责防止重入攻击;
- Auth.sol:角色管理器,定义验证函数和修饰符以设置角色,CTFExchange.sol 的 admin 和 operator;
- Assets.sol:定义两种资产,基础资产(抵押品)和 CTF 地址;
- Fees.sol:定义协议费用;
- Pausable.sol:定义暂停智能合约操作的能力,协议同意在出现不可预见的情况时采用的一种中心化形式。仅适用于 admin 角色;
- AssetOperation.sol:定义基础资产和 CTF 的操作。包括立场的转移、拆分和合并;
- Signature.sol:定义用于验证订单时使用的用户签名的代码;
- Hashing.sol:定义订单参数的哈希值,用于签名验证;
- Registry.sol:定义在系统中注册预测并为预测注册代币的过程。
与实际执行订单相关的所有内容都在智能合约 Trading.sol 中实现。遍历代码并研究智能合约也很简单。该结构通过函数明确定义了入口点:
- fillOrder() — 在创建订单的用户和用户选择的挂单(另一个订单)之间执行订单;
- fillOrders() — 与 fillOrder() 相同,但用于订单列表;
- matchOrders() — operator 选择两个不同的订单并执行它们。
以上所有函数只能由 operator 调用。
无论调用如何进入智能合约,结果始终相同:两个用户将根据他们的订单交换代币。
协议费用
费用是根据输出的资产收取的。对于二元预测,费用是对称的,这意味着:如果用户以 0.99 美元的价格出售代币,他们将支付与以 0.01 美元的价格购买代币的买家相同的费用。
计算公式很简单,取自官方文档:
流动性奖励计划
该计划的总体目标是激励市场流动性。
如果要使基于订单簿的交易所发挥作用,需要有人创建限价订单,限价订单提供允许立即执行市价单的流动性,创建限价订单的用户称为做市商。限价订单与市场价格的「紧密度」越高,市场订单的执行速度就越快,交易量也越大,这对最终用户来说无疑是有利的。此外,流动性越大,操纵市场就越困难。
为了确保足够的流动性,Polymarket 制定了一个特殊的奖励计划,以激励用户创建限价订单。限价订单越接近平均市场价格,奖励就越高。奖励将在每天午夜(UTC 时间)自动支付。
该系统以 dYdX 为蓝本,想要了解更多可查看原始 dYdX 的流动性激励计划和 Polymarket 详细的流动性奖励计算公式。
预言机
预言机用于提供预测结果 — 无论事件是否发生。预言机是协议的最重要组件之一,但它由第三方服务,而不是 Polymarket 团队,这个预言机被称为 UMA。
UMA 是一个去中心化的预言机,专门用于在区块链上记录任何类型的数据,但无法验证的数据除外。该预言机是乐观的,除非有争议,否则数据默认为是正确的。UMA 有自己的仲裁系统来解决争议,仲裁员是真实的人——UMA 生态系统的参与者,特别是 UMA 代币持有者。这个系统被称为 DVM(数据验证机制)。
以下过程用于确定预测结果并将其记录在区块链上:
- Statement:预测与奖励一起添加到预言机中。任何成功对预测结提出异议果的人都可以领取奖励;
- Challenge period:挑战期,在此期间,任何人都可以质疑预测结果。如果没有发生挑战并且时间到期,则预测结果被视为已准备好进行最终结算,这表明其准确性;
- Dispute:争议,任何协议参与者都可以对结果提出异议,无论是为了索取奖励还是为了公平。实际上,这种情况很少发生,因为博弈论表明大多数参与者的行为都是诚实的。
- Voting:投票,如果发起争议,UMA 代币持有者将投票解决争议。UMA 是用于投票的协议代币,参与者因参与投票而获得奖励。
- 结算:最后阶段是结算过程,即在区块链上实际记录数据。在此之后,预测结果可以被认为是可靠的。
整个协议都基于博弈论,任何参与者进行恶意行为在经济上考虑都是不利的。
- 提交预测结果进行投票的参与者向智能合约提供抵押品。如果他们的结果受到质疑,他们将失去抵押品;否则,他们将取回抵押品并获得奖励。这产生了强烈的动机,只提交准确的结果。
- 对预测结果提出异议的参与者也会提供抵押品。如果他们是正确的,他们就会拿回抵押品并获得奖励;否则,他们就会失去抵押品。这激励参与者只挑战那些他们确信是错误的结果。
- 解决争议的参与者。他们必须质押 UMA 代币,并将因解决争议而获得奖励。如果他们投票错误或根本不投票,他们将失去部分质押余额;否则,他们将获得奖励。没有办法懈怠。
特别值得注意的是,争议中的投票过程使用 commit/reveal 方案分为两个阶段:
- Commit:提交,参与者通过将投票的哈希值提交给智能合约来秘密投票,这意味着没有人可以仅通过查看哈希值来辨别参与者是如何投票的。
- Reveal:揭示,投票阶段结束后,参与者揭示他们的选票,智能合约会验证他们是否与之前提交的哈希值匹配。
这种两阶段投票过程可防止选民串通以诋毁预言机或攻击依赖预测结果的服务。同时预测结果可以多次受到质疑,在这种情况下,UMA 允许在之前的争议结束后重新启动决策过程。
争议发起过程如下:
结论
Polymarket 这个看似简单的博彩和预测系统实际上包含三个主要模块,每个模块由不同的协议和团队开发:
- CTF(条件代币框架):管理预测中的组合、立场和 Share, Gnosis 创建的这个灵活的框架非常适合预测市场。
- CLOB(中央限价订单簿):Polymarket 用于实施订单簿和限价订单的内部解决方案。CLOB 使用户能够有效地参与生态系统并帮助聚合流动性。
- UMA:一个具有独特争议解决仲裁系统的去中心化预言机。UMA 是系统的核心,通过区块链传输预测结果。
虽然 Polymarket 是一个下注系统,但从技术上讲,该协议成功地结合了来自不同项目的技术,对开发人员特别有吸引力。