Random 智能合约-Chainlink VRF/@openzeppelin/truffle升级兼容性

Random 智能合约-Chainlink VRF/@openzeppelin/truffle升级兼容性,random,numbers,solidity,truffle,chainlink,Random,Numbers,Solidity,Truffle,Chainlink,现在,我正在使用 因此,我遵循了文档中的所有必要步骤,但还有一个问题: Truffle升级要求我使用初始值设定项替换构造函数,这对我来说很好,但对于导入到我自己的智能合约中的智能合约,则不适用,示例: pragma solidity 0.6.6; import "@chainlink/contracts/src/v0.6/VRFConsumerBase.sol"; contract Sample is VRFConsumerBase { address

现在,我正在使用

因此,我遵循了文档中的所有必要步骤,但还有一个问题:

Truffle升级要求我使用初始值设定项替换构造函数,这对我来说很好,但对于导入到我自己的智能合约中的智能合约,则不适用,示例:

pragma solidity 0.6.6;

import "@chainlink/contracts/src/v0.6/VRFConsumerBase.sol";

contract Sample is VRFConsumerBase {
    
    address private owner;
    
    bytes32 internal keyHash;
    uint256 internal fee;
    
    constructor(address _owner)
        VRFConsumerBase(
            0xa555fC018435bef5A13C6c6870a9d4C11DEC329C, // VRF Coordinator
            0x84b9B910527Ad5C03A9Ca831909E21e236EA7b06  // LINK Token
        ) public
    {
        keyHash = 0xcaf3c3727e033261d383b315559476f48034c13b18f8cafed4d871abe5049186;
        fee = 0.1 * 10 ** 18; // 0.1 LINK (Varies by network)
        
        owner = _owner;
    }

    ...
因此块菌抱怨:

../@chainlink/contracts/src/v0.6/VRFConsumerBase.sol:182: Contract `VRFConsumerBase` has a constructor
Define an initializer instead
由于它是第三方软件包,我无法替换它:)

是否有任何架构技巧/配置

我浏览了几乎所有关于chainlink/truffle的文档,但没有找到解决这个问题的方法

谢谢

更新1:

首先,我将VRFConsumerBase合同修改为:(我还删除了注释以保持简短…)

重要提示:

我没有通过solidity中的导入声明导入可初始化的合同

相反,我手动复制了源代码并将编译器设置为0.6.12,因为@openzeppelin/contracts upgradeable/proxy/utils/Initializable.sol在0.8.x上运行

最后,我更新了我的合同以实现可初始化和新的VRFConsumerBaseUpgradable合同:

// SPDX-License-Identifier: MIT
pragma solidity 0.6.12;

import "./Initializable.sol";
import "./VRFConsumerBaseUpgradable.sol";

contract Sample is Initializable, VRFConsumerBaseUpgradable {

    bytes32 internal keyHash;
    uint256 internal fee;
    
    address private owner;
    
    function initialize(address _owner)
        public
        initializer
    {
        VRFConsumerBaseUpgradable.initialize(
            0xa555fC018435bef5A13C6c6870a9d4C11DEC329C, // VRF Coordinator
            0x84b9B910527Ad5C03A9Ca831909E21e236EA7b06  // LINK Token
        );

        keyHash = 0xcaf3c3727e033261d383b315559476f48034c13b18f8cafed4d871abe5049186;
        fee = 0.1 * 10 ** 18; 
        
        owner = _owner;
    }

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

    function fulfillRandomness(bytes32 requestId, uint256 randomness) internal override {
        // logic
    }

    ...
    
}
我测试了初始迁移以及通过块菌进行的升级,两者都有效,所以我认为这很好,我将把这个留给未来的研究人员


你觉得怎么样?我应该为VRFConsumerBaseUpgradable创建合并请求吗?

好问题。答案可能有点技术性。你可以调用你的构造函数,为这两个变量设置空格,然后让你的初始值设定器实际设置它们。有没有一种方法可以通过查看构造函数来覆盖truffle?如果没有,我们可以将其添加到插件中。感谢您的回答@PatrickCollins。不幸的是,块菌需要我完全删除构造函数。。。我也不能覆盖块菌核心逻辑,因为还有更多的逻辑依赖于它。你说你可以把它添加到插件中是什么意思?我是说你可以升级插件以允许修改器。您可以做的另一件事(这可能更容易)是使用您自己的自定义vrfconsumerbase。这样,您只需要一个初始值设定项函数而不是构造函数。你知道怎么做吗?只需将vrfconsumerbase的代码复制到您的代码中并修改itAlright,谢谢您的更新。我将处理代码库,并使用新版本的智能合约/VRFConsumerBase/更新问题Initializable@PatrickCollins我更新了源代码并创建了一个新的VRFConsumerBaseUpgradable。。你认为这种方法怎么样?基本上,开发者现在可以在使用chainlink时升级他们的智能合约。
// SPDX-License-Identifier: MIT
pragma solidity 0.6.12;

abstract contract Initializable {

    bool private _initialized;

    bool private _initializing;

    modifier initializer() {
        require(_initializing || !_initialized, "Initializable: contract is already initialized");

        bool isTopLevelCall = !_initializing;
        if (isTopLevelCall) {
            _initializing = true;
            _initialized = true;
        }

        _;

        if (isTopLevelCall) {
            _initializing = false;
        }
    }
}
// SPDX-License-Identifier: MIT
pragma solidity 0.6.12;

import "./Initializable.sol";
import "./VRFConsumerBaseUpgradable.sol";

contract Sample is Initializable, VRFConsumerBaseUpgradable {

    bytes32 internal keyHash;
    uint256 internal fee;
    
    address private owner;
    
    function initialize(address _owner)
        public
        initializer
    {
        VRFConsumerBaseUpgradable.initialize(
            0xa555fC018435bef5A13C6c6870a9d4C11DEC329C, // VRF Coordinator
            0x84b9B910527Ad5C03A9Ca831909E21e236EA7b06  // LINK Token
        );

        keyHash = 0xcaf3c3727e033261d383b315559476f48034c13b18f8cafed4d871abe5049186;
        fee = 0.1 * 10 ** 18; 
        
        owner = _owner;
    }

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

    function fulfillRandomness(bytes32 requestId, uint256 randomness) internal override {
        // logic
    }

    ...
    
}