Как проверить, была ли транзакция выполнена правильно или отклонена какой-либо проверкой утверждения [дубликат]

Мы разработали простой смарт-контракт, который предлагает следующий метод публичных транзакций:

function bid(uint256 _userCode, uint256 _amount) public {

        assert(_userCode> 0);
        assert(_amount> 0);

        winningBid.userCode= _userCode;
        winningBid.amount= _amount;

        var bidData= Bid(_userCode, _amount);
        bids.push(bidData);
    }

Мы отправляем транзакцию, используя этот код Nethereum:

var result = bidFunction.SendTransactionAndWaitForReceiptAsync(address, gas, balance, null, userCode, amount).Result;

Вызов метода не вызывает никаких исключений, даже переход 0к тому userCode, что, если вы посмотрите на смарт-контракт, должно вызвать утверждение и остановить выполнение метода.

Как мы можем проверить, правильно ли завершилась транзакция или была ли она отклонена какой-либо проверкой утверждений?

Включает ли функция параметр для функции обратного вызова? Обычно так и делается.
Мы не используем никаких функций обратного вызова. Не могли бы вы привести пример?
Начиная с byzantinum квитанция включает в себя поле статуса, чтобы указать, была ли транзакция выполнена правильно или нет.

Ответы (1)

Читая документы Solidity по обработке ошибок , на ум приходят следующие вещи:

  • Вы должны использовать requireвместо assert. Assert предназначен для обнаружения ошибок в коде. Требуется для отмены операции при неверном вводе (ваш вариант использования).

  • Solidity вернет всю операцию, когда столкнется assertили requireничего не изменится.

  • Отлов исключений пока невозможен.

  • Вы можете заставить свою функцию возвращать принятое значение, например:

    function bid(uint256 _userCode, uint256 _amount) public constant returns (uint256) {
    
        assert(_userCode> 0);
        assert(_amount> 0);
    
        winningBid.userCode= _userCode;
        winningBid.amount= _amount;
    
        var bidData= Bid(_userCode, _amount);
        bids.push(bidData);
    
        return _amount;
    }
    

    Должна быть возможность отличить успешный вызов от неудачного, верно?

Спасибо за Ваш ответ. Поскольку функция предложения является транзакцией (она меняет состояние блокчейна), вы не можете прочитать возвращаемое транзакцией значение через Nethereum SDK; все, что вы можете получить, это квитанция.