为什么我收到此错误? "气体估算错误,并显示以下信息(见下文)。该交易>执行可能会失败"

时间:2018-05-05 17:05:16

标签: blockchain ethereum smartcontracts remix

尝试使用Remix IDE测试可靠性。我一直收到错误:

  

气体估算错误地显示以下信息(见下文)。该交易>执行可能会失败。你想强行发送吗?

是否有人知道可能会给我这个错误的内容。我试图使用以太坊智能合约销售产品。我使用Remix IDE创建了这个合约,其值为0。 我已成功创建合同和add_product但我无法购买。最后一行给出了上面提到的错误。

我正在测试的可靠性文件如下:正如您所看到的,我创建了一个销售合同,允许用户使用区块链和买方销售产品,以检索在以太坊中支付价格的产品。如果有人有更好的解决方案让我使用这个确切的用例,我会接受建议。

pragma solidity ^0.4.0;

contract Sell {

    struct Product_Quantity{
        string _product_name;  
        uint256 _product_quantity;        
        uint256 _price_unity; 
        bool isValue;
    }
    struct Seller{
        address _id;
        mapping(string => Product_Quantity) products; 

    }

    Seller public seller;
    mapping (address => Product_Quantity) product_owners;

    function Sell(){
        seller._id = msg.sender;
    }
    function add_product(string product_name, uint256 product_quantity, uint256 price_unity) {        
        if(msg.sender != seller._id) throw;
        if(seller.products[product_name].isValue){
            seller.products[product_name]._product_quantity += product_quantity;
        }
        else{
            seller.products[product_name] = Product_Quantity(product_name, product_quantity, price_unity, true); 
        }
    }

    function Buy( string product_name, uint256 quantity) payable {


        if(product_owners[msg.sender].isValue){
            product_owners[msg.sender]._product_quantity += quantity; 
        }
        else{
            product_owners[msg.sender] = Product_Quantity(product_name, quantity, seller.products[product_name]._price_unity, true);

        }
        seller.products[product_name]._product_quantity -= quantity;
        seller._id.transfer(seller.products[product_name]._price_unity * quantity);


    }
}

3 个答案:

答案 0 :(得分:0)

这是一个非常通用的Remix错误消息。幸运的是,今天我在Remix上看到了新的错误信息(很好的更新人员!),这使得调试问题变得更加容易。

当有人试图购买产品时,您应该检查通过的价值(以韦为单位)是否适合购买该产品和数量。

由于您没有检查,买家可以购买amou​​t等于0的产品,这意味着合约在buy()函数结束时没有wei发送给卖家。这将抛出一个异常,交易将被还原。

我更新了你的代码,运行在solidity 0.4.23(最新版本)上,进行了一些代码重构,并在buy()函数中添加了一个修饰符来检查传递的数量是否正确。

pragma solidity ^0.4.23;

contract Sell {

    struct Product_Quantity{
        string _product_name;  
        uint256 _product_quantity;        
        uint256 _price_unity; 
        bool isValue;
    }

    mapping (address => Product_Quantity) product_owners;

    struct Seller{
        address _id;
        mapping(string => Product_Quantity) products;
    }

    Seller public seller;

    constructor() public {
        seller._id = msg.sender;
    }

    function add_product (string product_name, uint256 product_quantity, uint256 price_unity) public {        
        require(msg.sender == seller._id);
        if (seller.products[product_name].isValue) {
            seller.products[product_name]._product_quantity += product_quantity;
        }
        else{
            seller.products[product_name] = Product_Quantity(product_name, product_quantity, price_unity, true); 
        }
    }

    modifier hasEnoughEther (string product_name, uint256 quantity) {
        require (seller.products[product_name].isValue);  // does the product exists?
        uint256 neededEther = seller.products[product_name]._price_unity * quantity;
        require (msg.value == neededEther);  // did the buyer sent the correct value?
        _;
    }

    function buy (string product_name, uint256 quantity) payable public hasEnoughEther (product_name, quantity) {
        if (product_owners[msg.sender].isValue) {
            product_owners[msg.sender]._product_quantity += quantity; 
        } else {
            product_owners[msg.sender] = Product_Quantity(product_name, quantity, seller.products[product_name]._price_unity, true);
        }
        seller.products[product_name]._product_quantity -= quantity;
        seller._id.transfer(seller.products[product_name]._price_unity * quantity);
    }
}

答案 1 :(得分:0)

就我而言,我需要为合同提供资金,以便它可以执行操作。

答案 2 :(得分:0)

在您的情况下,您尝试使用带参数的 MODIFIER 函数,但未在 Buy 函数中向其传递任何参数。

在我的例子中,我试图在 Deploy and Run Transactions 选项卡的 VALUE 字段中使用一些以太触发一个不可支付的功能。