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