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

By [BlockBoy](https://paragraph.com/@blockboy), 2026-01-27

#predictx, #solana, #预测市场

---

### **项目简介**

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

![](https://storage.googleapis.com/papyrus_images/72637c3111629b8c8ead29c1744cae1481639c9f0f9ec3bea1193efda04b6d7d.png)

> **网址:** [**https://predictx-solana.vercel.app/**](https://predictx-solana.vercel.app/)
> 
> **代码库:** [**https://github.com/ChinaKingKong/predictx**](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\. 取消市场**

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

> **_保护机制：市场一旦有人下注，创建者就无法取消，保护早期下注者利益。_**

**数据流转**
--------

![](https://storage.googleapis.com/papyrus_images/7ee94d44459662a327cbed0bbbacfff4ac14437257318a1d1d21fb6af1decf3f.png)

**机制说明**
--------

### **当前结算机制**

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

退还初始流动性（仅限无下注时）

**项目架构**
--------

### **技术架构**

![](https://storage.googleapis.com/papyrus_images/66b22ce7a98bb4ca64aa07a97358b406323c47eb5fe2a979668959b4109f4ed2.png)

#### **智能合约**

*   **语言**：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 为预测市场领域提供了一个可信、公平的基础设施。

---

*Originally published on [BlockBoy](https://paragraph.com/@blockboy/predictx%EF%BC%9A%E4%B8%80%E4%B8%AA%E5%9F%BA%E4%BA%8E-solana-%E7%9A%84%E5%8E%BB%E4%B8%AD%E5%BF%83%E5%8C%96%E9%A2%84%E6%B5%8B%E5%B8%82%E5%9C%BA%E5%B9%B3%E5%8F%B0)*
