# 游戏安全性

## 概述

MemeDice 采用多层安全保障体系，从智能合约设计到外部审计，全方位保护玩家和投资者的资金安全。

***

## 安全审计

### 三重安全保障

```mermaid
graph TD
    A[安全保障体系] --> B[🤖 AI 审计]
    A --> C[👥 专业安全团队]
    A --> D[🔴 红队攻防]
    
    B --> E[自动化漏洞扫描<br/>代码模式分析]
    C --> F[人工代码审查<br/>逻辑漏洞检测]
    D --> G[模拟真实攻击<br/>渗透测试]
    
    style A fill:#4F46E5,color:#fff
    style B fill:#059669,color:#fff
    style C fill:#D97706,color:#fff
    style D fill:#DC2626,color:#fff
```

| 层级            | 方式    | 说明                      |
| ------------- | ----- | ----------------------- |
| **🤖 AI 审计**  | 自动化分析 | 使用 AI 工具进行代码扫描，检测常见漏洞模式 |
| **👥 专业安全团队** | 人工审查  | 专业安全研究员进行深度代码审查         |
| **🔴 红队攻防**   | 渗透测试  | 模拟真实攻击场景，测试系统的防御能力      |

***

## 合约安全设计

### 1. ReentrancyGuard 防重入

所有涉及资金转移的函数都使用 `ReentrancyGuard` 保护：

```solidity
// 伪代码
modifier nonReentrant() {
    require(!locked, "ReentrancyGuard: reentrant call");
    locked = true;
    _;
    locked = false;
}
```

**防护目的**：防止重入攻击（Reentrancy Attack），即在资金转移过程中被恶意合约回调。

**受保护的函数**：

* `placeBetSync()` — 同步下注
* `placeBatchBetSync()` — 批量同步下注
* `placeBetAsync()` — 异步下注
* `placeBatchBetAsync()` — 批量异步下注
* `deposit()` — 存款
* `withdraw()` — 提款
* `fulfillRandomNumber()` — Oracle 随机数揭示

### 2. SafeERC20 安全代币操作

所有代币转移操作使用 OpenZeppelin 的 `SafeERC20` 库：

```solidity
using SafeERC20 for IERC20;

// 安全转入
token.safeTransferFrom(msg.sender, address(this), amount);

// 安全转出
token.safeTransfer(recipient, amount);
```

**防护目的**：

* 处理不返回布尔值的非标准 ERC-20 代币
* 确保转账失败时交易回滚
* 防止静默失败

### 3. 待结算资金锁定（pendingLockedAmount）

当玩家下注时，潜在的最大赔付金额会被 **锁定**：

```mermaid
graph LR
    A[资金池总额] --> B[可用余额]
    A --> C[锁定金额]
    
    B -->|用于新下注| D[新的锁定]
    C -->|结算后释放| E[回到可用余额]
    
    style C fill:#DC2626,color:#fff
    style B fill:#059669,color:#fff
```

```
可用余额 = 资金池总额 - pendingLockedAmount
```

**防护目的**：

* 确保资金池有足够的代币支付所有待结算的下注
* 防止多个玩家同时赢钱时资金池不足
* 保护股东的资金不被超额支付

### 4. 下注超时取消（BET\_TIMEOUT）

Oracle 模式下，如果 Oracle 在规定时间内没有揭示随机数：

```
BET_TIMEOUT = 300 秒（5 分钟）
```

超时后，玩家可以取消下注并取回资金。

**防护目的**：

* 防止 Oracle 服务宕机导致玩家资金被永久锁定
* 确保玩家在任何情况下都能取回资金

### 5. 费率上限保护

所有者费率有硬编码的上限：

```
MAX_FEE_BPS = 900（即 9%）
```

**防护目的**：

* 防止管理员设置过高的费率
* 保护玩家和股东的利益
* 即使管理员恶意操作，费率也不会超过 9%

***

## 攻击防护

### 闪电贷攻击

**攻击方式**：攻击者在同一笔交易中借款 → 下注 → 根据结果决定是否回滚。

**防护措施**：

* Oracle 模式：异步结算，下注和结算在不同交易中
* Prevrandao 模式：`onlyEOA` 限制，合约无法调用

### 三明治攻击

**攻击方式**：攻击者在目标交易前后插入交易，操纵价格或状态。

**防护措施**：

* 下注结果由随机数决定，不受交易顺序影响
* 资金池余额变化不影响已提交的下注结果

### 重入攻击

**攻击方式**：在资金转移过程中回调合约，重复提取资金。

**防护措施**：

* 所有关键函数使用 `ReentrancyGuard`
* 遵循 Checks-Effects-Interactions 模式

### Oracle 操纵

**攻击方式**：Oracle 在看到下注后修改随机数。

**防护措施**：

* Commit-Reveal 机制：随机数在下注前已通过 commitHash 锁定
* 任何人可验证 `keccak256(R) == commitHash`

### 资金池耗尽

**攻击方式**：通过大量赢注耗尽资金池。

**防护措施**：

* `pendingLockedAmount` 锁定待结算资金
* `maxBet` 限制单笔下注金额
* `maxPoolCap` 限制资金池容量
* 下注金额不能超过可用余额的一定比例

***

## 合约常量

以下是合约中的安全相关常量：

| 常量               | 值     | 说明          |
| ---------------- | ----- | ----------- |
| `MAX_FEE_BPS`    | 900   | 所有者费率上限（9%） |
| `BET_TIMEOUT`    | 300   | 下注超时时间（秒）   |
| `MAX_WIN_RATE`   | 9000  | 最大胜率（90%）   |
| `MIN_WIN_RATE`   | 1000  | 最小胜率（10%）   |
| `MODULO`         | 10000 | 随机数取模基数     |
| `MAX_BATCH_SIZE` | 50    | 最大批量下注数     |

***

## 安全检查清单

对于玩家和投资者，以下是评估游戏安全性的检查清单：

### ✅ 合约层面

* [x] 合约代码是否经过审计？
* [x] 是否使用 ReentrancyGuard？
* [x] 是否使用 SafeERC20？
* [x] 费率是否有上限保护？
* [x] 是否有超时取消机制？

### ✅ 游戏层面

* [x] 游戏是否已去中心化？（🏛️ 标签）
* [x] 代币是否经过安全验证？（✅ 标签）
* [x] 管理员操作日志是否正常？
* [x] 资金池余额是否充足？
* [x] 所有者费率是否合理？

### ✅ 随机数层面

* [x] 使用的是 Oracle 还是 Prevrandao？
* [x] Oracle 模式的 commitHash 是否可验证？
* [x] 历史下注结果是否符合概率分布？

***

## 相关链接

* ⬅️ 返回 [技术深度概览](/ji-shu-gai-lan/ji-shu-shen-du-gai-lan.md)
* 🎲 了解 [Oracle vs Prevrandao](/ji-shu-gai-lan/oracle-vs-prevrandao.md)
* 🏛️ 了解 [去中心化](file:///7303089/game-admin/decentralize.md)
* 🏗️ 了解 [智能合约架构](/ji-shu-gai-lan/zhi-neng-he-yue-jia-gou.md)


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.dapp.meme/ji-shu-gai-lan/you-xi-an-quan-xing.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
