为什么我无法将以太币发送到具有'send'或'transfer'功能的其他合约?



为什么send()transfer()不工作?

我刚刚学习了固体,我对发送以太的方法很好奇。我在solid中编写了两个智能合约,并将它们部署在Remix IDE(环境是Remix VM(合并))上。我尝试通过三种不同的方式将1个以太币从发送方合约发送到接收方合约,send(),transfer(),call()

我可以通过call()发送以太,但我无法通过send()transfer()功能发送以太。

代码如下:

pragma solidity ^0.8.0;
contract Receiver {
address receiver;
uint public prize;
address public owner;
constructor() payable {
receiver = msg.sender;
owner = msg.sender;  
prize = 0.001 ether;
}
receive() external payable {
require(msg.value >= prize || msg.sender == owner);
payable(receiver).transfer(msg.value);
receiver = msg.sender;
prize = msg.value;
}
}

contract Sender {
constructor() payable{
}
function sendWithSend(address payable _to) public payable{
//send ether with send
//failed
bool success = _to.send(msg.value);
require(success, "failed");
}
function sendWithTransfer(address payable _to) public payable{
//send ether with transfer
//failed
_to.transfer(msg.value);      
}
function sendWithCall(address payable _to) public payable{
//send ether with call
//success
(bool sent, ) = _to.call{value: msg.value}("");
require(sent, "Failled" );
}
}

发送方合约有三个函数,sendWithSend", sendWithTransfer"one_answers"sendWithCall".

我试图用每个函数向接收者合约发送1个以太币,我预计所有功能都有效,因此接收者合约将有3个以太币。但它只有1个以太。

call()工作,但send()transfer()失败。

我试了很多次,但send()transfer()从来没有工作过。

这里是错误日志

send()error

发送错误日志1

发送错误日志2

transfer()error

传输错误日志1

传输错误日志2

,这里是call()方法成功日志

call success log

我非常感谢你的帮助。

send()和transfer()的gas限制为21000,而call()没有默认gas限制。

对于send()和transfer()函数,当收到资金时,receive()函数将执行额外的代码,这将达到gas限制。因此,事务将被恢复。

如果你设置了一个空的接收函数,这应该可以工作,因为gas限制将不会达到。

这就是为什么如果你可能与智能合约交互,最好总是使用call()函数。

相关内容

最新更新