Недостаточно газа и не в состоянии запускать функции

Я новичок в Ethereum и пишу часть смарт-контракта для своего проекта. Я использовал Win 10 и Mist 0.8.8 с тестовой сетью, которая начиналась с «R».

В коде контракта есть функции изменения состояния и какой-то модификатор, однако после того, как я запустил контракт, я не могу запустить ни одну из его функций. Появляются следующие ошибки. Большое спасибо!!!

введите описание изображения здесь введите описание изображения здесь

Код контракта показан ниже: Большое спасибо!

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

Ответы (1)

Тестовая сеть называется Ropsten .

Из необработанных данных 0x295b4e17на вашем первом изображении вы пытаетесь выполнить paid()функцию.

Я проверил каждую из сигнатур функций в gethкомандной строке, и следующая сигнатура совпала:

> web3.sha3("paid()").substring(0, 10)
"0x295b4e17"

Эта paid()функция имеет модификатор, inState(State.Received)и этот модификатор выдаст ошибку, если текущая stateпеременная НЕ State.Received.

Предупреждение, которое вы видите, связано с тем, что Mist имитирует вызов, который вы пытаетесь выполнить, и определил, что вызов paid()завершится ошибкой, поскольку текущая stateпеременная не установлена ​​на State.Received.

Чтобы проверить свою функциональность, вы можете:

  1. Добавьте другие функции, чтобы перевести рабочий процесс в состояние State.Received; или же

  2. Удалите inState(State.Received)модификатор из paid()функции.

Я бы посоветовал сначала попробовать 2. выше, чтобы вы могли определить, можете ли вы paid()успешно выполнить функцию. После того, как вы подтвердите, что paid()функция без модификатора выполняется успешно, создайте другие требуемые функции, чтобы переместить ваш контракт stateв то время, State.Receivedкогда paid()с вашим модификатором будет работать.



Обновление в ответ на комментарий ниже

В : Должен ли я использовать uint в качестве типа переменной для записи отправки?

A : uint(то есть uint256) подходит для записи количества эфиров.

В : Когда я отправляю 1 Эфир на контракт, вместо этого отображается 1000000000 вай.

О : 1 эфир равен 1e18 или 1 000 000 000 000 000 000 вейсов. В geth:

> 1e18
1000000000000000000
> web3.fromWei(1e18,"ether")
"1"
> web3.toWei(1,"ether")
"1000000000000000000"

В : Наконец, я хотел бы выучить cml для запуска контракта. У вас есть рекомендуемая ссылка для меня?

О: Если cmlречь идет о командной строке, т. е. об использовании gethкомандной строки, есть несколько пошаговых руководств по адресу:

Вы также можете проверить Browser Solidity — см. Как вызвать библиотечную функцию из контракта? => [ошибка] Не удалось сохранить код контракта, проверьте количество газа. undefined для примера.

О Боже мой!! Большое спасибо! Попробую, когда доберусь до компа. Могу я спросить вас, что такое платный модификатор в контракте? Я видел, что во многих контрактах есть эта функция для обработки перевода. Кто-то сказал, что если у нас его не будет, стоит его бросить, весь газ будет израсходован. Большое спасибо.
Любая функция, помеченная как подлежащая оплате, включая функцию по умолчанию (см. ethereum.stackexchange.com/a/9297/1268 ), может получать эфиры, отправленные с транзакцией, вызывающей функцию. Будет выброшена ошибка, если вы отправите эфиры при вызове функции, которая не помечена как подлежащая оплате. Это сделано для того, чтобы вы могли разрабатывать контракты, в которых пользователь не мог бы случайно отправить эфиры, когда это не требуется.
Еще раз спасибо. Все работает нормально. Должен ли я использовать uintтип переменной для записи или отправки? Когда я отправляю 1 эфир на контракт, вместо этого показывает 1000000000 вай. Наконец, я хотел бы изучить cml для запуска контракта. У вас есть рекомендуемая ссылка для меня? Большое спасибо.
Смотрите обновленный ответ для ответов на вопросы в вашем комментарии выше.