项目简介
PredictX 是一个构建在 Solana 区块链上的去中心化预测市场(Prediction Market)协议。用户可以创建预测市场,对未来的事件进行下注,并在事件发生后获得相应奖励。通过智能合约保证透明公正,所有交易记录上链,无需信任中心化机构。
玩法介绍
1. 创建市场
任何用户都可以创建预测市场:
-
提出问题 :如"比特币会在2026年底达到20万美元吗?"
-
添加描述 :详细说明结算标准和相关背景
-
设定结束时间 :市场何时关闭(支持长期预测,甚至数年)
-
提供初始流动性 :向 YES 和 NO 两个池各注入相同金额的 SOL(最低 0.01 SOL)
2. 参与下注
用户可以对自己看好的预测进行下注:
-
买 YES :认为事件会发生
-
买 NO :认为事件不会发生
-
下注金额 :最低 0.01 SOL
-
赔率计算 :根据池中资金动态计算,资金越少赔率越高
3. 市场结算
市场结束后,创建者根据真实结果进行结算:
-
选择 YES 或 NO 作为获胜方
-
结算后,获胜方的下注者可以领取奖励
重要:PredictX 目前采用中心化结算机制,即市场创建者拥有决定结果的唯一权限。创建者可获得 5% 的手续费作为诚实结算的激励。
4. 领取奖励
获胜方按比例分享市场池:
奖励 = 下注金额 × (总池 - 创建者费) / 获胜方池
创建者费 = 获胜方池 × 5%
5. 取消市场
创建者可以在没有人下注的情况下取消市场,取回初始流动性。
保护机制:市场一旦有人下注,创建者就无法取消,保护早期下注者利益。
数据流转
机制说明
当前结算机制
PredictX 目前第一版使用偏中心化结算机制,即市场创建者拥有决定结果的唯一权限。
结算流程
-
市场创建 :任何人都可以创建预测市场,需要提供初始流动性(最低 0.01 SOL)
-
下注阶段 :用户可以选择 YES 或 NO 进行下注,SOL 会被锁定到市场账户中
-
市场结算 :市场到期后,只有 市场创建者 可以决定结果
-
奖励分配 :
-
获胜方的投注者按比例分配总池子
-
创建者获得 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
核心指令 :
| 指令 | 功能 |
|---|---|
| | 初始化程序 |
| | 创建预测市场 |
| | 下注 |
| | 结算市场 |
| | 领取奖励 |
| | 取消市场 |
数据结构 :
// 市场账户
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 为预测市场领域提供了一个可信、公平的基础设施。