Выдать событие в функции представления или

Можно ли генерировать событие в функции просмотра (через событие или логи)? Или можно вернуть значение в javascript без (до) майнинга в функции транзакции? Моя цель — избежать ожидания из-за майнинга с ведением журнала событий.

Ответы (3)

Можно ли генерировать событие в функции просмотра (через событие или логи)?

Поскольку журналы событий хранятся в квитанциях о транзакциях, я не верю, что можно сгенерировать событие в функции просмотра, поскольку транзакция не происходит.

Или можно вернуть значение в javascript без (до) майнинга в функции транзакции?

Я тоже не думаю, что это возможно. Возвращаемое значение функции, создающей транзакцию, будет квитанцией транзакции. В квитанции вы можете найти любые события, которые были сгенерированы этой функцией.

Но для получения потребуется майнинг блока, поэтому нам нужно подождать. Я пишу критичную по времени функцию с логами.
Вы можете выполнить функцию локально, используя Call in web3. Я думаю, что вторая часть вашего ответа неверна. Смотрите мой ответ ниже.
Из того, что я заметил, отправка транзакции возвращает хэш транзакции, а подтверждение транзакции возвращает квитанцию ​​​​транзакции с подробностями отправленного события.

Q1: Событие — это изменение состояния. Их невозможно испускать из viewили pureфункций или constantв старом синтаксисе.

Q2: невозможно получить значения ответа из подписанной транзакции. Вы всегда получите квитанцию ​​об операции.

К шаблонам нужно привыкнуть. Я большой сторонник создания проверяемых журналов событий для каждого важного изменения состояния. Когда транзакции анализируются, соответствующая информация поступает с подтверждением в качестве аргументов журнала событий. Это для клиентов вне сети.

Значения returnили по-прежнему важны. Это значения ответа, если функция вызывается из другой функции или контракта.

Например:

bool result = myOtherContract.insertSomething(); // expecting "true"/success

Если это важно для клиента, что-то вроде:

emit LogResult(msg.sender, result);

Надеюсь, поможет.

Первый вопрос: это невозможно, потому что событие изменяет состояние. В Remix вы увидите предупреждение об этом.

Второй вопрос. Вы можете выполнить функции локально, не отправляя транзакцию в сеть с помощью Call, она не будет потреблять газ и будет выполнена немедленно.

Однако, если вы стремитесь получить транзакции, совершенные пользователями вашей системы, до того, как транзакции будут добыты, это невозможно.

Надеюсь это поможет