我如何在 Solidity 以太坊智能合约 dApp 中访问普通以太币交易事件?

How do I access a plain Ether transaction event in a Solidity Ethereum smart contract dApp?

当用户将一些以太币发送到智能 contract/dApp 地址时,有没有办法在我的智能合约中访问该交易?就像被调用的内置方法一样,我可以向其中添加一些代码吗?

我理想的工作流程,如果可能的话:

  1. 用户发送以太币到我的 dApp 地址。
  2. 在我的智能合约代码中调用了一个函数。
  3. 在那个函数中,我可以创建一些逻辑,比如将他们的地址添加到某个状态等。

理想情况下,我想避免用户不得不调用合约的特定 public 函数,而只是将以太币发送到 dApp 地址。

如果用户必须调用特定功能,我必须开始考虑 MEW, or I have to build a web2 frontend app that integrates with the MetaMask 浏览器扩展之类的服务。这看起来工作量很大,但这是必须的吗?

当您将 ETH 发送到合约地址且未指定要执行的任何函数时(即交易的 data 字段为空)时,会执行 receive() 特殊函数。

您可以通过msg.sender全局变量获取发件人地址,通过msg.value获取金额。

pragma solidity ^0.8;

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

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