[Ethereum] All about Libraries

0xDaveยท2022๋…„ 12์›” 5์ผ
0

Ethereum

๋ชฉ๋ก ๋ณด๊ธฐ
70/112
post-thumbnail

๐Ÿ“š Library


๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ์ฝ”๋“œ์˜ ์žฌ์‚ฌ์šฉ์„ฑ์„ ๋†’์—ฌ์ฃผ๋Š” ์žฅ์น˜๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ์ฝ”๋“œ๋ฅผ ํ•œ ๋ฒˆ ๋””ํ”Œ๋กœ์ดํ•˜๋ฉด ๋‹ค์‹œ ๋””ํ”Œ๋กœ์ดํ•  ํ•„์š” ์—†์ด ์—ฌ๋Ÿฌ ์ปจํŠธ๋ž™ํŠธ์—์„œ ๊ฐ€์ ธ๋‹ค ์“ธ ์ˆ˜ ์žˆ๋‹ค. ๋˜ํ•œ ์ค‘๋ณต๋˜๋Š” ๊ธฐ๋Šฅ์ด๋‚˜ ํ•จ์ˆ˜๋ฅผ ๋”ฐ๋กœ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ๋ชจ์•„๋‘๋ฉด ์ปจํŠธ๋ž™ํŠธ๊ฐ€ ๊ฐ€๋ฒผ์›Œ์ง€๊ณ  ๊ฐ€์Šค ์ ˆ์•ฝ์œผ๋กœ ์ด์–ด์ง„๋‹ค. ์ด๋Š” ์ƒ์†๊ณผ๋Š” ๋‹ค๋ฅด๋‹ค. ์ƒ์†์„ ํ•˜๊ฒŒ ๋˜๋ฉด ์†”๋ฆฌ๋””ํ‹ฐ๋Š” ์ฝ”๋“œ๋ฅผ ๋ณต์‚ฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ๋น„๊ตํ–ˆ์„ ๋•Œ ๋” ๋งŽ์€ ๊ฐ€์Šค๋ฅผ ์†Œ๋น„ํ•˜๊ฒŒ ๋˜์–ด์žˆ๋‹ค. ๋˜ํ•œ scratch ๋ถ€ํ„ฐ ์ปจํŠธ๋ž™ํŠธ๋ฅผ ์งœ๋Š” ๊ฒƒ์ด ์•„๋‹Œ ๊ฒ€์ฆ๋œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๊ฐ€์ ธ๋‹ค ์“ฐ๋ฉด ๋ณด์•ˆ ๋ฐ ๊ฐœ๋ฐœ ์ธก๋ฉด์—์„œ๋„ ๋งŽ์€ ๋„์›€์ด ๋  ์ˆ˜ ์žˆ๋‹ค.


โšก๏ธ ํ•œ๊ณ„์ 


๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” stateless๋ผ์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํ•œ๊ณ„์ ์ด ์žˆ๋‹ค.

  • storage ์—†์Œ.
  • ์ด๋”๋ฅผ ๋ฐ›์„ ์ˆ˜ ์—†์Œ. (fallback ํ•จ์ˆ˜ ์—†์Œ + payable ํ•จ์ˆ˜ ์‚ฌ์šฉ ๋ถˆ๊ฐ€) -> ethereum.stackexchange์— ๋”ฐ๋ฅด๋ฉด ๋‹ค๋ฅธ ์ปจํŠธ๋ž™ํŠธ์—์„œ selfdestruct()๋กœ ์ปจํŠธ๋ž™ํŠธ๋ฅผ ํŒŒ๊ดดํ•˜๋ฉด์„œ ๋ณด๋‚ผ ์ˆ˜ ์žˆ๊ธฐ๋Š” ํ•˜๋‹ค..
  • ์ƒ์† ๋ถˆ๊ฐ€
  • selfdestruct() ์‚ฌ์šฉ ๋ถˆ๊ฐ€

๐Ÿง‘โ€๐Ÿณ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋งŒ๋“ค์–ด๋ณด๊ธฐ


pragma solidity 0.8.0;

library libraryName {
    // struct, enum or constant variable declaration
    // function definition with body
}

๋งŒ๋“ ๋Š ๋ฐฉ๋ฒ•์€ ๊ฐ„๋‹จํ•˜๋‹ค. contract ๋Œ€์‹  library๋กœ ์ž‘์„ฑํ•˜๋ฉด ๋œ๋‹ค. ์ด ๋•Œ storage๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์ผ๋ฐ˜์ ์ธ ๋ณ€์ˆ˜๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜๋Š” ์—†๋‹ค. ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๊ฒƒ์€

  1. struct
  2. enum,
  3. constant๋กœ ์ •์˜๋œ ๋ณ€์ˆ˜์ด๋‹ค.

constant๋Š” ์ปจํŠธ๋ž™ํŠธ์˜ bytecode์— ์ €์žฅ๋˜๊ธฐ ๋•Œ๋ฌธ์— storage์™€ ์ƒ๊ด€ ์—†๋‹ค.


pragma solidity 0.8.0;

library MathLib {
    
    struct MathConstant {
        uint Pi;             // ฯ€ (Pi) โ‰ˆ 3.1415926535...
        uint Phi;            // Golden ratio โ‰ˆ 1.6180339887...
        uint Tau;            // Tau (2pi) โ‰ˆ 6.283185...
        uint Omega;          // ฮฉ (Omega) โ‰ˆ 0.5671432904...
        uint ImaginaryUnit;  // i (Imaginary Unit) = โˆšโ€“1
        uint EulerNb;        // Euler number โ‰ˆ 2.7182818284590452...
        uint PythagoraConst; // Pythagora constant (โˆš2) โ‰ˆ 1.41421... 
        uint TheodorusConst; // Theodorus constant (โˆš3) โ‰ˆ 1.73205... 
    }
    
}

