我如何在 Solidity 以太坊智能合约 dApp 中访问普通以太币交易事件?
How do I access a plain Ether transaction event in a Solidity Ethereum smart contract dApp?
当用户将一些以太币发送到智能 contract/dApp 地址时,有没有办法在我的智能合约中访问该交易?就像被调用的内置方法一样,我可以向其中添加一些代码吗?
我理想的工作流程,如果可能的话:
- 用户发送以太币到我的 dApp 地址。
- 在我的智能合约代码中调用了一个函数。
- 在那个函数中,我可以创建一些逻辑,比如将他们的地址添加到某个状态等。
理想情况下,我想避免用户不得不调用合约的特定 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;
}
}
当用户将一些以太币发送到智能 contract/dApp 地址时,有没有办法在我的智能合约中访问该交易?就像被调用的内置方法一样,我可以向其中添加一些代码吗?
我理想的工作流程,如果可能的话:
- 用户发送以太币到我的 dApp 地址。
- 在我的智能合约代码中调用了一个函数。
- 在那个函数中,我可以创建一些逻辑,比如将他们的地址添加到某个状态等。
理想情况下,我想避免用户不得不调用合约的特定 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;
}
}