当Payable函数未通过require校验时会发生什么?合约是否退还用户资金?
Payable函数未通过require校验的结果说明
当Payable函数中的require校验未通过时,会触发以下结果:
- 事务完全回滚:EVM会撤销该事务中所有已执行的状态变更操作。以提供的示例代码为例,如果
age < 18,logs[msg.sender] = msg.value;这行代码不会被执行,合约的状态不会发生任何改变。 - 用户资金自动退还:调用者转入合约的ETH会被原路退回到
msg.sender的地址,合约不会留存这笔资金。
简单来说,require校验失败会直接终止函数执行,同时回滚所有状态并返还用户转入的资金,相当于这次调用从未发生过(除了已消耗的Gas,因你明确说明不涉及Gas费用咨询,此处不再展开)。
示例代码:
function deposit(uint age) payable { require(age >= 18, "Sorry you should be 18+ to deposit"); logs[msg.sender] = msg.value; }
内容的提问来源于stack exchange,提问作者Jeanclaude
相关产品推荐
相关产品推荐

