- require 함수는 실행 전에 입력과 조건을 확인하는 데 사용된다.
require(조건문, "만족하지 않을 시 메세지")
- 조건이 거짓이면 즉시 실행을 중지한다.
- require를 사용하여 조건 불충족시 불필요한 가스비 사용을 막을 수 있다.
//_n이 10보다 작을 경우 실행 function require0(uint _n)public pure returns(uint){ require(_n<10, "input should be lower than 10"); return _n*3; } //b가 true일 경우 실행 function require1() public pure returns(uint){ uint _a = 1; bool b; //기본값 false require(b,"Error"); // 통과못함 return _a; } //require위치에 따른 실행 ; return 실행됨, a = 1 function require2() public pure returns(uint) { uint _a = 1; bool b; return _a; require(b, "Error"); // Unrecheable code ;작동되지 않음 } //return이 없고, require이 제일 마지막에 있을 경우 function require3() public { bool c; a=5; require(c,"Error"); // return이 작동하지 않았기 떄문에 a를 5로 바꾼 것도 전부 다 다시 revert(원래 상태로 복구)시킴 }
연산자 혼용
||
,&&
혼용 사용 시 :||
연산자 기준으로 구분됨require(a ==0 && b != 1 || c ==0) //a,b만족 or c만족 require(a ==0 || b != 1 && c ==0) //a만족 or b,c만족 require(a ==0 || b != 1 && c ==0 || d==0) // a만족 or b,c만족 or d만족
- 변수 생성시 초기값을 정하여 생성하는 방법
- input 값이 필요한 경우 deploy시 명시해 주어야 한다.
// example1 : 초기값 설정 uint a; uint b; constructor(){ a = 7; b = 4; } // example2 : input값 받아서 설정 struct Student{ string name; uint number; } Student s; constructor(string memory _name, uint _number){ s = Student(_name, _number); } // example3 constructor()payable { payable(this).transfer(msg.value); // 배포할 때 msg.value 만큼 contract에게 바로 입금 owner = payable(msg.sender); // 배포하는 지갑주소가 바로 owner로 설정 }
- 한 번에 여러 타 함수의 동작을 변경하거나 제한하는 데 사용한다.
- 중복되는 조건을 여러 함수에 적용하여야 하는 경우 많이 사용되며, modifier사용 시 코드를 효율적으로 작성할 수 있다.
- Function modifiers are used to change or restrict the behavior of a function in a smart contract.
// modifier함수 modifier lessThanFive(){ require(a<5, "should be less than five"); //조건 _; // 함수가 실행되는 시점 } // modifier 사용하는 함수 function doubleA() public lessThanFive{ a=a*2; }
//example modifier overTwenty(uint _age, string memory _criminal) { require(_age >20, "Too young"); require(keccak256(abi.encodePacked(_criminal)) != keccak256(abi.encodePacked("Bob")), "Bob is criminal. She can't buy it"); _; } function buyCigar(uint _a, string memory _name) public pure overTwenty(_a, _name) returns(string memory) { return "Passed"; }