티스토리 뷰

반응형

Function Modifiers

  • 함수의 동작을 변경하기 위해 사용
  • contract에서 상속 가능
  • virtual인 경우에만 derived contract에서 재정의 가능
// SPDX-License-Identifier: GPL-3.0
 pragma solidity >0.7.0 <0.9.0;


contract owned {  
constructor() { owner = payable(msg.sender); }  
address payable owner;

modifier onlyOwner {
    require(
        msg.sender == owner,
        "Only owner can call this function."
    );
    _;
}

}

contract destructible is owned {  
// owned에서 onlyOwner modifier 상속받아 destroy에 적용  
//  
function destroy() public onlyOwner {  
selfdestruct(owner);  
}  
}

contract priced {  
// modifier은 arguement를 받을 수 있음  
modifier costs(uint price) {  
if (msg.value >= price) {  
\_;  
}  
}  
}

contract Register is priced, destructible {  
mapping (address => bool) registeredAddresses;  
uint price;

constructor(uint initialPrice) { price = initialPrice; }

// payable 키워드가 없다면 Ether가 보내는 것을 모두 거절
function register() public payable costs(price) {
    registeredAddresses[msg.sender] = true;
}

function changePrice(uint _price) public onlyOwner {
    price = _price;
}


}

contract Mutex {  
bool locked;  
modifier noReentrancy() {  
require(  
!locked,  
"Reentrant call."  
);  
locked = true;  
\_;  
locked = false;  
}

// 
function f() public noReentrancy returns (uint) {
    (bool success,) = msg.sender.call("");
    require(success);
    return 7;
}

}
  • contract C에 정의된 modifier m에 접근하려면, C.m으로 참조 가능
  • 공백으로 구분된 리스트로 여러 개의 modifier을 function에 적용 가능
  • 수정한 argument나 함수의 반환 값에 암묵적으로 접근하거나 변경할 수 없음
  • modifier나 funtion으로부터 명시적인 반환으로 현재 modifier과 function의 본문만 남음. 반환 변수가 할당되고 _ 뒤에 제어 흐름이 지속.
  • modifier은 함수의 body가 실행되지 않도록 할 수 있으며, 이 경우 function의 body가 없는 것 처럼 반환 값이 기본 값으로 설정됨.

Constant and Immutable State Variables

constant, immutable

공통점

  • state variable 선언에 사용
  • contract가 생성된 뒤에 변경 불가
  • 컴파일러는 변수에 대한 저장 공간을 예약 하지 않음 -> 이 말은 어셈블리어에서 실제 값이 들어간다는 말?
  • state variable과 비교하여 가스 비용이 더 낮음

차이점

  • constant
    • 컴파일할 때 값이 고정
    • 접근될 때마다 평가됨
  • immutable
    • 생성시간에 값이 할당됨
    • contruction time에 평가됨
    • constant보다 제한적
pragma solidity >=0.7.4;

uint constant X = 32**22 + 8;

contract C {
    string constant TEXT = "abc";
    bytes32 constant MY_HASH = keccak256("abc");
    uint immutable decimals;
    uint immutable maxBalance;
    address immutable owner = msg.sender;

    constructor(uint _decimals, address _reference) {
        decimals = _decimals;
        // Assignments to immutables can even access the environment.
        maxBalance = _reference.balance;
    }

    function isBalanceTooHigh(address _other) public view returns (bool) {
        return _other.balance > maxBalance;
    }
}
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함