05-15 (1)

조하빈 ·2023년 5월 15일
0

05월 15일 월요일


Solidity require

contract REQUIRE {
    function Require(uint _n) public pure returns (uint) {
        require(_n<10);
        return _n*3;
    }
}
  function getName(string memory _name) public pure returns(bytes32){
        return keccak256(abi.encodePacked(_name));
    }
  function onlyAlice(string memory _name) public pure returns (bool) {
        require(getName(_name)== 0x9c0257114eb9399a2985f8e75dad7600c5d89fe3824ffa99ec1c3eb8bf3b0501);
        return true;
    }
    //0x9c0257114eb9399a2985f8e75dad7600c5d89fe3824ffa99ec1c3eb8bf3b0501

중간에 오류가나면 함수를 끊어서 가스비를 아끼게 해주기 위해 쓴다
앨리스가 어디있는지 찾기위해서는 require를 사용하는게 아니라 if나 for문을 돌려야되고
앨리스가 맞는지 아닌지만 확인하는데에는 require를 쓰는게 좋다!


Solidity require 응용

contract REQUIRE2{
    function getBool() public pure returns(bool) {
        bool a;
        return a;
    }
    function Require() public pure returns (uint) {
        uint a=1;
        bool b;
        require(b, "Error"); // 기본적으로 false이기 때문에 통과못함
        return a;
    }
      function Require2() public pure returns (uint) {
        uint a=1;
        bool b;
        return a;
        require(b, "Error"); // Unreachable cod
    }
    uint a =1;
    function getA() public view returns(uint) {
        return a;
    }
    function Require3() public {
        bool c;
        a = 5;
        require (c, "error"); // a를 5로 바꾼 것도 전부 다 다시 revert(원래상태로 복구) 시킨다.
    }
    function setAasFive() public {
        a=5;
    }
    // require 타 함수 호출
    function Require4() public {
        bool c;
        setAasFive();
        require(!c, "error");
    }
    // 조건 여러개
    function Require5(uint _n) public pure returns(bool) {
        require(_n%5 == 0  && _n>10, "Nope");
        return true;
    }
    //if문 안의 require
    function Require6(uint _a) public pure returns (uint) {
        if(_a %3 == 0){
            require(_a%3!=0, "nope");            
        } else if(_a%3 == 1 ){
            return _a%3;
        } else {
            return _a%3;
        }
    }
}
  • Require1 는 reqire구문에서 걸리기때문에 return 에서 오류가 난다.
  • Require2 는 이미 return a; 가 먼저 나오기 때문에 require구문에서 거를수 없다
  • Require3 는 require구문에서 맨마지막에 걸러지더라도 initiate state상태로 돌아가기 때 문에 a=5;라고 선언한 부분도 무효화가 된다.
  • Require4 는 타함수를 불러왔는데 타함수도 마찬가지로 무효화가 된다.
  • Require5 는 조건을 여러개 입력해도 조건활성화가 된다.
  • Require6 는 if문안에서 require를 사용해서 require문을 회피하는 방법이다.
profile
PPisland

0개의 댓글