Solidity
如果 ERC20 或 ERC721 transferFrom 失敗,整個功能是否會恢復?
我對恢復的情況有一些安全疑問和困惑。正如我發現
transfer
的那樣,如果本機函式失敗,函式的全部更改都會被還原。但是 ERC721 和 ERC20 的transfer
,transferFrom
,safeTransferFrom
呢?例如:
- 如果 (1) 或 (2) 失敗,函式是否會中斷並恢復
offer.isAccepted
?- 如果 (2) 失敗,是濕轉移,因此整個功能恢復了嗎?
function acceptBid(uint256 _offerId) public nonReentrant { Offer storage offer = offers[_offerId]; IERC20 weth = IERC20(0xc778417E063141139Fce010982780140Aa0cD5Ab); IERC721 nftContract = IERC721(offer.nftContractAddress); address nftOwner = nftContract.ownerOf(offer.tokenId); offer.isAccepted = true; // * weth.transferFrom( address(offer.userAddress), payable(msg.sender), offer.price ); // (1) nftContract.transferFrom( address(this), offer.userAddress, offer.tokenId ); // (2) emit AcceptedOffer();}
智能合約方法以交易方式執行。這意味著,如果執行了或 failed中的任何一個
revert
,則整個事務將被還原,回滾所做的任何更改。require``assert
所以:
weth.transferFrom
恢復時,offer.isAccepted
將被清除nftContract.transferFrom
還原時,weth.transferFrom
將被回滾並被offer.isAccepted
清除。