如何检查以太坊从一个地址到智能合约的转账?

3
如果我有一个像这样的函数:
function sendToAuthor (uint tokenId) public payable{

  //here I want to get some ether from the msg.sender, store it in a 
  mapping and send it to another address (author). 

}

我不明白的是如何检查msg.sender是否向智能合约转移了资金。如果我可以检查到这一点,我就可以从映射中取出msg.value并将其发送给作者,但是我如何检查发送者是否确实向合约进行了eth转移?

2个回答

2
msg.value变量包含在payable函数中存入多少ETH。您需要检查该值是否大于零或是否与预期的任何付款金额匹配。

0

伪代码:

contract someContract {
  address author = "0x00...";
  mapping (address => uint) public sentToAuthor;
  function sendToAuthor () public payable {
    sentToAuthor[msg.sender] = msg.value;
    author.call{value: msg.value}("");
  }
}

你的问题并没有太多意义。

我不明白的是如何检查msg.sender是否已经将钱发送给了智能合约。

你只需要查看msg.value的值。如果交易没有回滚,函数是可支付的,并且你没有将其发送到其他地方,那么你的合约就会收到这些资金。没有必要进行“检查”。如果你确实想要检查,你可以在客户端上查看合约余额(例如,ethers.utils.balanceOf(contractAddress)或其他)。你也可以直接查看映射,它将是正确的并向你显示。

如果我可以检查,我可以从映射中获取msg.value并将其发送给作者,但是我如何检查发送者是否实际向合约转移了以太币?

“msg.value”实际上不会“存在”于映射中,映射不能持有以太币,它们只能持有一个uint。它只告诉你发送到合约的金额。

顺便说一下,正如这里所写的那样,它会直接发送给作者,因此不会留在合同中。如果您删除“sendToAuthor”的最后一行(author.call行),那么eth将留在合同本身中。

(顺便说一句,有一个以太坊stackoverflow,您应该在那里提问。)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接