将nonReentrant修饰符用于payable函数是否会引发错误?
问题1:给带payable的ERC-721 mint函数添加OpenZeppelin Reentrancy模块的nonReentrant修饰符是否会引发错误?
不会引发任何编译或运行层面的错误。
nonReentrant修饰符的核心实现逻辑是通过合约内的状态变量标记函数的执行状态,防止同一函数在执行过程中被外部合约递归调用,和函数是否带有payable属性完全不存在冲突。payable关键字仅用于声明函数可以接收链上原生ETH转账,不会和修饰符的逻辑产生任何兼容问题。
这种搭配反而是NFT mint场景下非常推荐的安全实践:mint函数涉及ETH收款+NFT所有权状态变更,本身就是重入攻击的高风险场景,加nonReentrant修饰符可以有效规避重入风险。
问题2:payable关键字是否会触发nonReentrant修饰符的执行?
不会。
nonReentrant修饰符的触发逻辑仅和你是否将它绑定到对应函数有关:只要你在函数定义时声明了该修饰符,不管函数有没有payable属性、调用时有没有附带ETH转账,每次调用该函数时修饰符的校验逻辑都会自动执行。payable关键字本身不会触发任何修饰符的执行,两者的逻辑完全独立。
补充注意事项:
- 使用
nonReentrant前需要确保你的合约已经正确继承了OpenZeppelin的ReentrancyGuard合约- 如果是可升级合约场景,需要在初始化函数中调用
__ReentrancyGuard_init()完成初始化
内容的提问来源于stack exchange,提问作者Amr ElOkeily
相关产品推荐
相关产品推荐

