我从合约中的构造函数中收到 false Transaction mined butexecution failed 错误。我只是将部署合约的地址保存在经理变量中,而不是向该帐户发送任何资金。
// SPDX-License-Identifier: GPL-3.0
pragma solidity ^0.8.20;
contract Lottery{
address public manager;
address[] public players;
constructor() public {
manager = msg.sender;
}
function enter()public payable{
require(msg.value > 0.1 ether);
players.push(msg.sender);
}
//Random number generator function.
function random()private view returns (uint){
return uint(keccak256(abi.encodePacked(block.difficulty, block.timestamp, players)));
}
function pickWinner()public{
uint index = random() % players.length;
address contractAddress = address(this);
payable(players[index]).transfer(contractAddress.balance);
}
}
在solidity v0.7之后,它说不需要构造函数的可见性,所以我尝试删除
public
可见性。我也尝试使用 payable
可见性 constructor()
但仍然遇到相同的错误。
确保evm(以太坊虚拟机)版本和VM(虚拟机)/环境相同。
这种情况下的常见检查点是确保VM(虚拟机)/环境和EVM(以太坊虚拟机)版本应该相同。
试试下面这个
// SPDX-License-Identifier: GPL-3.0
pragma solidity ^0.8.20;
contract Lottery {
address public manager;
address[] public players;
constructor() {
manager = msg.sender;
}
function enter() public payable {
require(msg.value > 0.1 ether);
players.push(msg.sender);
}
// Random number generator function.
function random() private view returns (uint) {
return uint(keccak256(abi.encodePacked(block.difficulty, block.timestamp, players)));
}
function pickWinner() public {
uint index = random() % players.length;
address payable winner = payable(players[index]);
uint contractBalance = address(this).balance;
winner.transfer(contractBalance);
players = new address[](0); // Reset the player array for a new round
}
}