Solidity의 함수 수정자

coleruche.com에 원래 게시됨



Solidity에 익숙하다면 다음과 같은 코드를 보거나 접했을 수 있습니다.

pragma solidity ^0.7.0;

contract TestContract {
    uint private score;

    function getScore() external view returns(uint){
        return score;
    }
}


위의 view 함수의 getScore 키는 Solidity의 수정자의 예입니다.

Solidity의 수정자는 연결된 함수를 수정하는 작은 도우미 함수입니다. 수정자는 기본 함수가 호출되기 전에 호출되며 다음과 같은 경우에 이 동작이 필요할 수 있습니다.
  • 입력 유효성 검사.
  • 계약을 수정하기 전에 확인합니다.
  • 기본 작업 또는 기능을 실행하기 전에 일련의 작업 또는 기능을 실행합니다.

  • Solidity에는 기본 제공 수정자가 있으며 자체 사용자 지정 수정자를 만들 수도 있습니다.

    내장 수정자



    위의 view 예제는 빌트인 예제입니다. purepayable 와 같은 다른 예가 있습니다.

    보다



    이 수정자는 계약에서 내부 상태만 읽으려는 의도를 Solidity에 명시적으로 알리는 데 사용됩니다. 이 수정자를 포함하는 함수를 사용하여 상태 변수를 수정하거나 변경할 수 없습니다. 이렇게 하면 오류가 발생하고 코드 실행이 취소됩니다.

    예를 들어 위의 샘플 코드를 사용하면 다음과 같이 할 수 없습니다.

    function getScore() external view returns(uint){
        score += 1; // TypeError: Function declared as view, but this expression (potentially) modifies the state
        return score;
    }
    



    순수한



    이 수정자는 계약 상태를 읽거나 수정할 의도가 없음을 Solidity에 알리는 데 사용됩니다. view에서는 상태를 읽을 수 있지만 설정/변경할 수 없으며, pure에서는 상태를 읽을 수도 없습니다. 예를 들어:

    function getScore() external pure returns(uint){
        return score; // TypeError: Function declared as pure, but this expression (potentially) reads from the environment or state and thus requires "view".
    }
    


    "그럼 이게 언제 필요하지?"라고 생각할 수 있습니다. 내부 계산을 수행하고 기존 상태의 변수가 필요하지 않은 경우 확인하려는 경우 이 수정자가 필요할 수 있습니다. 예를 들어,

    pragma solidity ^0.7.0;
    
    contract TestContract {
        uint private scoreA;
        uint private scoreB;
    
        function addScores(uint a, uint b) internal pure returns (uint) {
            return a * b;
        }
    
        function addAndGetScores() external view returns (uint) {
            return addScores(scoreA, scoreB);
        }
    }
    


    위의 addScores는 인수를 받아들이고 이를 기반으로 한 명령만 수행합니다. 상태를 읽거나 변경하지 않습니다.

    지불 가능



    이 다른 수정자는 함수와 함께 전달될 Wei 형태의 일부 에테르를 Solidity에 알리는 데 사용됩니다. 단순히 다음과 같이 호출됩니다.

    pragma solidity ^0.7.0;
    
    contract TestContract {
        uint private score;
    
        function setScore(uint newScore) external payable {
            score = newScore;
        }
    }
    


    트랜잭션과 함께 약간의 에테르를 보내지 않고 이 작업을 수행하면 함수 실행이 실패합니다.

    맞춤 수정자



    또한 함수를 실행하기 전에 특정 작업을 처리하는 자체 사용자 지정 수정자를 만들기로 결정할 수도 있습니다. 이렇게 하려면 modifier 키워드를 사용하여 수정자를 정의하고 다른 수정자와 함께 사용할 수도 있습니다.

    pragma solidity ^0.7.0;
    
    contract TestContract {
        uint private score;
        address manager;
    
        constructor() {
            manager = msg.sender;
        }
    
        modifier isManager() {
            require(msg.sender == manager);
            _;
        }
    
        function setScore(uint newScore) external payable isManager {
            score = newScore;
        }
    }
    


    위의 계약 코드를 분석해 보겠습니다.
  • 관리자를 저장하기 위해 새 변수를 추가했습니다. 이 경우 이 변수를 배포하는 지갑 또는 계약의 주소입니다TestContract.
  • 생성자에서 이 관리자를 설정합니다.
  • 다음 줄은 isManager라는 수정자를 선언하여 연결된 함수의 호출자가 관리자인지 확인하는 곳입니다. 이렇게 하면 일반 대중이나 의도하지 않은 사용자가 계약 상태를 수정하는 것을 방지하여 계약 위에 보호 계층이 추가됩니다.

  • 위의 수정자 기능에는 밑줄 "_"만 있는 코드 줄이 있습니다. 이 특수 기호는 여기가 메인 기능 블록을 주입하는 지점임을 Solidity에 알려줍니다. 따라서 호출자가 관리자인지 확인한 다음 실행합니다score = newScore;.

    또한 수정자는 일반 함수와 같은 인수도 허용할 수 있습니다.

    pragma solidity ^0.7.0;
    
    contract TestContract {
        uint private score;
        address manager;
    
        constructor() {
            manager = msg.sender;
        }
    
        modifier checkFee(uint fee) {
            require(fee > 100000);
            _;
        }
    
        function setScore(uint newScore) external payable checkFee(msg.value) {
            score = newScore;
        }
    }
    


    위의 코드에서 newcheckFee 수정자는 100000wei보다 큰 것으로 확인되는 값으로 호출될 것으로 예상합니다. 이 수정자는 이제 setScore에서 사용되며 트랜잭션과 함께 전송된 에테르 값이 매개변수로 전달됩니다.

    좋은 웹페이지 즐겨찾기