Как получить доступ к событию простой транзакции Ether в dApp Solidity Ethereum для смарт-контрактов?

Когда пользователь отправляет некоторое количество эфира на адрес смарт-контракта/dApp, есть ли способ получить доступ к этой транзакции в моем смарт-контракте? Как встроенный метод, который вызывается, к которому я могу добавить некоторый код?

Мой идеальный рабочий процесс, если это возможно:

  1. Пользователь отправляет эфир на мой адрес dApp.
  2. В моем коде смарт-контракта вызывается функция.
  3. Внутри этой функции я могу создать некоторую логику, например, добавить их адрес в какое-то состояние и т. д.

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

Если пользователю нужно вызвать определенную функцию, я должен начать думать о таких сервисах, как МЭВ, или мне нужно создать веб-интерфейсное приложение, которое интегрируется с расширением браузера Метамаск или чем-то подобным. Это кажется большой работой, но так ли это должно быть?

Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
Четыре эффективных способа центрирования блочных элементов в CSS
Четыре эффективных способа центрирования блочных элементов в CSS
У каждого из нас бывали случаи, когда нам нужно отцентрировать блочный элемент, но мы не знаем, как это сделать. Даже если мы реализуем какой-то...
0
0
24
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Существует специальная функция Получать(), которая выполняется, когда вы отправляете ETH на адрес контракта и не указываете какую-либо функцию для выполнения (т. е. поле data транзакции пусто).

Вы можете получить адрес отправителя через глобальную переменную msg.sender и сумму через msg.value.

pragma solidity ^0.8;

contract MyContract {
    mapping (address => uint256) contributions;

    receive() external payable {
        contributions[msg.sender] += msg.value;
    }
}

Спасибо. В документах говорится, что функция приема может полагаться только на доступный газ 2300, поэтому мне, возможно, придется иметь это в виду и свести код к минимуму. У вас есть опыт в этом?

Peter J Langley 17.05.2022 16:06

@PeterJLangley Ограничение в 2300 используется только в некоторых случаях, например, когда другой контракт вызывает вашу функцию receive() из своего фрагмента payable(yourContract).transfer(amount);... Если вы просто отправляете сумму с конечного адреса, ограничение не применяется.

Petr Hejda 17.05.2022 16:28

Спасибо за дополнительную информацию. Это именно то, что я искал.

Peter J Langley 17.05.2022 16:32

Другие вопросы по теме

Похожие вопросы