Мы разработали простой смарт-контракт, который предлагает следующий метод публичных транзакций:
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
, что, если вы посмотрите на смарт-контракт, должно вызвать утверждение и остановить выполнение метода.
Как мы можем проверить, правильно ли завершилась транзакция или была ли она отклонена какой-либо проверкой утверждений?
Читая документы 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;
}
Должна быть возможность отличить успешный вызов от неудачного, верно?
джоджей
система
Исмаэль