100%区块链。0%服务器。
每次下注、每个随机数、每次支付都可以在区块链上验证。我们无法欺骗你,因为我们没有这样做的基础设施。
智能合约实时赔率
这些赔率直接从区块链实时读取。没有公开交易就无法更改它们。
你的获胜率
50.0%
对战庄家
庄家获胜率
50.0%
庄家游戏
庄家优势
0.0%
公平(0%)
P2P游戏始终是50/50
当你与其他玩家(而非庄家)对战时,赔率精确为50/50,没有庄家优势。合约代码证明了这一点。
在链上验证这些赔率
0x10ff96bf...f04751cf
Chainlink VRF 工作原理
你下注
当你下注时,智能合约锁定你的资金并调用Chainlink VRF请求随机数。此时没有人知道结果。
playHouseGame(betAmount) → requestRandomWords(roomId)VRF预言机接收请求
Chainlink的去中心化预言机网络接收请求。多个独立的节点运营商参与生成随机数。
VRFCoordinator.requestRandomWords(keyHash, subId, confirmations, gasLimit, numWords)生成加密随机性
Chainlink使用加密证明生成256位随机数。这个数字可以在链上验证,没有人能预测。
randomWords[0] → 256-bit cryptographically secure random number确定赢家并支付
随机数用于确定赢家(例如硬币翻转的奇/偶)。智能合约自动将奖金转给赢家。
winner = randomWords[0] % 2 == 0 ? playerA : playerB数学公平性保证
Chainlink VRF生成256位加密安全随机数。这个数字对于二元结果具有数学上完美的50/50分布。
256位随机数
一个真正随机的256位数字有精确50%的概率以0(偶数)结尾,50%的概率以1(奇数)结尾。这是数学事实,不是近似值。
取模运算
randomWords[0] % 2我们使用模2(% 2)来确定赢家。如果随机数是偶数,结果是0。如果是奇数,结果是1。
0
偶数
Player A wins
1
奇数
Player B wins
加密证明防止操纵
Chainlink VRF为每个随机数都包含加密证明。此证明验证数字是正确生成的 - 即使VRF节点运营商也无法选择特定结果。
房间创建者 = 房间加入者
一个常见问题:创建房间会给你优势吗?答案是否定的。以下是为什么两个玩家有完全相同的赔率:
房间创建者(玩家A)
- 创建房间并设置投注金额
- 分配到结果0(偶数)
- 等待对手加入
获胜概率
房间加入者(玩家B)
- 加入现有房间
- 分配到结果1(奇数)
- 触发游戏开始
获胜概率
为什么数学上相等
随机数是在两个玩家都加入后才生成的。任何玩家都无法影响结果。由于偶数和奇数在任何随机集合中均匀分布,两种结果都有精确50%的概率。创建房间不会给予任何优势。
// 玩家A在random % 2 == 0时获胜(50%)
// 玩家B在random % 2 == 1时获胜(50%)
// 分配是任意的 - 两个位置都没有优势为什么零服务器很重要
传统在线赌场
- ✗服务器控制随机数生成器
- ✗后端可以实时调整赔率
- ✗你无法验证游戏结果
- ✗庄家总有隐藏优势
PeetBet(100%区块链)
- Chainlink VRF生成随机数
- 赔率存储在链上且不可更改
- 每个游戏结果都可公开验证
- 代码就是法律 - 没有隐藏操纵
自己验证
你不必信任我们。以下是验证任何游戏结果的方法:
前往Etherscan
在Etherscan上打开合约地址。所有交易和事件都是公开的。
找到游戏交易
查找你游戏的交易哈希。你可以在钱包历史记录中找到它。
检查VRF回调
找到fulfillRandomWords事件。这显示了使用的确切随机数。
验证数学
使用随机数验证结果:randomWord % 2 = 0 表示玩家A赢,1表示玩家B赢。
实际合约代码
这是决定赢家的真实代码。它部署在以太坊上,无法更改。
// Winner determination logic (from PeetBet.sol)
function fulfillRandomWords(uint256 requestId, uint256[] calldata randomWords) internal {
uint256 roomId = requestIdToRoomId[requestId];
GameRoom storage room = rooms[roomId];
address winner;
if (room.isHouseGame && houseEdgeBps > 0) {
// House game with edge: use 10000-based calculation
uint256 userWinThreshold = 5000 - (houseEdgeBps / 2);
uint256 randomResult = randomWords[0] % 10000;
winner = randomResult < userWinThreshold ? room.playerA : room.playerB;
} else {
// P2P or house game with no edge: pure 50/50
uint256 randomResult = randomWords[0] % 2;
winner = randomResult == 0 ? room.playerA : room.playerB;
}
room.winner = winner;
balances[winner] += (room.betAmount * 2);
emit GameResult(roomId, winner);
}