블록체인

[solidity] library, enum

멍개. 2022. 8. 28. 07:16

· library

library는 컨트랙트를 라이브러리처럼 사용할 수 있도록 도와줍니다. 다만 library를 사용하기 위해선 using ~ for ~ 키워드를 이용합니다.

pragma solidity 0.8.9;

library MyLibrary {
    struct data {
        string name;  
        uint age;
    }
    
    function add(uint a, uint b) external pure returns (uint) {
        return a + b;
    }
}

library Math {
    function add (uint _a, uint _b) external pure returns (uint) {
        return _a + _b;
    }
    
    function sub (uint _a, uint _b) external pure returns (uint) {
        return _a - _b;
    }
}

contract MyContract {
    
    using MyLibrary for MyLibrary.data;
    using Math for *;

    MyLibrary.data charactor;

    function getA () public view returns (MyLibrary.data memory) {
        return charactor;
    }
    
    function setA (string memory _name, uint _age) public  {
        charactor = MyLibrary.data(_name, _age);
    }
    
    function mathAdd (uint _a, uint _b) public pure returns (uint) {
        return Math.add(_a, _b);
    }
    
    function mathSub (uint _a, uint _b) public pure returns (uint) {
        return Math.sub(_a, _b);
    }
}

만약 MyLibrary와 Math를 별도의 파일로 분리한다고 하면 import로 가져온 후 사용할 수 있습니다.

// library.sol
pragma solidity 0.8.9;

library MyLibrary {
    struct data {
        string name;  
        uint age;
    }
    
    function add(uint a, uint b) external pure returns (uint) {
        return a + b;
    }
}

library Math {
    function add (uint _a, uint _b) external pure returns (uint) {
        return _a + _b;
    }
    
    function sub (uint _a, uint _b) external pure returns (uint) {
        return _a - _b;
    }
}
pragma solidity 0.8.9;

import './library.sol';

contract MyContract {
    
    using MyLibrary for MyLibrary.data;
    using Math for *;

    MyLibrary.data charactor;

    
    function getA () public view returns (MyLibrary.data memory) {
        return charactor;
    }
    
    function setA (string memory _name, uint _age) public  {
        charactor = MyLibrary.data(_name, _age);
    }
    
    function mathAdd (uint _a, uint _b) public pure returns (uint) {
        return Math.add(_a, _b);
    }
    
    function mathSub (uint _a, uint _b) public pure returns (uint) {
        return Math.sub(_a, _b);
    }
}

· enum

pragma solidity 0.8.9;

contract MyContract {
    enum  bb { a1, a2, a3 }
    
    function getA() public pure returns (bb) {
        return bb.a1;
    }
}

enum은 연속된 자연수를 특정 문자열에 맵핑하여 관리할 때 유용합니다.

enum은 상수를 변수로 관리하는데 의의가 있습니다.