Solidity Modifier1
contract MODIFIER { uint a; modifier lessThanFive() { require(a<5, "should be less than five"); _; // 함수가 실행되는 시점 } function aPlus() public { a++; } function aMinus() public { a--; } function getA() public view returns(uint) { return a; } function doubleA() public lessThanFive { a = a*2; } function plusTen() public lessThanFive { a += 10; } }
Modifier는 중복되는 require를 편리하게 반복하기 위해 사용하는 것으로 이해했음
- _; 는 함수가 실행되는 시점을 나타내는 모습
Solidity Modifier2
contract MODIFIER2 { /* 실습가이드 1. setAasTwo()로 a 값 2로 만들기 2. setA() 실행 후 결과 확인, getA()로 A 값 확인 3. setAasTwo()로 a 값 다시 2로 만들기 4. setA2() 실행 후 결과 확인, getA()로 A 값 확인 */ uint a; modifier plusOneBefore() { a++; _; } modifier plusOneAfter() { _; a++; } function setA() public plusOneBefore returns(string memory) { if(a>=3) { return "A"; } else { return "B"; } } function setA2() public plusOneAfter returns(string memory) { if(a>=3) { return "A"; } else { return "B"; } } function getA() public view returns(uint) { return a; } function setAasTwo() public { a = 2; } }
- Modifier2 는 _;의 위치를 통해 달라지는 값을 확인하기 위한 실습함수
Solidity Modifier3
contract MODIFIER3{ uint a; string b; string[] b2; modifier plusOneBefore() { _; a++; _; } function setA() public plusOneBefore { if(a>=3) { b = "A"; b2.push(b); } else{ b = "B"; b2.push(b); } } function getA() public view returns (uint){ return a; } function getB() public view returns(string memory){ return b; } function getB2() public view returns(string[] memory){ return b2; } function setAasTwo() public{ a=2; } }
- modifier3 는 a=2; 로 설정해준 후 처음 ;가 들어가서 a=2인 상태이므로 else구문에 해당하는 B를 b2에 넣어주게 되고 이후 a++; 를 거쳐 a=3이되고 또 다시 ;로 들어가 a>=3에 해당하는 b="A"를 b2에 넣어주게 된다.
Solidity Modifier4
contract MODIFIER4 { struct Person { uint age; string name; } Person P; 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"; } function buyAlcho(uint _a, string memory _name) public pure overTwenty(_a, _name) returns(string memory) { return "Passed"; } function buyGu(uint _a, string memory _name) public pure overTwenty(_a, _name) returns(string memory) { return "Passed"; } function setP(uint _age, string memory _name) public { P = Person(_age, _name); } function getP() public view returns(Person memory) { return P; } function buyCigar2() public overTwenty(P.age, P.name) view returns(string memory) { return "Passed"; } function buyAlcho2() public overTwenty(P.age, P.name) view returns(string memory) { return "Passed"; } function buyGu2() public overTwenty(P.age, P.name) view returns(string memory) { return "Passed"; } }
- Modifier4 는 구조체를 만든 후 두 가지 require를 통과하면 함수가 실행되게 했다. 또한 modifier에 인풋값을 넣을수도 있는 것을 알기위한 예제이다.
Solidity Modifier3
contract MODIFIER5 { uint mutex=0; modifier m_check{ mutex++; _; mutex--; } modifier shouldBeZero{ require(mutex==0, "someone is using"); _; } modifier shouldBeZero2{ _; require(mutex==0, "someone is using"); } modifier shouldBeOne{ require(mutex==1, "should be one"); _; } modifier shouldBeOne2{ _; require(mutex==1, "should be one"); } function inAndOut() public m_check returns(string memory) { return "Done"; } function inAndOut2() public m_check shouldBeZero returns(string memory) { return "Done"; } function inAndOut2_2() public m_check shouldBeOne returns(string memory) { return "Done"; } function inAndOut2_3() public shouldBeOne m_check returns(string memory) { return "Done"; } function inAndOut2_4() public m_check shouldBeZero2 returns(string memory) { return "Done"; } function inAndOut2_5() public m_check shouldBeZero2 returns(string memory) { mutex--; return "Done"; } function inAndOut2_6() public m_check shouldBeOne2 returns(string memory) { occupy(); mutex--; return "Done"; } function inAndOut3() public shouldBeZero m_check returns(string memory) { return "Done"; } function occupy() shouldBeZero public { mutex++; } function vacancy() public { mutex--; } }
- Modifier5는 상호배제 예제이다. 한 함수에 여러 개의 modifier가 들어갈 수는 있으나 순서에 따라 결과 값이 달라진다. public M1 M2 이런식으로 구성 되어있다면
m1 충족 m2충족 함수 m2충족 m1충족 이 순서로 모두 만족하게 되어야 함수가 정상적으로 작동한다.