为什么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()函数。