这个智能合约函数是否应该标记为不可重入?

Should this smart contract function be marked nonReentrant?

这个函数应该被标记为不可重入还是太过分了?

function sendEthToTokenOwner(uint256 _tokenId) external payable nonReentrant {
        address _tokenOwner = ownerOf(_tokenId);
        require(msg.sender != _tokenOwner, "Sender can't be owner");

        uint256 _price = tokenIdToPrice[_tokenId];
        require(msg.value == _price, "Please submit the correct amount of ether");


        (bool success, ) = payable(_tokenOwner).call{value: _price}("");
        require(success, "Eth cannot be transferred");
}

这个特定的片段不需要重入保护,因为 sendEthToTokenOwner() 函数只是充当“传输代理”。执行验证,然后将 msg.value 重定向到令牌所有者。

如果您转出的金额大于 msg.value 或独立于 msg.value 的金额,那么您可能需要重入保护(取决于其他情况)。