一个将链上游戏与 DeFi 借贷融合的 Solidity 实验项目——用智能合约实现经典斗地主卡牌对战,同时构建类 Aave 的去中心化借贷池,让游戏资产与金融协议在链上无缝衔接。
本项目探索区块链上游戏与金融的交叉场景,包含两大核心模块:
- 斗地主游戏 — 将经典三人斗地主搬上链,实现玩家注册、对局创建、角色分配(地主/农民)及牌组管理,让卡牌对局完全由合约驱动、公开透明。
- DeFi 借贷池 — 参照 Aave 协议设计,实现 aToken 利息代币、储备资产管理与利率策略,为游戏资产提供存款生息与抵押借贷能力,打通游戏经济与 DeFi 的边界。
Solidity-Game/
├── FightLandlord.sol # 斗地主游戏主合约
├── Card.sol # 扑克牌牌组合约
├── AToken.sol # 利息代币(aToken)合约
├── LendingPool.sol # 借贷池核心逻辑(待实现)
├── LendingPoolStorage.sol # 借贷池数据存储合约
├── InterestRateStrategy.sol # 利率策略合约(待实现)
├── ProFileSatus.sol # 概率计算与抽奖合约
└── user.sol # 用户合约(待实现)
游戏主合约,包含以下子合约:
| 合约 | 说明 |
|---|---|
UserBaseData |
玩家基础数据(年龄、姓名、地址、余额) |
GamePlayer |
玩家对局数据,包含角色(地主/农民)和状态(准备/游戏中/已结束) |
Game |
单局对局合约,管理对局状态 |
FightLandlord |
游戏入口合约,管理对局和玩家注册 |
- 角色(Role):
Landlord(地主)/Farmer(农民) - 状态(Status):
Ready(准备)/InGame(游戏中)/End(已结束)
register()— 玩家注册,初始余额 1000createGame(gameId)— 创建新对局isLogin修饰器 — 检查玩家是否已注册
扑克牌数据结构,定义了:
- 花色(suits):黑桃(Spades)、红心(Hearts)、方块(Diamonds)、梅花(Clubs)
- 点数(ranks):2 ~ A(共 13 级)
Hand合约 — 创建和管理一副 52 张牌组
利息代币合约,基于 OpenZeppelin 的 ERC20 和 AccessControl:
- 铸造(
mint)和销毁(burn)仅限 LendingPool 调用 - 支持底层资产(underlying asset)的安全转账
- 角色权限控制:
MINTER_ROLE、BURNER_ROLE、DEFAULT_ADMIN_ROLE
借贷池数据存储合约,管理:
- 储备资产数据(ReserveData):aToken 地址、利率策略、流动性、借贷量、利率指数等
- 用户借贷数据(UserBorrowData):本金余额、借贷指数、累计利息
- 用户存款数据:按储备资产和用户地址映射
主要功能:
| 函数 | 说明 |
|---|---|
initReserve() |
初始化储备资产 |
updateReserveState() |
更新储备资产利率状态 |
updateReserveTotalBorrows() |
更新总借贷量 |
updateReserveLiquidity() |
更新流动性 |
updateUserBorrow() |
更新用户借贷数据 |
updateUserDeposit() |
更新用户存款数据 |
提供基于二项式分布的概率计算:
binomialDistribution(n)— 计算二项分布概率(默认 10% 概率)combination(n, k)— 计算组合数 C(n, k)
可用于游戏中的抽奖、掉落概率等场景。
- Solidity
^0.7.4(游戏模块)/^0.8.0(DeFi 模块) - OpenZeppelin — ERC20、AccessControl、Ownable、SafeERC20
npm installnpx hardhat compilenpx hardhat test| 模块 | 状态 |
|---|---|
| 斗地主游戏 | 🟡 基础框架完成 |
| Card 牌组 | 🟡 基础框架完成 |
| AToken | 🟢 核心功能完成 |
| LendingPoolStorage | 🟢 核心功能完成 |
| LendingPool | 🔴 待实现 |
| InterestRateStrategy | 🔴 待实现 |
| user | 🔴 待实现 |
| ProFileSatus | 🟡 基础功能完成 |
- 游戏模块:GPL-3.0
- DeFi 模块:MIT