Start typing to search this publication.
BlockBoy logo BlockBoy
Open menu
BlockBoy logo

Subscribe to BlockBoy

Get new posts delivered straight to your inbox.

PredictX:一个基于 Solana 的去中心化预测市场平台

BlockBoy avatar BlockBoy
Cover image for PredictX:一个基于 Solana 的去中心化预测市场平台

项目简介

PredictX 是一个构建在 Solana 区块链上的去中心化预测市场(Prediction Market)协议。用户可以创建预测市场,对未来的事件进行下注,并在事件发生后获得相应奖励。通过智能合约保证透明公正,所有交易记录上链,无需信任中心化机构。

网址:  https://predictx-solana.vercel.app/

代码库:  https://github.com/ChinaKingKong/predictx

玩法介绍

1. 创建市场

任何用户都可以创建预测市场:

  • 提出问题 :如"比特币会在2026年底达到20万美元吗?"

  • 添加描述 :详细说明结算标准和相关背景

  • 设定结束时间 :市场何时关闭(支持长期预测,甚至数年)

  • 提供初始流动性 :向 YES 和 NO 两个池各注入相同金额的 SOL(最低 0.01 SOL)

2. 参与下注

用户可以对自己看好的预测进行下注:

  • 买 YES :认为事件会发生

  • 买 NO :认为事件不会发生

  • 下注金额 :最低 0.01 SOL

  • 赔率计算 :根据池中资金动态计算,资金越少赔率越高

3. 市场结算

市场结束后,创建者根据真实结果进行结算:

  • 选择 YES 或 NO 作为获胜方

  • 结算后,获胜方的下注者可以领取奖励

重要:PredictX 目前采用中心化结算机制,即市场创建者拥有决定结果的唯一权限。创建者可获得 5% 的手续费作为诚实结算的激励。

4. 领取奖励

获胜方按比例分享市场池:

      
        奖励 = 下注金额 × (总池 - 创建者费) / 获胜方池
创建者费 = 获胜方池 × 5%
                                  
      
    

5. 取消市场

创建者可以在没有人下注的情况下取消市场,取回初始流动性。

保护机制:市场一旦有人下注,创建者就无法取消,保护早期下注者利益。

数据流转

机制说明

当前结算机制

PredictX 目前第一版使用偏中心化结算机制,即市场创建者拥有决定结果的唯一权限。

结算流程

  1. 市场创建 :任何人都可以创建预测市场,需要提供初始流动性(最低 0.01 SOL)

  2. 下注阶段 :用户可以选择 YES 或 NO 进行下注,SOL 会被锁定到市场账户中

  3. 市场结算 :市场到期后,只有 市场创建者 可以决定结果

  4. 奖励分配

    • 获胜方的投注者按比例分配总池子

    • 创建者获得  5% 的创建者手续费 (从获胜池中扣除)

    • 手续费机制旨在激励创建者诚实结算

风险提示

  • 信任依赖 :用户需要信任市场创建者会诚实结算

  • 无法撤销 :一旦结算完成,结果无法更改

  • 参与建议 :只参与您信任的创建者所创建的市场

未来改进方向

  • 集成预言机(如 Pyth、Chainlink)实现去中心化结算

  • 添加申诉/争议解决机制

  • 引入创建者声誉系统

费用结构

操作

费用

说明

创建市场

Gas + 初始流动性

初始流动性最低 0.02 SOL,平均分配到 YES/NO 池

下注

Gas + 下注金额

下注金额全部进入对应池子

领取奖励

Gas + 5% 创建者费

从可用余额中扣除 5%,剩余按比例分配给获胜者

取消市场

Gas

退还初始流动性(仅限无下注时)

项目架构

技术架构

智能合约

  • 语言 :Rust

  • 框架 :Anchor Framework 0.32.1

  • Program ID :8Gox156KkxtCxTbURemn9aB1go8BGohVn5zm5k5jGFrp

  • 网络 :Solana Devnet

核心指令

指令

功能

initialize

初始化程序

create_market

创建预测市场

place_bet

下注

resolve_market

结算市场

claim_rewards

领取奖励

cancel_market

取消市场

数据结构

      
        // 市场账户
pub struct Market {
    pub authority: Pubkey,      // 创建者
    pub question: String,        // 预测问题
    pub description: String,     // 详细描述
    pub end_time: i64,           // 结束时间
    pub yes_pool: u64,           // YES 池
    pub no_pool: u64,            // NO 池
    pub total_bets: u64,         // 总下注数
    pub status: MarketStatus,    // 状态
    pub outcome: Option<bool>,   // 结算结果
    pub created_at: i64,         // 创建时间
    pub bump: u8,                // PDA bump
}

