Согласно последней версии желтой бумаги и спецификации сборки Solidity, код операции возврата может возвращать код ошибки.
http://solidity.readthedocs.io/en/develop/assembly.html
revert(p, s) - завершить выполнение, отменить изменения состояния, вернуть данные mem[p..(p+s))
Однако функция возврата в чистом твердом состоянии имеет 0 аргументов. Я предполагаю, что он еще не поддерживает код возврата.
[В] : Как я могу использовать возврат из сборки Solidity для передачи кода ошибки вызывающему приложению web3 JavaScript? Если это невозможно, объясните, почему.
Обновление : см. также Solidity: Как мы можем написать сообщение об ошибке в «require»?
Как обсуждалось в комментариях, нет простого способа получить причину возврата в Dapp. Однако эта функция может поддерживаться в будущем.
Вот первоначальный EIP и его обсуждение:
https://github.com/ethereum/EIPs/blob/master/EIPS/eip-658.md https://github.com/ethereum/EIPs/pull/658
Предыдущий ответ
Насколько я понимаю, клиент, такой как web3, не может прочитать вывод возврата, так же как невозможно прочитать вывод в случае нормального завершения транзакции. Revert использует выходные данные o
, как определено в желтой бумаге, которые могут использоваться для вызовов сообщений, но игнорируются для транзакций.
вызовы сообщений также имеют дополнительный компонент — выходные данные, обозначаемые массивом байтов o. Это игнорируется при выполнении транзакций, однако вызовы сообщений могут быть инициированы из-за выполнения VM-кода, и в этом случае используется эта информация.
Действие кода операции REVERT задается формулой 140, которая ссылается на вывод o
.
Remix, однако, показывает результат при использовании виртуальной машины JavaScript, поскольку он выполняет транзакции синхронно:
pragma solidity^0.4.11;
contract C {
function testRevert() pure public returns (uint result) {
uint memOffset;
assembly {
memOffset := msize() // Get the highest available block of memory
mstore(add(memOffset, 0x00), 6) // Set value
mstore(0x40, add(memOffset, 0x20)) // Update the msize offset to be our memory reference plus the amount of bytes we're using
revert(memOffset, 0x20) // revert returning 1 byte
}
}
}
Декодированный вывод:
{
"0": "uint256: result 6"
}
При выполнении в тестовых сетях или основной сети выходных данных нет.
Должна быть возможность прочитать вывод возврата при использовании низкоуровневой сборки call
( я буду обновлять этот ответ всякий раз, когда у меня есть пример рабочего кода) delegatecall
.callcode
Я ожидаю try-catch
, что в Solidity будет добавлена функция -like при использовании его контрактов call
, delegatecall
и callcode
вызовов через их интерфейс (будет обновлять ответ всякий раз, когда у меня есть ссылки).
status
свойство, но оно может быть только 0
или 1
. Знаете ли вы, существуют ли планы (например, ERC/EIP) для хранения данных о возврате в квитанцию? Создание события ошибки противоречило бы отмене всей транзакции. Для события Error мне пришлось бы зафиксировать создание события, но откатить все остальное. Что может быть образцом для этого?sentGas == usedGas
, как раньше, но фактически в пользовательском интерфейсе вы можете сказать только «Все прошло» или «Что-то пошло не так». Но что именно пошло не так, теряется в резюме. Я предполагаю, что можно было бы просмотреть трассировку транзакции, чтобы найти местоположение, но для этого варианта использования это звучит как обходной путь.
Гарен Вартанян
require
полю сообщения?ivicaa