关于智能合同的“要求功能”,我有一个问题。职能如下,
function set(uint currentTs) public {
require(msg.sender == owner);
ts = currentTs;
}我不是所有者,但是我用参数调用这个函数(对于exmaple,1567569109)。因此,原始事务包含合同地址、我的EOA、gas、.和当前is ( 1567569109 )。
但是,我的EOA在require函数中不符合条件。此时,我发送的交易是否会被成功挖掘,但智能合同的状态不会改变。(如果我扫描整个区块链上的所有事务,我可以找到1567569109,但当我查询智能契约中的变量ts时,ts不会改变。)
是对的吗?或者,如果require中的条件不匹配,事务就会失败,并且不会被挖掘。
谢谢!
发布于 2019-09-04 04:15:10
简短的回答:交易将失败,并将被挖掘。你将被收取天然气费用,但智能合同的状态不会改变。事务状态将为0x0 (失败)。
长答案:伪函数revert检查条件,如果条件为假,则恢复当前智能契约调用到目前为止所做的所有更改。它还递归地恢复由当前智能契约调用执行的所有智能契约调用和所有以太传输所做的更改。它还向发送方返回与当前智能契约调用一起发送的所有以太。不过,如果该智能契约被另一个智能契约调用,require将不会恢复调用另一个智能契约所做的更改。另外,天然气是不退还的。因此,即使条件为false,require也不需要还原当前事务所做的所有更改,而只恢复当前调用所做的更改,不退还气体成本,也不阻止挖掘事务。事务状态仅反映事务内最高级智能契约调用的执行状态,而不受嵌套调用(成功或不成功)的影响。但是,当从外部拥有的地址调用智能契约时,当前事务和当前智能契约调用几乎是一回事。
发布于 2019-09-04 04:23:40
当require中的条件不匹配时,事务可以被挖掘并插入到块中,但是事务状态将“失败”。require语句之前的所有状态更改都将恢复到以前的状态。剩余的天然气如有,将予以退还。
所以,你在你的案例中所发现的是正确的。事务被添加到链中,但由于请求失败,状态不变。
https://ethereum.stackexchange.com/questions/74586
复制相似问题