// 用户下注账户
pub struct UserBet {
    pub market: Pubkey,          // 所属市场
    pub user: Pubkey,            // 用户
    pub amount: u64,             // 下注金额
    pub prediction: bool,        // 预测 (YES/NO)
    pub claimed: bool,           // 是否已领取
    pub timestamp: i64,          // 下注时间
    pub bump: u8,                // PDA bump
}
                                  
      
    

前端应用

  • 框架 :React 18 + TypeScript

  • 构建工具 :Vite

  • UI 库 :Tailwind CSS

  • 钱包 :Solana Wallet Adapter (仅支持 Phantom)

  • 状态管理 :React Context API

  • 动画 :Framer Motion

  • 日期处理 :Day.js + Ant Design DatePicker

  • 通知 :React Hot Toast

  • 国际化 :支持中英文切换

PDA 设计

      
        // 市场 PDA
market = derive_address([
    "market",
    authority.pubkey(),
    question_bytes[0..8]  // 问题前8字节作为种子
])

// 下注 PDA
bet = derive_address([
    "bet",
    market.pubkey(),
    user.pubkey()
])
                                  
      
    

项目亮点

1. 无时间限制

大多数预测市场平台限制了预测时间(通常30天),PredictX 允许创建长期预测市场,用户可以对数月甚至数年后的事件进行下注。

2. 重复下注支持

使用 Anchor 的 init_if_needed 约束,用户可以多次对同一市场下注,累计增加原有头寸。

3. 移动端优先设计

  • 响应式布局,完美支持手机端

  • 底部弹出式模态框,符合移动端交互习惯

  • 最小触摸区域 44px,确保良好的点击体验

4. 多语言支持

内置中英文双语切换,方便不同地区用户使用。

5. 实时余额更新

监听链上账户变化,实时显示用户 SOL 余额。

6. 动态赔率系统

使用恒定乘数公式计算赔率:

      
        赔率 = (YES池 + NO池) / 选择池
                                  
      
    

下注的人越少,潜在收益越高。

7. 取消保护机制

市场一旦有人下注,创建者就无法取消,保护早期下注者利益。

8. 投注人数显示

每个市场卡片显示参与投注的唯一用户数量,帮助用户判断市场热度。

9. 我创建的市场

新增"我创建的"筛选标签,方便市场创建者管理自己发布的市场。

10. 透明可验证

所有交易记录在 Solana 区块链上,可通过 Solscan 查询验证。

技术难点与解决方案

难点1:PDA 种子长度限制

问题 :Anchor PDA 单个种子最大 32 字节,问题字符串可能超过限制。

解决方案 :只取问题字符串的前 8 字节作为种子,足够保证唯一性。

难点2:时钟漂移

问题 :用户本地时间与链上时间可能存在差异。

解决方案

  • 智能合约使用链上 Clock::get() 获取准确时间

  • 前端添加 62 分钟缓冲期

难点3:状态序列化

问题 :Anchor 返回的枚举类型是对象格式 { active: {} },而非字符串。

解决方案 :编写 toMarketStatus 函数兼容多种格式转换。

难点4:创建者费用扣除

问题 :如何在结算时正确扣除并转移创建者费用。

解决方案

  • 在 claim_rewards 指令中添加 authority 账户

  • 从市场账户的 lamports 中直接扣除 5% 费用

  • 使用 try_borrow_mut_lamports 进行安全的转账操作

部署信息

  • 网络 :Solana Devnet

  • Program ID :8Gox156KkxtCxTbURemn9aB1go8BGohVn5zm5k5jGFrp

未来规划

  • 支持更多钱包(Backpack、Solflare等)

  • 支持更多网络(ETH、BSC、Polygon等)

  • 添加预言机集成,自动结算市场

  • 实现流动性挖矿奖励

  • 支持多选答案预测(不仅是 YES/NO)

  • 部署到 Solana Mainnet

结语

PredictX 展示了在 Solana 高性能区块链上构建去中心化预测市场的完整流程。项目充分利用了 Solana 的高吞吐量和低手续费优势,为用户提供了流畅的预测交易体验。通过智能合约的透明执行和去中心化特性,PredictX 为预测市场领域提供了一个可信、公平的基础设施。

Subscribe to BlockBoy

加密老炮 | AI | Web3 | 金融 研究从业者