![](/img/trans.png)
[英]solidity : error information Source file requires different compiler version
[英]Solidity: Abstract contract and override VRFConsumerBase compiler/version/import issues
我想通过is VRFConsumerBase
在合同中指定它并覆盖fulfillRandomness
function,从而从VRFConsumerBase.sol
中提取 RNG。
使用pragma solidity ^0.6.6;
和 VRF 的Ownable.sol
以及AggregatorV3Interface.sol
和v0.6
我在编辑器或编译时遇到两个错误:
Contract "Lottery" should be marked as abstract.
Function has override specified but does not override anything.
当将VRFConsumerBase.sol
的版本从v0.7
v0.6
,这两个问题都会消失。
然后在编译时我得到提示版本和编译器问题。 我升级到指定版本0.7.0
,然后提示其他导入的多个其他编译器版本错误。
我修复了所有这些解决方案, 0.7.0
我的代码看起来不错,没有任何可见错误。
然后我再次编译,初始抽象和覆盖错误在终端中显示为CompilerErrors
但不再在编辑器中显示。
我猜这是一个编译器版本和导入的代码版本冲突,但在多次来回尝试之后,这似乎是一个悖论,因为版本不交互或者当它们交互时我再次提示初始错误。
在这里,我略微剥离的Lottery.sol
代码片段抛出了错误:
(重点:契约/构造函数/fulfillRandomness)
// SPDX-License-Identifier: MIT
pragma solidity ^0.6.6;
import "@chainlink/contracts/src/v0.6/interfaces/AggregatorV3Interface.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
import "@chainlink/contracts/src/v0.6/VRFConsumerBase.sol";
contract Lottery is VRFConsumerBase, Ownable {
address payable[] public players;
address public recentWinner;
uint256 public usdEntryFee;
AggregatorV3Interface internal ethUsdPriceFeed;
uint256 public fee;
bytes32 public keyHash;
enum LOTTERY_STATE {
OPEN,
CLOSED,
CALCULATING_WINNER
}
LOTTERY_STATE public lottery_state;
constructor(
address _priceFeedAddress,
address _vrfCoordinator,
address _link,
uint256 _fee,
bytes32 _keyHash
) public VRFConsumerBase(_vrfCoordinator, _link) {
fee = _fee;
keyHash = _keyHash;
lottery_state = LOTTERY_STATE.CLOSED;
usdEntryFee = 50 * (10**18);
ethUsdPriceFeed = AggregatorV3Interface(_priceFeedAddress);
}
function endLottery() public onlyOwner {
lottery_state = LOTTERY_STATE.CALCULATING_WINNER;
requestRandomness(keyHash, fee);
}
function fulfillRandomness(uint256 _requestId, bytes32 _randomness)
internal
override
{
// WINNER SELECTION
uint256 indexOfWinner = uint256(_randomness) % players.length;
recentWinner = players[indexOfWinner];
payable(recentWinner).transfer(address(this).balance);
}
}
(这是来自 freeCodeCamp Solidity Python 教程的第 7 课)
正如我刚刚发现的那样,任何在某个时候遇到类似问题的人都与任何代码/导入/VRF 的版本无关,这只是在中定义类型的错误
function fulfillRandomness(uint256 _requestId, bytes32 _randomness) {}
实际上应该是:
function fulfillRandomness(bytes32 _requestId, uint256 _randomness) {}
意思是查看您的代码和发布在该问题上的其他主题。
(抽象是固定的,因为覆盖是固定的,这是通过使两个函数看起来基本相同来固定的)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.