Dungeon Saga 链上 PvP 合约:挑战 / 验证 / 接受 与不可操纵的随机
本篇属于 Dungeon Saga(DungeonSaga)资料百科,讲的是官方蓝图里的规则与数值 —— 看完可以接着用站内的组合 / 估值工具,把它们算成英雄的 Total Power。
没有服务器:合约就是竞技场
蓝图 Phase 4 → On-Chain PvP Contract System 的设定是:
- 官方发布一个 PvP Contract Template(sCrypt);
- 每个玩家部署自己的实例 —— 这个实例既是他的竞技场,也是永久的战斗记录;
- 挑战通过质押 HP 代币发起;应战方在接战之前可以核对挑战方合约的字节码是否与官方模板一致,
防止被恶意合约坑;
- 两边都提交后,合约确定性地跑完全部战斗逻辑并结算奖励。没有服务器、不需要信任、全部在链上。
三步流程(含状态机)
| 步骤 | 谁做 | 做什么 | 状态 |
|---|---|---|---|
| 1. 挑战 | A | 向自己的 PvP 合约质押 HP,并指定对手与超时(官方示例:stakedHP: 20、timeout: 144 个区块) | PENDING |
| 2. 验证并接受 | B | 先核对 A 的合约字节码与官方模板一致,再质押自己的 HP 接战;B 一旦质押,A 就不能撤回 | RESOLVED |
| 3. 撤回 | A | 可选:若 B 未在超时前接受,A 可以取回质押的 HP | CANCELLED |
随机从哪来(为什么不能作弊)
战斗结果需要随机数,蓝图的做法是由双方交易共同决定种子:
masterSeed = sha256(TX2.hashPrevouts + TX1.txid)
roundSeed[n] = sha256(masterSeed + n)
每一回合从该回合的种子字节里取四项判定:
critCheck = seed[0] // 暴击
evaCheck = seed[1] // 闪避
dmgVariance = seed[2] // 伤害浮动 ±10%
extraCheck = seed[3] // 额外行动
结算结果写成 { winner, rounds, hpLeft, combatLog, rewardTx }。
官方给的六条公平性理由
- 两步承诺:A 先提交(挑战 + 质押),B 后提交(接受 + 质押);种子依赖两笔交易的上下文,
在各自上链时才最终确定,任何一方都无法操纵。
- 不可预测:
masterSeed里的TX2.hashPrevouts只有在 B 提交时才定稿,
所以双方都无法在提交前算出结果。
- 不可反悔的锁定:B 质押后 A 不能撤回 —— 双方被锁在同一场战斗里,没有中途退赛与中途改数。
- 确定且可验证:同样的输入永远得到同样的结果,合约在 OP_CAT Layer 的 BVM 上执行每一条计算,
任何人都能重放整场战斗并逐回合核对。
- 合约可核对:接战前 B 把挑战方字节码与官方模板做哈希比对,不一致就拒绝。
- 永久战绩:每个玩家的合约保存完整战斗史 —— 对手、质押、结果、完整日志,全部永久上链。
官方算例(Knight vs Grum)
质押不对等也能开打:Knight 质押 20、Grum 质押 10。
- 先手:Knight(SPD 116 > 110)
- 额外行动:无(速度差 6 < 50)
- 结果:Knight 获胜,剩余 31 HP;Grum 在第 12 回合被击败
逐回合日志由 roundSeed[n] 驱动,暴击/闪避/浮动/额外行动四项判定都在日志里可以一条条复核。
官方出处
Phase 4 → On-Chain PvP Contract System(流程、验证、状态机)Phase 4 → Seed Generation/Round Resolution(种子与判定)Phase 4 → Why is this fair?(六条)Phase 4 → Worked Example(Knight vs Grum 的合约交易与日志)
相关阅读:战斗公式:HP / ATK / DEF / SPD · 角色克制与平衡 · 常见问题