You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何借助Chainlink VRF安全存储随机数?

1. 直接存储随机数会被攻击者获取吗?

会的。链上所有合约存储的数据都是完全公开的——不管你用public还是private修饰变量,攻击者都能通过节点的RPC调用(比如eth_getStorageAt)读取合约存储槽里的内容。private只是Solidity语法层面的限制,阻止外部通过变量名直接访问,但根本藏不住链上数据。所以你把随机数存在公开数组里,攻击者可以直接读取;就算存在私有变量里,一样能被查到。

2. 有没有办法让数据对外不可读?

链上不存在真正“不可读”的数据,因为区块链的本质是公开分布式账本,所有节点都会同步合约存储内容。所以不要试图“隐藏”数据,而是要通过业务流程设计,让随机数在不该被知晓的阶段不被生成或暴露。

3. 猜数字合约的安全解决思路

核心是让随机数的生成时机晚于玩家投注阶段,确保玩家下注时无法预知结果,具体实现步骤可以参考:

  • 投注阶段:玩家提交猜测内容时,要么提交keccak256(abi.encodePacked(猜测数字, 自定义随机盐))的哈希值(同时锁定赌注),要么直接提交猜测数字并锁定资金,但此时不进行结果验证。这个阶段绝不发起VRF随机数请求。
  • 生成随机数:投注期结束后,合约才发起Chainlink VRF请求,获取随机数。
  • 结果验证阶段:随机数返回后,如果玩家之前提交的是哈希,需要让玩家公布对应的随机盐和真实猜测数字,合约先验证哈希匹配,再对比随机数与猜测结果;如果是直接提交的猜测,直接比对即可。
  • 额外提示:随机数生成后,直接用于计算目标数字(比如取模运算),用完可以选择不存储,或者存储但此时投注已经结束,攻击者看到也无法影响结果公平性。

内容的提问来源于stack exchange,提问作者Sobek888

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 09:57:17