#ethereum #solidity #openzeppelin
#ethereum #надежность #openzeppelin
Вопрос:
Это взято из transferFrom
реализации OpenZeppelin ERC20:
function transferFrom(address sender, address recipient, uint256 amount) public virtual override returns (bool) {
_transfer(sender, recipient, amount);
uint256 currentAllowance = _allowances[sender][_msgSender()];
require(currentAllowance >= amount, "ERC20: transfer amount exceeds allowance");
_approve(sender, _msgSender(), currentAllowance - amount);
return true;
}
Есть ли причина _transfer
, по которой вызывается перед проверкой разрешения на снятие средств ( msg.sender
)?
Будет transferFrom
ли по-прежнему работать правильно, если require
проверка разрешения была выполнена первой?
Ответ №1:
Я нашел обсуждение той же темы по вопросам OpenZeppelin GitHub, и автор кода подтверждает, что заказ не имеет значения в контексте ERC-20.
В случае ERC20 заказ не имеет значения, потому что _transfer и _approve независимы и никогда не вызывают какой-либо другой контракт: они выполняются атомарно.
Кроме того, он заявляет, что важно поддерживать порядок стабилизированным на случай, если кто-то захочет переопределить функции.
Однако это очень важно для пользователей, которые намерены переопределить _transfer или _approve в своих собственных реализациях: мы должны четко представлять порядок, в котором это происходит.
Источник: https://github.com/OpenZeppelin/openzeppelin-contracts/issues/2030#issuecomment-568487500
Поэтому, если предположить, что вы не используете пользовательскую логику в переопределенных _transfer()
и _approve()
внутренних функциях, transferFrom()
она все равно будет работать правильно, если вы поменяли порядок.
Комментарии:
1. Спасибо за подтверждение этого. Поскольку это не имеет значения, странно, что они не выбрали порядок с наибольшим смыслом семантически. Однако реализация ERC1155 следует этому шаблону, что приятно: github.com/OpenZeppelin/openzeppelin-contracts/blob/master /…
Ответ №2:
На самом деле я искал то же самое, затем я нашел это обсуждение [https://forum.openzeppelin.com/t/in-erc20-tranferfrom-why-transfer-before-checking-allowance/5312/3] Это дает больше деталей и проливает свет на причины, стоящие за этим.