ethereum - 如何在不使用设置 msg.value 的情况下将资金从 msg.sender(amount) 转移到收件人地址
问题描述
我们可以将资金从地址(这个)转移到收件人。但是有没有办法将资金直接转移到 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;
}
解决方案
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);
该transfer()
方法仅允许消耗 2300 gas,这对于非合约接收者来说已经足够了。如果接收方是需要超过 2300 个 gas 才能接收 ETH 的合约(例如,它设置了一些局部变量),则交易将恢复。
低级call()
uint256 bonus = calculateBonus();
msg.sender.call{value: bonus}("");
使用低级call()
方法,您还可以指定气体限制、要调用的函数及其参数。仅当您知道自己在做什么时才使用此方法。
推荐阅读
- python - Pandas 根据日期范围和另一列过滤数据框
- html - 从 React 中的隐藏溢出中弹出
- facebook-graph-api - 获取给定日期的 Instagram 关注者数量
- r - 为什么 r 中关于生成 Gamma 随机变量的代码不返回预期的输出?
- cross-browser - 我应该如何做跨浏览器解决方案?
- powershell - 如何使用 powershell 传递参数?
- python - Python 类 - 存储和引用实例
- python - 如何在两个不同的 Github 存储库中同步一些文件夹?
- oop - 实现相同接口的不同类进入构造函数
- python - 具有重叠部分的图像的字符分割