В солидности,transfer
,send
иcall
используется для отправкиETHтри метода。Ниже приводится подробное введение в эти три метода.:
1.transfer
:Это самое раннее отправленноеETHметод。это поместит всеgas(самое большее2300 gas) отправляется получателю, и он автоматически генерирует исключение в случае сбоя вызова. Из-за фиксированного лимита газа он не может вызвать код контракта получателя (если получатель является контрактом). Поэтому он считается самым безопасным методом. Однако из-за фиксированного лимита газа он может выйти из строя в определенных ситуациях, например, если код контракта получателя потребляет более 2300 газа. Поэтому этот метод больше не рекомендуется.
2.send
:этот методиtransfer
похожий,Но если вызов не удался,он не выдает аномальный,Вместо этого он возвращаетfalse
Логическое значение。Это делает Разработчик Может справиться с неудачными ситуациями。Однако,иtransfer
Такой же,Также имеется фиксированный лимит газа в 2300 единиц.,Поэтому в некоторых случаях он может выйти из строя.
3.call
:В настоящее время это рекомендуемая доставка.ETHметод。это не исправленоgasпредел,Поэтому код контракта получателя можно назвать,Не потому, чтоgasпредели потерпел неудачу。Его использованиеcall{value: amount}(data)
,вamount
должен быть отправленETHколичество,data
должен быть отправленданные。Если вызов не удался,он вернетfalse
Логическое значение,Поэтому Разработчик может справиться с ситуациями сбоя.
В реальной разработке соответствующий метод следует выбирать на основе конкретных потребностей бизнеса и соображений безопасности.
Отправка ETH в контракте Solidity может быть осуществлена с помощью функции контракта. Вот простой пример:
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.25;
contract SendEther {
function sendViaTransfer(address payable _to) public payable {
// Больше не рекомендуется
_to.transfer(msg.value);
}
function sendViaSend(address payable _to) public payable {
// Send Возвращает логическое значение, указывающее успех или неудачу.
// Больше не рекомендуется
bool sent = _to.send(msg.value);
require(sent, "Failed to send Ether");
}
function sendViaCall(address payable _to) public payable {
// Call Возвращает логическое значение, указывающее успех или неудачу.。
// Рекомендуется
(bool sent, bytes memory data) = _to.call{value: msg.value}("");
require(sent, "Failed to send Ether");
}
}
В этом примере,Определены три функции,Используйте соответственноtransfer
,send
иcall
метод отправкиETH。Следует отметить, что,transfer
иsend
В некоторых случаях метод может дать сбой,Итак, в настоящее время Рекомендуетсяcall
метод отправкиETH。
в использованииcall
метод,В качестве параметра необходимо передать пустую строку,и использовать{value: msg.value}
Чтобы указать отправленноеETHколичество。Если отправка не удалась,call
Метод вернетfalse
Логическое значение,Поэтому необходимо использоватьrequire
функциячтобы проверить, успешна ли отправка。
Отказ от ответственности: эта работа распространяется под лицензией Attribution-NonCommercial-ShareAlike 4.0 International (CC BY-NC-SA 4.0)[1]. Пожалуйста, укажите источник при ее использовании. Автор: мэнбин[2] блог: мэнбин[3] Гитхаб: mengbin92[4] cnblogs: Непреднамеренно полюбила воду[5] Сообщество разработчиков облачных технологий Tencent: Мюнстер[6]
[1]
С указанием авторства-Некоммерческая-ShareAlike 4.0 интернациональность (CC BY-NC-SA 4.0): https://creativecommons.org/licenses/by-nc-sa/4.0/deed.zh
[2]
mengbin: mengbin1992@outlook.com
[3]
mengbin: https://mengbin.top
[4]
mengbin92: https://mengbin92.github.io/
[5]
Влюбляюсь в воду нечаянно: https://www.cnblogs.com/lianshuiwuyi/
[6]
Мюнстер: https://cloud.tencent.com/developer/user/6649301