Solidity의 함수 수정자
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
예제는 빌트인 예제입니다. pure
및 payable
와 같은 다른 예가 있습니다.보다
이 수정자는 계약에서 내부 상태만 읽으려는 의도를 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;
}
}
위의 코드에서 new
checkFee
수정자는 100000wei보다 큰 것으로 확인되는 값으로 호출될 것으로 예상합니다. 이 수정자는 이제 setScore
에서 사용되며 트랜잭션과 함께 전송된 에테르 값이 매개변수로 전달됩니다.
Reference
이 문제에 관하여(Solidity의 함수 수정자), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/cole_ruche/function-modifiers-in-solidity-2781텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)