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。
下面是我的函数:
// 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。