已经有了一个相似问题,但它对我没有帮助。因此,我再次问这个问题,并期待一些有用的信息。
两个合同名为AccessControl.sol和Judge.sol。我删除了所有无关的代码,只留下错误的函数,并在调用它时得到相同的错误。
首先,我部署Judge合同并获取它的合同地址。然后我部署了AccessControl协议,传递了Judge协议地址。
最后,我在emitError中调用AccessControl.sol函数,并查看还原错误。
处理AccessControl.emitError错误: VM错误:还原。事务已恢复到初始的备注:如果您发送值,则应支付被调用的函数,而您发送的值应小于当前余额。调试事务以获得更多信息。
我不知道为什么会发生这种事。这是简化的代码。
pragma solidity >=0.4.22 <0.6.0;
contract AccessControl{
address public owner;
Judge public jc;
constructor(address _jc) public {
owner = msg.sender;
jc = Judge(_jc);
}
function emitError(address subject) public returns (uint penalty) {
penalty = jc.misbehaviorJudge(subject, owner, "data", "read", "Too frequent access!", now);
}
}
contract Judge {
function misbehaviorJudge(address _subject, address _object, string memory _resource, string memory _action, string memory _misbehavior, uint _time) public returns (uint);
} pragma solidity >=0.4.22 <0.6.0;
contract Judge {
struct Misbehavior{
address subject; //subject who performed the misbehavior
address device;
string resource;
string action; //action (e.g., "read","write","execute") of the misbehavior
string misbehavior;
uint time; //block timestamp of the Misbehavior ocured
uint penalty; //penalty (number of minitues blocked)
}
mapping (address => Misbehavior[]) public MisbehaviorList;
function misbeaviorJudge(
address _subject,
address _device,
string memory _resource,
string memory _action,
string memory _misbehavior,
uint _time)
public returns (uint penalty)
{
penalty = MisbehaviorList[_subject].length;
MisbehaviorList[_subject].push(Misbehavior(_subject, _device, _resource, _action, _misbehavior, _time, penalty));
}
function getLatestMisbehavior(address _requester) public view
returns (address _subject, address _device, string memory _resource, string memory _action, string memory _misbehavior, uint _time)
{
uint latest = MisbehaviorList[_requester].length - 1;
_subject = MisbehaviorList[_requester][latest].subject;
_device = MisbehaviorList[_requester][latest].device;
_resource = MisbehaviorList[_requester][latest].resource;
_action = MisbehaviorList[_requester][latest].action;
_misbehavior = MisbehaviorList[_requester][latest].misbehavior;
_time = MisbehaviorList[_requester][latest].time;
}
}发布于 2019-12-27 10:12:45
您已经声明了函数misbehaviorJudge。
但是您已经实现了函数misbeaviorJudge。
因此,在我看来,您正在尝试调用一个未实现的函数。
下一次您可以通过几种方法避免类似的问题(更准确地说,将其从难以调查的运行时问题转换为易于调查的编译问题):
misbehaviorJudge:Judge:文件IJudge.sol:
interface IJudge {
function misbehaviorJudge(...) external returns (uint);文件Judge.sol:
import "./IJudge.sol";
contract Judge is IJudge {
...
}misbehaviorJudge:Judge:文件IJudge.sol:
contract IJudge {
function misbehaviorJudge(...) public returns (uint);文件Judge.sol:
import "./IJudge.sol";
contract Judge is IJudge {
...
}然后(对于这两个选项),在AccessControl.sol文件中,只需使用IJudge而不是Judge:
import "./IJudge.sol";
contract AccessControl {
IJudge public jc;
...
}https://ethereum.stackexchange.com/questions/78536
复制相似问题