๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์ฝ๋์ ์ฌ์ฌ์ฉ์ฑ์ ๋์ฌ์ฃผ๋ ์ฅ์น๋ผ๊ณ ํ ์ ์๋ค. ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ฝ๋๋ฅผ ํ ๋ฒ ๋ํ๋ก์ดํ๋ฉด ๋ค์ ๋ํ๋ก์ดํ ํ์ ์์ด ์ฌ๋ฌ ์ปจํธ๋ํธ์์ ๊ฐ์ ธ๋ค ์ธ ์ ์๋ค. ๋ํ ์ค๋ณต๋๋ ๊ธฐ๋ฅ์ด๋ ํจ์๋ฅผ ๋ฐ๋ก ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ชจ์๋๋ฉด ์ปจํธ๋ํธ๊ฐ ๊ฐ๋ฒผ์์ง๊ณ ๊ฐ์ค ์ ์ฝ์ผ๋ก ์ด์ด์ง๋ค. ์ด๋ ์์๊ณผ๋ ๋ค๋ฅด๋ค. ์์์ ํ๊ฒ ๋๋ฉด ์๋ฆฌ๋ํฐ๋ ์ฝ๋๋ฅผ ๋ณต์ฌํ๊ธฐ ๋๋ฌธ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋น๊ตํ์ ๋ ๋ ๋ง์ ๊ฐ์ค๋ฅผ ์๋นํ๊ฒ ๋์ด์๋ค. ๋ํ scratch ๋ถํฐ ์ปจํธ๋ํธ๋ฅผ ์ง๋ ๊ฒ์ด ์๋ ๊ฒ์ฆ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๊ฐ์ ธ๋ค ์ฐ๋ฉด ๋ณด์ ๋ฐ ๊ฐ๋ฐ ์ธก๋ฉด์์๋ ๋ง์ ๋์์ด ๋ ์ ์๋ค.
๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ stateless
๋ผ์ ๋ค์๊ณผ ๊ฐ์ ํ๊ณ์ ์ด ์๋ค.
storage
์์.selfdestruct()
๋ก ์ปจํธ๋ํธ๋ฅผ ํ๊ดดํ๋ฉด์ ๋ณด๋ผ ์ ์๊ธฐ๋ ํ๋ค..selfdestruct()
์ฌ์ฉ ๋ถ๊ฐpragma solidity 0.8.0;
library libraryName {
// struct, enum or constant variable declaration
// function definition with body
}
๋ง๋ ๋ ๋ฐฉ๋ฒ์ ๊ฐ๋จํ๋ค. contract
๋์ library
๋ก ์์ฑํ๋ฉด ๋๋ค. ์ด ๋ storage
๊ฐ ์๊ธฐ ๋๋ฌธ์ ์ผ๋ฐ์ ์ธ ๋ณ์๋ฅผ ์์ฑํ ์๋ ์๋ค. ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ์ฌ์ฉ ๊ฐ๋ฅํ ๊ฒ์
struct
enum
,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...
}
}
์์ ๊ฐ์ด ์์ฑํ ์ ์๋ค.
๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ ๋ ๋ ๊ฐ์ง ์ผ์ด์ค๋ก ๋๋๋ค.
Embedded Library - internal function๋ง ์์ ๊ฒฝ์ฐ, EVM์์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ปจํธ๋ํธ๋ก ๊ฐ์ ธ์ค๊ธฐ ๋๋ฌธ์(JUMP
์ฌ์ฉ) ๋ฐ๋ก ๋ํ๋ก์ด ํ ํ์๊ฐ ์๋ค.
Linked Library - public ๋๋ external function์ด ์์ ๊ฒฝ์ฐ, ๋ฐ๋ก ๋ํ๋ก์ด ํด์ค์ผ ํ๋ค. ๋ํ๋ก์ด๋ ์ฃผ์๋ฅผ ์ด์ฉํ๋ฉด ๋๋ค.
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)
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๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด ์ปจํธ๋ํธ ์์ฒด์์ ์ ์ธํด์ผ ํ๋ค.