![](/img/trans.png)
[英]Error: Returned error: VM Exception while processing transaction: revert only owner can call this function
[英]Returned error: VM Exception while processing transaction: revert only owner can call this function
我正在尝试使用“松露测试”测试此合同,但它显示以下错误:错误:返回错误:处理事务时的 VM 异常:还原只有所有者可以调用此 function - - 给出的原因:只有所有者可以调用此 function。
问题 打开 test 文件夹中的 TestGaming.sol 合约。 为 function 提取资金编写一个测试。 您的测试应该检查调用withdrawFunds function 的所有者的余额。 您的测试还应该验证所有者的余额是否增加了 10 以太币。
游戏.sol
pragma solidity ^0.5.0;
contract Gaming {
/* Our Online gaming contract */
address public owner;
bool public online;
struct Player {
uint wins;
uint losses;
}
mapping (address => Player) public players;
constructor() public payable {
owner = msg.sender;
online = true;
}
modifier isOwner() {
require(msg.sender == owner, "Only owner can call this function");
_;
}
event GameFunded(address funder, uint amount);
event PlayerWon(address player, uint amount, uint mysteryNumber, uint displayedNumber);
event PlayerLost(address player, uint amount, uint mysteryNumber, uint displayedNumber);
function mysteryNumber() internal view returns (uint) {
uint randomNumber = uint(blockhash(block.number-1))%10 + 1;
return randomNumber;
}
function determineWinner(uint number, uint display, bool guess) public pure returns (bool) {
if (guess == true && number > display) {
return true;
} else if (guess == true && number < display) {
return false;
} else if (guess == false && number > display) {
return false;
} else if (guess == false && number < display) {
return true;
}
}
function winOrLose(uint display, bool guess) external payable returns (bool, uint) {
/* Use true for a higher guess, false for a lower guess */
require(online == true, "The game is online");
require(msg.sender.balance > msg.value, "Insufficient funds");
uint mysteryNumber_ = mysteryNumber();
bool isWinner = determineWinner(mysteryNumber_, display, guess);
Player storage player = players[msg.sender];
/* Player Won */
if (isWinner == true) {
player.wins += 1;
msg.sender.transfer(msg.value * 2);
emit PlayerWon(msg.sender, msg.value, mysteryNumber_, display);
return (true, mysteryNumber_);
/* Player Lost */
} else if (isWinner == false) {
player.losses += 1;
emit PlayerLost(msg.sender, msg.value, mysteryNumber_, display);
return (false, mysteryNumber_);
}
}
}
测试游戏.sol
pragma solidity ^0.5.0;
import "truffle/Assert.sol";
import "truffle/DeployedAddresses.sol";
import "../contracts/Gaming.sol";
contract TestGaming {
uint public initialBalance = 10 ether;
Gaming gaming;
address owner;
function beforeAll() public {
gaming = Gaming(DeployedAddresses.Gaming());
owner = gaming.owner();
}
function testWithdrawFunds() public {
uint ownerBalanceBefore = owner.balance;
gaming.withdrawFunds();
uint ownerBalanceAfter = owner.balance;
Assert.equal (initialBalance, ownerBalanceAfter - ownerBalanceBefore, "The owner's balance should have increased by 10 ether");
}
function testPlayerWonGuessHigher() public {
bool expected = true;
bool result = gaming.determineWinner(5, 4, true);
Assert.equal(expected, result, "The player should have won by guessing the mystery number was higher than their number");
}
function testPlayerWonGuessLower() public {
bool expected = true;
bool result = gaming.determineWinner(5, 6, false);
Assert.equal(expected, result, "The player should have won by guessing the mystery number was lower than their number");
}
function testPlayerLostGuessLower() public {
bool expected = false;
bool result = gaming.determineWinner(5, 4, false);
Assert.equal(expected, result, "The player should have lost by guessing the mystery number was lower than their number");
}
function testPlayerLostGuessHigher() public {
bool expected = false;
bool result = gaming.determineWinner(5, 6, true);
Assert.equal(expected, result, "The player should have lost by guessing the mystery number was higher than their number");
}
}
错误
问题是您正在通过另一个合同测试您的合同。 由于 function withdraw
要求调用者是合约的owner
,即合约的部署者,因此由于TestGaming.sol
正在调用 function,因此检查失败; TestGaming.sol
不是Gaming
合约的部署者。
您必须从TestGaming
合约内部实例化Gaming
合约。
pragma solidity ^0.5.0;
import "truffle/Assert.sol";
import "truffle/DeployedAddresses.sol";
import "../contracts/Gaming.sol";
contract TestGaming {
uint public initialBalance = 10 ether;
Gaming gaming;
address owner;
function beforeAll() public {
//---Instead of grabbing Gaming address, deploy it fresh for the test
gaming = new Gaming();
owner = gaming.owner();
}
function testWithdrawFunds() public {
uint ownerBalanceBefore = owner.balance;
gaming.withdrawFunds();
uint ownerBalanceAfter = owner.balance;
Assert.equal (initialBalance, ownerBalanceAfter - ownerBalanceBefore, "The owner's balance should have increased by 10 ether");
}
.
.
.
}
这样, TestGaming
将成为Gaming
的部署者和owner
,测试将通过。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.