solidity学习(六)-- 实例证明require

pragma solidity ^0.4.21;

contract GuessTheNewNumberChallenge {
    bool public flag;
   //定义了flag这个变量是bool类型的
function setFlag() external { require(msg.sender == address(this));//判断调用者的发送地址 是否等于当前地址,成立则继续运行。 //msg.sender指的最近的调用者,“谁调用,谁负责“ //如果是setflag运行的话,则调用的账号是metemask里面的
     //按理说这里会运行,external是外部调用,运行完如果不相等的话,本地运行时先setflag--run--flag一定会是false。
     //但是这里:external是 只能 外部调用,下面又判断”最近调用者“=”当前调用者“???所以这个function一定是错误的,如果在web上运行则会报错。
flag
= true; } function run() public { GuessTheNewNumberChallenge(address(this)).setFlag(); //这里要求输出true,则这里首先声明合约,再写谁调用的。
     //remix可以根据按钮运行,这里我们有三个按钮:函数setFlag、函数run、变量flag。
}
//所有类型的默认值 require等四个关键字的区别 }

上述代码实现了,使得最后run函数的输出结果为true。跳过了setflag函数,全部都是public,畅通无阻。

but:

bool没有external,想想也是,bool就合约内部判断就行了啊。

1.当红框部分为private、internal等相关内部调用函数,则在deploy后不会显示内部调用的按钮。

 

 2.当bool flag的调用权限(公开) > run函数,则会显示bool flag的按钮:

 

 所以,每次看代码的时候,想一下怎么调用的,符不符合逻辑。看权限大小、看调用规则是否符合函数具体的require。

 

资料:https://ethfans.org/posts/when-to-use-revert-assert-and-require-in-solidity

posted @ 2021-07-14 10:19  这醋好甜  阅读(228)  评论(0编辑  收藏  举报