[Solidity] Constants, Immutable, Gas, Loop

jhcha·2023년 7월 26일
0

Solidity

목록 보기
3/17
post-thumbnail

Constants

url: https://solidity-by-example.org/constants/

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.17;

contract Constants {
    // coding convention to uppercase constant variables
    address public constant MY_ADDRESS = 0x777788889999AaAAbBbbCcccddDdeeeEfFFfCcCc;
    uint public constant MY_UINT = 123;
}

상수를 사용하면 상대적으로 가스 비용을 절약할 수 있다고 한다.

Immutable

url: https://solidity-by-example.org/immutable/

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.17;

contract Immutable {
    // coding convention to uppercase constant variables
    address public immutable MY_ADDRESS;
    uint public immutable MY_UINT;

    constructor(uint _myUint) {
        MY_ADDRESS = msg.sender;
        MY_UINT = _myUint;
    }
}

불변성은 Constants (상수)와 유사하지만, Constructor (생성자)를 통해 값을 초기 입력할 수 있다. 이후에는 값 수정 불가능

Reading and Writing to a State Variable

url: https://solidity-by-example.org/state-variables/

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.17;

contract SimpleStorage {
    // State variable to store a number
    uint public num;

    // You need to send a transaction to write to a state variable.
    function set(uint _num) public {
        num = _num;
    }

    // You can read from a state variable without sending a transaction.
    function get() public view returns (uint) {
        return num;
    }
}

블록체인에 저장되어 영속성을 갖는 uint 자료형 num 변수를 선언
매개변수로 uint 자료형 _num 변수를 입력받아, 상태변수 num에 더한다.
일반적으로 매개변수 앞에 _를 붙이는 이유는 매개변수와 다른 변수와 구분하기 위한 규칙이라고 한다. (Not Syntax Error)

Function Modifier (함수 변경자)

  • 함수 변경자는 Solidity 고유 문법으로 함수의 동작을 변경시키기 위해 사용한다.
  • modifier 키워드를 사용해서 함수 변경자를 사용자 정의 함수로 선언할 수 있다.
  • view, pure는 기본적으로 내장된 함수 변경자
    • view는 해당 함수를 읽기 전용으로 제약을 건다. view 함수 변경자가 적용된 함수에서는 특정 데이터를 쓰는 것이 불가능하다.
    • pure는 순수 함수를 의미하고, 외부 값을 가져와서 변경시키는 side effect를 허용하지 않는다. 따라서, pure 함수의 매개변수만을 이용해서 값을 return 할 수 있다.

Ether and Wei

url: https://solidity-by-example.org/ether-units/

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.17;

contract EtherUnits {
    uint public oneWei = 1 wei;
    // 1 wei is equal to 1
    bool public isOneWei = 1 wei == 1;

    uint public oneEther = 1 ether;
    // 1 ether is equal to 10^18 wei
    bool public isOneEther = 1 ether == 1e18;
}

비교 연산자 (Comparison Operators)

  • a == b
    • a와 b가 일치하면 참, 일치하지 않으면 거짓
  • a != b
    • a와 b가 일치하지 않으면 참, 일치하면 거짓
  • a > b
    • a가 b보다 크면 참
  • a >= b
    • a가 b 이상이면 참
bool public isOneWei = 1 wei == 1;
bool public isOneEther = 1 ether == 1e18;

1 wei는 1과 같고, 1 ether는 10^18과 같다.

지수 표기법 (Exponential Notation)

  • 1e18 == 1 * 10^3 == 1000
  • 1e-3 == 1 * 10^-3 == 0.001

Gas

url: https://solidity-by-example.org/gas/

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.17;

contract Gas {
    uint public i = 0;

    // Using up all of the gas that you send causes your transaction to fail.
    // State changes are undone.
    // Gas spent are not refunded.
    function forever() public {
        // Here we run a loop until all of the gas are spent
        // and the transaction fails
        while (true) {
            i += 1;
        }
    }
}
  • Gas는 연산 기본 단위
  • Gas Spent는 트랜잭션에 사용된 가스의 양
  • Gas Price는 트랜잭션에 사용할 가스의 가격
    • Gas Price가 높을수록 트랜잭션 처리 우선순위가 높아지며, 사용하지 않은 가스는 돌려받는다.
function forever() public {
        while (true) {
            i += 1;
        }
    }
  • 반복문을 통한 무한 루프 코드를 배포한 경우, 연산에 가스가 소비되므로 설정된 gas limit에 의해 transaction fail이 발생한다.

Gas limit

  • Gas limit는 해당 트랜잭션에 소비할 최대 가스량을 사용자가 정할 수 있다.
  • Block Gas limit는 블록에 사용할 수 있는 최대 가스량을 의미하고, 블록체인 네트워크에 의해 설정된다.

If / Else

url: https://solidity-by-example.org/if-else/

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.17;

contract IfElse {
    function foo(uint x) public pure returns (uint) {
        if (x < 10) {
            return 0;
        } else if (x < 20) {
            return 1;
        } else {
            return 2;
        }
    }

    function ternary(uint _x) public pure returns (uint) {
        // if (_x < 10) {
        //     return 1;
        // }
        // return 2;

        // shorthand way to write if / else statement
        // the "?" operator is called the ternary operator
        return _x < 10 ? 1 : 2;
    }
}
  • Soldiity는 다른 프로그래밍 언어에서 사용하는 if, else 조건문을 지원한다.
    • x < 10, x는 10 이하일 때 참
  • 마찬가지로 삼항 연산자를 지원하여 if/ else 조건문을 더 짧게 구현할 수 있다.
    • (조건문) ? 참: 거짓; 따라서, x < 10 ? 1: 2; x가 10보다 작으면 1을 return, 작지 않으면 2를 return한다.

For and While Loop

url: https://solidity-by-example.org/loop/

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.17;

contract Loop {
    function loop() public {
        // for loop
        for (uint i = 0; i < 10; i++) {
            if (i == 3) {
                // Skip to next iteration with continue
                continue;
            }
            if (i == 5) {
                // Exit loop with break
                break;
            }
        }

        // while loop
        uint j;
        while (j < 10) {
            j++;
        }
    }
}
  • Solidity는 for, while, do while 반복문을 지원한다.
    • for(초기화식; 조건식; 증감식){실행 문장}
    • while(조건식){실행 문장}
    • do{실행 문장}while(조건식)

0개의 댓글