В реализации OpenZeppelin передачи ERC20, почему _transfer() вызывается перед проверкой разрешения на вывод средств

#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] Это дает больше деталей и проливает свет на причины, стоящие за этим.