首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >按地址生成随机数(VRF)

按地址生成随机数(VRF)
EN

Stack Overflow用户
提问于 2022-02-22 01:42:55
回答 1查看 181关注 0票数 0

我想知道是否有可能为每个地址生成一个唯一的数字,我尝试了映射,但它不起作用。

代码语言:javascript
复制
contract RandomNumberConsumer is VRFConsumerBase {

bytes32 internal keyHash;
uint256 internal fee;
uint256 public randomResult;


mapping(address => uint) public random;


constructor() 
    VRFConsumerBase(
        0x8C7382F9D8f56b33781fE506E897a4F1e2d17255, // VRF Coordinator
        0x326C977E6efc84E512bB9C30f76E30c160eD06FB  // LINK Token
    )
{
    keyHash = 0x6e75b569a01ef56d18cab6a8e71e6600d6ce853834d4a5748b720d06f878b3a4;
    fee = 0.0001 * 10 ** 18; // 0.0001 LINK (Varies by network)
}

function getRandomNumber() public returns (bytes32 requestId) {
    require(LINK.balanceOf(address(this)) >= fee, "Not enough LINK - fill contract with faucet");
    return requestRandomness(keyHash, fee);
}

function fulfillRandomness(bytes32 requestId, uint256 randomness) internal override {
    randomResult = randomness;
    random[msg.sender] = randomness;
}

}

这是映射

代码语言:javascript
复制
mapping(address => uint) public random;
random[msg.sender] = randomness;

谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-02-22 15:17:01

你和你目前的情况很接近。我已经更新了一些合同,并包括下面的注意事项。主要更改是存储请求id ->地址的新映射。这允许fulfillRandomness函数更新正确的地址-> randomNumber映射。

代码语言:javascript
复制
pragma solidity  ^0.8.0;
import "@chainlink/contracts/src/v0.8/VRFConsumerBase.sol";

contract RandomNumberConsumer is VRFConsumerBase {

    bytes32 internal keyHash;
    uint256 internal fee;
    uint256 public randomResult;

    // ** New mapping to store requests
    mapping(bytes32 => address) public requestIdToAddress;
    mapping(address => uint) public random;


    constructor() 
        VRFConsumerBase(
            0x8C7382F9D8f56b33781fE506E897a4F1e2d17255, // VRF Coordinator
            0x326C977E6efc84E512bB9C30f76E30c160eD06FB  // LINK Token
        )
    {
        keyHash = 0x6e75b569a01ef56d18cab6a8e71e6600d6ce853834d4a5748b720d06f878b3a4;
        fee = 0.0001 * 10 ** 18; // 0.0001 LINK (Varies by network)
    }

    function getRandomNumber() public {
        require(LINK.balanceOf(address(this)) >= fee, "Not enough LINK - fill contract with faucet");
        // ** Store the random request in requestID
        bytes32 requestId = requestRandomness(keyHash, fee);
        // ** Map requestId to the sender's address
        requestIdToAddress[requestId] = msg.sender;
    }

    function fulfillRandomness(bytes32 requestId, uint256 randomness) internal override {
        // ** Find the sender address based on the request
        address _sender = requestIdToAddress[requestId];
        // ** Update sender's mapping for randomness
        random[_sender] = randomness;
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71214991

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档