Когда пользователь отправляет некоторое количество эфира на адрес смарт-контракта/dApp, есть ли способ получить доступ к этой транзакции в моем смарт-контракте? Как встроенный метод, который вызывается, к которому я могу добавить некоторый код?
Мой идеальный рабочий процесс, если это возможно:
В идеале я хочу, чтобы пользователю не приходилось вызывать определенную общедоступную функцию контракта, а вместо этого просто отправлять эфир на адрес dApp.
Если пользователю нужно вызвать определенную функцию, я должен начать думать о таких сервисах, как МЭВ, или мне нужно создать веб-интерфейсное приложение, которое интегрируется с расширением браузера Метамаск или чем-то подобным. Это кажется большой работой, но так ли это должно быть?
Существует специальная функция Получать(), которая выполняется, когда вы отправляете ETH на адрес контракта и не указываете какую-либо функцию для выполнения (т. е. поле data
транзакции пусто).
Вы можете получить адрес отправителя через глобальную переменную msg.sender
и сумму через msg.value
.
pragma solidity ^0.8;
contract MyContract {
mapping (address => uint256) contributions;
receive() external payable {
contributions[msg.sender] += msg.value;
}
}
@PeterJLangley Ограничение в 2300 используется только в некоторых случаях, например, когда другой контракт вызывает вашу функцию receive()
из своего фрагмента payable(yourContract).transfer(amount);
... Если вы просто отправляете сумму с конечного адреса, ограничение не применяется.
Спасибо за дополнительную информацию. Это именно то, что я искал.
Спасибо. В документах говорится, что функция приема может полагаться только на доступный газ 2300, поэтому мне, возможно, придется иметь это в виду и свести код к минимуму. У вас есть опыт в этом?