2020.코딩일지

[solidity] library_SafeMath overflow (feat.솔리디티깨부수기) 본문

Block Chain

[solidity] library_SafeMath overflow (feat.솔리디티깨부수기)

개발하는라푼젤 2022. 12. 5. 15:47
728x90

 

 오버플로우

0.8버전 기준으로 이전과 이후를 비교

// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.7.0 <0.9.0;
//40강
/*
library: 기본에 만들던 스컨과 다른 종류의 스컨이라 할 수 있다. 라이브러리를 사용함으로써 몇가지 이점과 제한사항이 있다.

이점
    1. 재사용 : 블록체인에 라이브러리가 배포되면, 다른 스컨들에 적용가능.
    2. 가스 소비 줄임 : 라이브러리는 재사용가능 한 코드, 
        즉 여러개의 스컨에서 공통으로 쓰이는 코드를 따로 라이브러리 통해서 배포하기에,
        다른 스컨에 명시를 해주는 것이 아니라, 라이브러리를 적용만 하면 되기에 가스 소비량을 줄일 수 있다.
        왜냐하면, 가스는 스컨의 사이즈/길이에 영향을 많이 받기 때문이다.
    3. 데이터 타입 적용 : 라이브러리의 기능들은 데이터 타입에 적용할 수 있기에, 좀 더 쉽게 사용할 수 있다.

제한사항
    1. fallback 함수 불가 : fallback함수를 라이브러리 안에 정의를 못하기때문에 이더를 갖고 있을 수 없다.
    2. 상속불가
    3. payable 함수 정의 불가
*/
//0.8 -> overflow revert
// overflow: 0~255 -> 257 -> 1

library SafeMath {
    //0~255; 0.8이전버전에서는 합이 255가 넘으면 오버플로우가 발생. 
    // 0.8이후버전에서는 255가 넘으면 에러발생
    // a:1 b:255 -> a+b= 256 -> (오버플로우로 0이됨)0 >= 1 -> false
    // a:0 b:256 -> b에서 uint8이라 에러발생
    function add(uint8 a, uint8 b) internal pure returns (uint8) {
        require(a+b >= a, "SafeMath: addition overflow");
        return a + b;
    }
}

contract lec40 {
    using SafeMath for uint8;
    uint8 public a;

    function becomeOverflow(uint8 _num1, uint8 _num2) public {
        a = _num1.add(_num2);
        //또는 아래와같이 쓸수있다.
        //a = SafeMath.add(_num1, _num2);
        //또는
        //a = _num1 + _num2;
    }
}
Comments