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문을 회피하는 방법이다.