如何在不使用设置 msg.value 的情况下将资金从 msg.sender(amount) 转移到收件人地址

sel*_*sel 0 ethereum solidity

我们可以将资金从地址(此)转移到收件人。但是有没有什么方法可以将资金直接从 msg.sender 钱包转移到收件人呢?我无法在调用 payoutBonus 调用时设置 msg.value。因为我只能在 payoutBonus 方法中获得金额。

function payoutBonus(address recipient) public payable returns (bool) {
    // bonus = calculateBonus();
    //transfer this bonus to recipient from msg.sender;
    return true;
}
Run Code Online (Sandbox Code Playgroud)

Pet*_*jda 6

msg.value是反映传入交易值的只读属性。如果您想发送 ETH 金额,可以通过以下两种方式之一进行。

笔记:

  • 这些示例适用于 Solidity 0.8。某些以前的版本还允许使用send()现在已弃用的方法,不需要payable类型,并且该方法的语法略有不同call()
  • bonus是 wei 的数量(1 ETH 是 10^18 wei)

方法transfer()

uint256 bonus = calculateBonus();
payable(msg.sender).transfer(bonus);
Run Code Online (Sandbox Code Playgroud)

transfer()方法只允许消耗 2300 Gas,这对于非合约接收者来说已经足够了。如果接收者是一个需要超过 2300 Gas 才能接收 ETH 的合约(例如它设置了一些本地变量),则交易将恢复。

低级call()

uint256 bonus = calculateBonus();
msg.sender.call{value: bonus}("");
Run Code Online (Sandbox Code Playgroud)

使用低级call()方法,您还可以指定气体限制、要调用的函数及其参数。仅当您知道自己在做什么时才使用此方法。