首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >气体不足,不能正常运行

气体不足,不能正常运行
EN

Ethereum用户
提问于 2017-01-02 09:24:56
回答 1查看 587关注 0票数 3

我是个新来的人,我正在为我的项目写一份聪明的合同。我使用Win 10和Mist 0.8.8,测试网以"R“开头。

合同代码具有更改状态和修改的功能,但是在启动合同后,无法运行它的任何功能。将显示以下错误。非常感谢!

合同代码如下所示:非常感谢!

代码语言:javascript
复制
pragma solidity ^0.4.6;
contract FairTrade {

    /* Variables */
    address public creater;
    address public trader;
    address public framer;
    address public preieumHandler;

    /* State handling */
    enum State { Paying, Transporting, Received, Completed }
    State public state;

    /* Contructor */
    function FairTrade(address _trader, address _framer, address _preieumHandler,
      uint _price, uint _quantity) {
        creater = msg.sender;
        trader = _trader;
        framer = _framer;
        preieumHandler = _preieumHandler;

    }

    /* Modifiers */    
    modifier onlyFramer {
        if (msg.sender != framer) throw ; else _;
    }

    modifier onlyTrader {
        if (msg.sender != trader) throw; else _;
    }

    modifier inState(State s) {
        if (state != s) throw; else _;
    }

    modifier notInState(State s) {
        if (state == s) throw; else _;
    }

    /* Functions */    
    function completedPaid() onlyTrader {
        state = State.Transporting;
    }    

    function receivedGood() inState(State.Transporting) onlyFramer {
        state = State.Received;
    }

    function paid() inState(State.Received) {
        state = State.Completed;
    }
}
EN

回答 1

Ethereum用户

发布于 2017-01-02 10:40:28

Testnet的名称是Ropsten。

从第一个映像中的原始数据0x295b4e17,您正在尝试执行paid()函数。

我检查了geth命令行中的每个函数签名,并匹配了以下签名:

代码语言:javascript
复制
> web3.sha3("paid()").substring(0, 10)
"0x295b4e17"

这个paid()函数有修饰符inState(State.Received),这个修饰符会抛出一个错误,当前的state变量不是State.Received

您正在显示的警告是因为Mist模拟了您试图执行的调用,并且确定调用paid()将失败,因为当前的state变量没有设置为State.Received

要测试您的功能,您可以:

  1. 添加其他函数(S)将您的工作流状态移动到State.Received;或
  2. inState(State.Received)函数中删除paid()修饰符。

我建议首先尝试2.以上,这样您就可以确定是否可以成功地执行paid()函数。一旦您确认没有修饰符的paid()函数成功执行,则创建其他require函数,以便当带修饰符的paid()工作时,将您的契约state移动到State.Received

更新响应

下面的评论

问:我应该使用uint作为记录ehter发送的变量类型吗?

答:uint (即uint256)适合记录醚的数量。

问:当我把1以太送去合同时,它显示的是1000000000瓦特。

1乙醚是1 e18或1,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000。在geth中:

代码语言:javascript
复制
> 1e18
1000000000000000000
> web3.fromWei(1e18,"ether")
"1"
> web3.toWei(1,"ether")
"1000000000000000000"

问:最后,我想学习cml来运行合同。你有推荐给我的链接吗?

答:如果cml引用命令行,即使用geth命令行,则在以下位置有一些逐步指南:

您还可能希望查看浏览器的可靠性--参见如何从合同调用库函数?=> [错误]合同代码无法存储,请检查您的气量。未定义中的一个示例。

票数 2
EN
页面原文内容由Ethereum提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

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

复制
相关文章

相似问题

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