address(this).send(msg.value) 返回 false 但以太币被转移

address(this).send(msg.value) returning false but ethers got transfered

下面是我的函数:

// Function
function deposit() payable external {
    // if(!wallet_address.send(msg.value)){
    //     revert("doposit fail");
    // }
    bool isErr = address(this).send(msg.value);
    console.log(isErr);
    emit Deposit(msg.sender, msg.value, address(this).balance);
}

我将 Remix IDE 与 solidity 版本 0.8.7 一起使用,我的问题是为什么 send() returns false 但以太被转移了。 send() returns 默认成功时是假的吗?

这是低级函数调用,在转移步骤后可能会失败。如果您不检查 success 变量,编译器会警告您调用可能会恢复,您可能会继续执行而不会意识到您忽略了失败。 所以你应该检查 success 变量以确保交易成功。

require(success, "ETH_TRANSFER_FAILED");

address(this).send(msg.value) 实际上只是创建了一个不必要的内部交易,将“这个合约”接受的值重定向到“这个合约” “

此内部交易失败,因为你的合约没有实现 receive()fallback() special functions 来接受从 send() 发送到你的合约所需的 ETH, transfer()call() 在某些情况下,通常是不调用任何特定现有函数的任何事务(内部或主要)。它不会使主事务失败,只是 returns false 来自 send() 方法。

TLDR:send() 函数在这种情况下是多余的,您可以安全地删除它。即使没有它,您的合约也能够从 deposit() 函数接受 ETH。