VRF(可验证随机函数)
我们的扭蛋机使用**可验证随机函数(VRF)**来确保每次抽取都是可证明公平且防篡改的。服务器和用户都无法操纵结果 - 任何人都可以独立验证这一点。
工作原理
VRF结合来自服务器和客户端的熵来生成确定性、可验证的随机数。以下是完整流程:
sequenceDiagram participant User participant Client App participant Server participant Blockchain User->>Client App: 发起扭蛋抽取 Client App->>Server: 请求新的抽取会话 Server->>Server: 生成initialEntropy(nanoid) Server-->>Client App: 返回pullId + initialEntropy Client App->>Client App: 生成clientEntropy(random) Client App->>Blockchain: 发送带有pullId|clientEntropy的支付 Blockchain-->>Server: 支付已确认 Server->>Server: 合并并签名熵 Server->>Server: 哈希 → finalEntropy Server->>Server: 转换为随机数 [1-10000] Server->>Server: 根据层级范围选择奖品 Server-->>Client App: 返回奖品 + VRF证明数据 Client App->>Client App: 验证签名和哈希完整性 User->>User: 可以独立验证结果
VRF过程逐步说明
1. 初始熵(服务器端)
当您发起扭蛋抽取时,服务器使用nanoid生成一个10字符的随机字符串。这在您支付_之前_提交到数据库,防止服务器稍后更改它。
2. 客户端熵(用户端)
您的设备生成自己的随机数据。此熵包含在区块链上的支付交易中,创建服务器无法更改的不可变记录。
3. 合并熵
两个熵源被连接:
combinedEntropy = initialEntropy + clientEntropy4. 签名的合并熵
服务器使用Ed25519(通过TweetNaCl)对合并熵进行签名:
signedCombinedEntropy = Ed25519.sign(combinedEntropy, serverSecretKey)此签名证明服务器处理了您的特定熵值。
5. 最终熵
签名使用SHA-256进行哈希以产生最终熵:
finalEntropy = SHA256(signedCombinedEntropy)6. 随机数生成
最终熵被转换为[1, 10000]范围内的数字:
randomNumber = (BigInt(finalEntropy) % 10000) + 1这为我们提供了精度为0.01%的均匀分布随机数。
7. 奖品层级选择
随机数根据配置的概率范围映射到奖品层级。每个扭蛋机都有自己的层级配置。
为什么这是公平的
flowchart TD
subgraph ServerCantCheat ["服务器无法作弊"]
A[初始熵在<br/>支付前提交] --> B[看到客户端熵后<br/>无法更改]
end
subgraph UserCantCheat ["用户无法作弊"]
C[客户端熵在<br/>区块链交易中] --> D[看到初始熵后<br/>无法更改]
end
subgraph Deterministic ["结果是确定性的"]
E[相同输入始终<br/>产生相同输出] --> F[任何人都可以<br/>验证计算]
end
B --> G[公平结果]
D --> G
F --> G
服务器无法操纵结果 因为:
- 初始熵在您支付之前提交到数据库
- 服务器在提交之前不知道您的客户端熵
- 更改任何内容都会使加密签名无效
用户无法操纵结果 因为:
- 客户端熵嵌入在区块链交易中
- 一旦提交就无法更改
- 服务器的初始熵已经固定
结果是可验证的 因为:
- 所有熵值在抽取后返回给您
- 用于签名验证的公钥已发布
- 任何人都可以重现确切的计算
验证您的结果
每次扭蛋抽取后,您会收到完整的VRF证明数据:
- Initial Entropy - 服务器的随机字符串(在您支付之前提交)
- Client Entropy - 您的随机数据(来自区块链交易)
- Signed Combined Entropy - 服务器的Ed25519签名
- Final Entropy - 签名的SHA-256哈希
- Random Number - 派生数字 [1-10000]
- Prize Tier - 您的抽取落在哪个层级
应用程序会自动验证:
- ✓ 签名与公钥匹配
- ✓ 签名的哈希等于最终熵
- ✓ 随机数计算正确
您也可以使用任何Ed25519和SHA-256实现手动验证。
技术规格
| 组件 | 实现 |
|---|---|
| Initial entropy | nanoid(10) - 10字符随机字符串 |
| Signature algorithm | Ed25519(TweetNaCl) |
| Hash function | SHA-256 |
| Random range | [1, 10000] 包含 |
| Precision | 0.01%(100个基点) |
公钥
用于签名验证的VRF公钥:
i5ScBBvmGh6my9B/X+NpcUIlvRSWz7+U8M7/GprNzYk=这是一个编码为base64的32字节Ed25519公钥。要将其用于验证,请从base64解码以获取原始字节,然后使用任何Ed25519实现(如TweetNaCl)针对此密钥验证签名。