跳转到内容

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 + clientEntropy

4. 签名的合并熵

服务器使用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证明数据:

  1. Initial Entropy - 服务器的随机字符串(在您支付之前提交)
  2. Client Entropy - 您的随机数据(来自区块链交易)
  3. Signed Combined Entropy - 服务器的Ed25519签名
  4. Final Entropy - 签名的SHA-256哈希
  5. Random Number - 派生数字 [1-10000]
  6. Prize Tier - 您的抽取落在哪个层级

应用程序会自动验证:

  • ✓ 签名与公钥匹配
  • ✓ 签名的哈希等于最终熵
  • ✓ 随机数计算正确

您也可以使用任何Ed25519和SHA-256实现手动验证。

技术规格

组件实现
Initial entropynanoid(10) - 10字符随机字符串
Signature algorithmEd25519(TweetNaCl)
Hash functionSHA-256
Random range[1, 10000] 包含
Precision0.01%(100个基点)

公钥

用于签名验证的VRF公钥:

i5ScBBvmGh6my9B/X+NpcUIlvRSWz7+U8M7/GprNzYk=

这是一个编码为base64的32字节Ed25519公钥。要将其用于验证,请从base64解码以获取原始字节,然后使用任何Ed25519实现(如TweetNaCl)针对此密钥验证签名。