05-15 (3)

조하빈 ·2023년 5월 15일
0

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충족 이 순서로 모두 만족하게 되어야 함수가 정상적으로 작동한다.
profile
PPisland

0개의 댓글