์œ„์™€ ๊ฐ™์ด ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.


โ›“ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์‚ฌ์šฉํ•˜๊ธฐ


๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ๋‘ ๊ฐ€์ง€ ์ผ€์ด์Šค๋กœ ๋‚˜๋‰œ๋‹ค.

  1. Embedded Library - internal function๋งŒ ์žˆ์„ ๊ฒฝ์šฐ, EVM์—์„œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ปจํŠธ๋ž™ํŠธ๋กœ ๊ฐ€์ ธ์˜ค๊ธฐ ๋•Œ๋ฌธ์—(JUMP ์‚ฌ์šฉ) ๋”ฐ๋กœ ๋””ํ”Œ๋กœ์ด ํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค.

  2. Linked Library - public ๋˜๋Š” external function์ด ์žˆ์„ ๊ฒฝ์šฐ, ๋”ฐ๋กœ ๋””ํ”Œ๋กœ์ด ํ•ด์ค˜์•ผ ํ•œ๋‹ค. ๋””ํ”Œ๋กœ์ด๋œ ์ฃผ์†Œ๋ฅผ ์ด์šฉํ•˜๋ฉด ๋œ๋‹ค.


import ํ•ด์˜ค๊ธฐ + using

pragma solidity 0.8.0;

import MathLib from โ€œ./MathLib.solโ€;

contract MyContract {
    using MathLib for uint;
    
  	uint a = 10;
	uint b= 10;
	uint c = a.subUint(b); //0
  
}

์‚ฌ์šฉํ•  ์ปจํŠธ๋ž™ํŠธ์—์„œ ๊ฐ„๋‹จํžˆ importํ•ด์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ์ดํ›„ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ ์šฉํ•  ํƒ€์ž…์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ํ•จ์ˆ˜๋Š” ์ ์šฉ๋œ ํƒ€์ž…์˜ ๋ฉ”์†Œ๋“œ์ฒ˜๋Ÿผ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค.


pragma solidity 0.8.0;

library MathLib {
    
    function multiply(uint a, uint b) public view returns (uint, address) {
        return (a * b, address(this));
    }
}

contract Example {
    
    using MathLib for uint;
    address owner = address(this);
    
    function multiplyExample(uint _a, uint _b) public view returns (uint, address) {
        return _a.multiply(_b);
    }
}

์œ„ ์˜ˆ์ œ๊ฐ™์€ ๊ฒฝ์šฐ, multiplyExample๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด Example ์ปจํŠธ๋ž™ํŠธ์˜ ์ฃผ์†Œ๋ฅผ ๋ฆฌํ„ดํ•œ๋‹ค. ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ์ฃผ์†Œ๊ฐ€ ์•„๋‹Œ ์ปจํŠธ๋ž™ํŠธ์˜ ์ฃผ์†Œ๋ฅผ ๋ฆฌํ„ดํ•œ๋‹ค๋Š” ๊ฒƒ์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ DELEGATECALL์„ ์‚ฌ์šฉํ•œ๋‹ค๋Š” ๋œป์ด๋‹ค. ์ฃผ์†Œ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ msg.value์™€ msg.data๋„ ๋งˆ์ฐฌ๊ฐ€์ง€๋‹ค.

๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ํ•จ์ˆ˜๊ฐ€ internal๋กœ ์„ ์–ธ๋๋‹ค๋ฉด ์ปดํŒŒ์ผ ํ•  ๋•Œ EVM์—์„œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ํ•จ์ˆ˜๋ฅผ ์ปจํŠธ๋ž™ํŠธ๋กœ ๊ฐ€์ ธ์˜จ๋‹ค. ์ดํ›„ ์ปจํŠธ๋ž™ํŠธ์—์„œ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ ์›๋ž˜ ์ปจํŠธ๋ž™ํŠธ์˜ ํ•จ์ˆ˜๊ฐ€ ์žˆ์—ˆ๋˜ ๊ฒƒ ์ฒ˜๋Ÿผ JUMP๋ฅผ ์ด์šฉํ•ด ํ˜ธ์ถœํ•œ๋‹ค.(DELEGATECALL X)


Mapping

pragma solidity 0.8.0;

library Messenger {
    event LogFunctionWithMappingAsInput(
        address from, 
        address to,
        string message
    );
    function sendMessage(
        address to, 
        mapping (string => string) storage aMapping
    ) public {
        emit LogFunctionWithMappingAsInput(
            msg.sender, 
            to, 
            aMapping[โ€œtest1โ€]
        );
    }
}

๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์•ˆ์˜ ํ•จ์ˆ˜์—์„œ mapping์„ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด ๋•Œ ๋ฐ˜๋“œ์‹œ storage๋กœ ์„ ์–ธ๋˜์–ด์•ผ ํ•˜๋ฉฐ ์‚ฌ์šฉํ•˜๋Š” ํ•จ์ˆ˜๋Š” public, private, external, internal ๋ชจ๋‘ ๊ฐ€๋Šฅํ•˜๋‹ค.


modifier

๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ž์ฒด์—์„œ modifier๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์•ˆ์—์„œ๋งŒ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค. ๋”ฐ๋ผ์„œ ์ปจํŠธ๋ž™ํŠธ์—์„œ modifier๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ์ปจํŠธ๋ž™ํŠธ ์ž์ฒด์—์„œ ์„ ์–ธํ•ด์•ผ ํ•œ๋‹ค.


์ถœ์ฒ˜ ๋ฐ ์ฐธ๊ณ ์ž๋ฃŒ


  1. Solidity Tutorial: all about Libraries
profile
Just BUIDL :)

0๊ฐœ์˜ ๋Œ“๊ธ€