首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >VM错误:如果您发送值,而您发送的值应小于当前余额,则应支付revert.The调用的函数。

VM错误:如果您发送值,而您发送的值应小于当前余额,则应支付revert.The调用的函数。
EN

Ethereum用户
提问于 2019-12-27 09:28:55
回答 1查看 4.6K关注 0票数 0

已经有了一个相似问题,但它对我没有帮助。因此,我再次问这个问题,并期待一些有用的信息。

两个合同名为AccessControl.solJudge.sol。我删除了所有无关的代码,只留下错误的函数,并在调用它时得到相同的错误。

首先,我部署Judge合同并获取它的合同地址。然后我部署了AccessControl协议,传递了Judge协议地址。

最后,我在emitError中调用AccessControl.sol函数,并查看还原错误。

处理AccessControl.emitError错误: VM错误:还原。事务已恢复到初始的备注:如果您发送值,则应支付被调用的函数,而您发送的值应小于当前余额。调试事务以获得更多信息。

我不知道为什么会发生这种事。这是简化的代码。

AccessControl.sol

代码语言:javascript
复制
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);
}

Judge.sol

代码语言:javascript
复制
 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;
    }
}
EN

回答 1

Ethereum用户

回答已采纳

发布于 2019-12-27 10:12:45

您已经声明了函数misbehaviorJudge

但是您已经实现了函数misbeaviorJudge

因此,在我看来,您正在尝试调用一个未实现的函数。

下一次您可以通过几种方法避免类似的问题(更准确地说,将其从难以调查的运行时问题转换为易于调查的编译问题):

选项#1 -如果不需要调用契约内的函数misbehaviorJudgeJudge:

文件IJudge.sol

代码语言:javascript
复制
interface IJudge {
    function misbehaviorJudge(...) external returns (uint);

文件Judge.sol

代码语言:javascript
复制
import "./IJudge.sol";

contract Judge is IJudge {
    ...
}

选项2-如果您确实需要调用契约内的函数misbehaviorJudgeJudge:

文件IJudge.sol

代码语言:javascript
复制
contract IJudge {
    function misbehaviorJudge(...) public returns (uint);

文件Judge.sol

代码语言:javascript
复制
import "./IJudge.sol";

contract Judge is IJudge {
    ...
}

然后(对于这两个选项),在AccessControl.sol文件中,只需使用IJudge而不是Judge

代码语言:javascript
复制
import "./IJudge.sol";

contract AccessControl {
    IJudge public jc;
    ...
}
票数 1
EN
页面原文内容由Ethereum提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://ethereum.stackexchange.com/questions/78536

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档