#ethereum #solidity
#ethereum #надежность
Вопрос:
Мы можем перевести средства с адреса (этого) получателю. Но есть ли какой-либо способ перевести средства непосредственно с кошелька msg.sender получателю? Я не могу установить msg.value во время вызова payoutBonus. Потому что я могу получить сумму только внутри метода payoutBonus.
function payoutBonus(address recipient) public payable returns (bool) {
// bonus = calculateBonus();
//transfer this bonus to recipient from msg.sender;
return true;
}
Комментарии:
1. msg.sender.send()
Ответ №1:
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, которого достаточно для получателей, не являющихся контрактными. Если получателем является контракт, требующий более 2300 gas для получения ETH (например, он устанавливает некоторую локальную переменную), транзакция возвращается.
Низкоуровневый call()
uint256 bonus = calculateBonus();
msg.sender.call{value: bonus}("");
С call()
помощью метода низкого уровня вы также можете указать лимит газа, вызываемую функцию и ее аргументы. Используйте этот метод, только если вы знаете, что делаете.
Комментарии:
1. Я видел, как несколько человек использовали ваш пример низкоуровневого вызова, но у меня возникли проблемы с поиском какой-либо документации по нему, и я действительно не распознаю синтаксис. Например, что означают фигурные скобки перед круглыми скобками и почему вы передаете пустую строку в качестве аргумента? Можете ли вы указать мне в направлении какой-либо документации для этого?
2. @LucasRahn Параметры (в фигурных скобках) кратко упоминаются, например, при вызовах внешних функций или элементах адресов . Но я согласен, что низкоуровневый вызов в целом в настоящее время не очень хорошо документирован.