Почему я получаю эту ошибку? «Оценка газа ошибочно из-за следующего сообщения (см. Ниже). Вероятно, транзакция> выполнение не удастся» - PullRequest
0 голосов
/ 05 мая 2018

Попытка проверить прочность с помощью Remix IDE. Я получаю сообщение об ошибке:

Оценка газа ошибочна из-за следующего сообщения (см. Ниже). Выполнение транзакции> скорее всего завершится неудачей. Вы хотите принудительно отправить?

Кто-нибудь имеет представление о том, что может дать мне эту ошибку. Это я пытаюсь продавать продукты, используя умные контракты ethereum. Я использовал Remix IDE для создания этого контракта со значением = 0. Я успешно могу создать контракт и добавить_продукт, но не могу купить. Последняя строка дает мне ошибку, упомянутую выше.

Файл солидности, который я снова тестирую, состоит в следующем: Как вы можете видеть, я создаю контракт на продажу, который позволил бы пользователю продавать продукты с помощью блокчейна, а покупатель мог получить продукт, заплатив цену в ethereum. Если у кого-то есть лучшее решение для меня, чтобы использовать для этого точного варианта использования, я открыт для предложений.

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);


    }
}

1 Ответ

0 голосов
/ 08 мая 2018

Это очень общее сообщение об ошибке Remix. К счастью, сегодня я вижу новые сообщения об ошибках в Remix (приятное обновление, ребята!), Которые облегчают отладку проблемы.

Когда кто-то пытается купить продукт, вам следует проверить, является ли переданное значение (в вэй) правильной суммой для покупки этого продукта и количества.

Поскольку вы не проверяете это, покупатель может купить товар с суммой, равной 0, что означает, что у контракта не будет wei для отправки продавцу в конце функции buy (). Это вызовет исключение, и транзакция будет отменена.

Я обновил ваш код для обеспечения прочности 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);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...