solidity: patterns
Solidity patterns
์๋ฆฌ๋ํฐ์ ๋ค์ํ ํจํด์ ๋ํด์ ๋ค๋ฃจ์ด๋ณด๋ ค๊ณ ํ๋ค.
์๋ ๋งํฌ๋ฅผ ์ฐธ๊ณ ํด์ ์ฐ์ฌ์ง ๊ธ์ด๋ฉฐ, ๋ณธ ๊ธ์์๋ ๋ชจ๋ ๋ด์ฉ์ ๋ด๊ณ ์์ง๋ ์๋ค.
Guard Check
Guard๋ฅผ ํตํด ์ค๋งํธ ์ปจํธ๋ํธ ๋ฐ ํด๋น ์ ๋ ฅ ๋งค๊ฐ๋ณ์์ ์ ํจ์ฑ์ ๊ฒ์ฆ.
์ค๋งํธ ์ปจํธ๋ํธ์ ๋ฐ๋์งํ ๋์์ ํ์ํ ๋ชจ๋ ์ํฉ์ ํ์ธํ๊ณ ๋ชจ๋ ๊ฒ์ด ์๋ํ ๋๋ก์ธ ๊ฒฝ์ฐ์๋ง ์งํํ๋ ๊ฒ์ด๋ค.
์ด๋ฅผ Guard Check Pattern์ด๋ผ๊ณ ํ๋ค.
๋จ์ require ๋ฌธ์ ํ์ฉํด๋ ์ข๊ณ , modifier๋ฅผ ํ์ฉํด๋ ์ข๋ค.
// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.0;
contract GuardCheck {
modifier addressGuard(address addr) {
require(addr != address(0), "address should be a valid address");
_;
}
modifier valueGuard(uint value) {
require(msg.value != 0, "msg.value should be a valid value");
_;
}
function donate(
address addr
) public payable addressGuard(addr) valueGuard(msg.value) {
// ...
}
}State Machine
์ค๋งํธ ์ปจํธ๋ํธ์์ ์๋น์ค ๋ก์ง์ ๊ตฌํํ๋ ๊ฒฝ์ฐ, ์์ ์ฃผ๊ธฐ๋ฅผ ๊ด๋ฆฌํด์ผ ํ๋ ๊ฒฝ์ฐ๊ฐ ์๋ค.
์๊ฐ์ ๋ฐ๋ผ์, ๋จ๊ณ์ ๋ฐ๋ผ์ ๋ฑ ๋ค์ํ ๊ฒฝ์ฐ๊ฐ ์์ ์ ์๋ค.
๋ค์๊ณผ ๊ฐ์ ๊ฒฝ์ฐ์ ์ํ๋ฅผ ๊ฐ์ง๋๋ก ๊ตฌํํ ์ ์๋ค.
์ค๋งํธ ์ปจํธ๋ํธ๋ ์๋ช ์ฃผ๊ธฐ๋์ ์ฌ๋ฌ ๋จ๊ณ๋ก ์ ํํด์ผํ๋ค.
์ค๋งํธ ์ปจํธ๋ํธ์ ๊ธฐ๋ฅ์ ํน์ ๋จ๊ณ์์๋ง ์ ๊ทผ ๊ฐ๋ฅํด์ผํ๋ค.
์ฌ์ฉ์์ ํ๋์ ๋ฐ๋ผ์ ์ค๋งํธ ์ปจํธ๋ํธ์ ์ํ๊ฐ ๋ณ๊ฒฝ๋์ด์ผ ํ๋ค.
Solidity ์์๋ ๋ค์ํ ๋จ๊ณ๋ฅผ ๋ชจ๋ธ๋งํ๊ธฐ ์ํด enum์ ์ฌ์ฉํ ์ ์๋ค.
ํน์ ๋จ๊ณ์ ๋ํ ๊ธฐ๋ฅ ์ก์ธ์ค ์ ํ์ ๋ค์์ ๋ค๋ฃฐ Access Restriction์ ํ์ฉํ๋ฉด ๋๋ค.
์์์ ๋ค๋ฃฌ Guard Check ํจํด๊ณผ ๊ด๋ จ์ด ์์ผ๋ ์ค๊ตฌ๋๋ฐฉ์ผ๋ก ์งํํ๋ฉด ์ ์ ์์ผ๋ ์ผ๋จ State Machine์ ์ฝ๋๋ฅผ ๋ณด๊ณ ๋์ด๊ฐ๋ณด์.
์์ ์์๋ Stage์ ๋ฐ๋ผ ์ปจํธ๋ํธ ์์ฒด์ ์ํ๊ฐ ๋ฐ๋๋ค.
Access Restriction
์ค๋งํธ ์ปจํธ๋ํธ๋ ๋ธ๋ก์ฒด์ธ์ ๋ฐฐํฌ๋๋ฉด ๋๊ตฌ๋ ์ ๊ทผํ ์ ์๋ค.
๊ณต๊ฐ์ ์ธ ํน์ฑ์ผ๋ก ์ธํด ์ค๋งํธ ์ปจํธ๋ํธ์ ๋ํ ์์ ํ ์ ๋ณด ๋ณดํธ๋ฅผ ๋ณด์ฅํ๋ ๊ฒ์ ๋ถ๊ฐ๋ฅ์ ๊ฐ๊น๋ค.
๋ชจ๋ ์ ๋ณด๊ฐ ๋ชจ๋์๊ฒ ํ์๋๊ธฐ๋๋ฌธ์ ๋๊ตฐ๊ฐ๊ฐ ๋ธ๋ก์ฒด์ธ์์ ์ปจํธ๋ํธ ์ํ๋ฅผ ์ฝ๋ ๊ฒ์ ๋ง์์๊ฐ ์๋ค.
ํจ์๋ฅผ private์ผ๋ก ์ ์ธํ๋ ์ ํ์ง๋ ์์ง๋ง, ๊ทธ๋ ๊ฒ ํ๋ฉด ๋ชจ๋ ์ฌ๋์ด ํจ์๋ฅผ ํธ์ถํ ์ ์๊ฒ๋๋ค.
์ด๋ฐ ๊ฒฝ์ฐ, GuardCheck, StateMachine ํจํด๊ณผ ํจ๊ป ์ฌ์ฉํ๋ฉด ์ข๋ค.
private์ smart contract์ ์ธํฐํ์ด์ค๋ก ๋น๊ณต๊ฐํ๋ค.์ปจํธ๋ํธ ๋ด๋ถ์์๋ง ์ฌ์ฉํ๋ค.
์์ ๋ฐ์ ์ปจํธ๋ํธ์์๋ ์ฌ์ฉ ๋ถ๊ฐ๋ฅํ๋ค.
external์ smart contract์ ์ธํฐํ์ด์ค๋ก ๊ณต๊ฐํ๋ค.์ปจํธ๋ํธ ๋ด๋ถ์์ ํธ์ถํ ๊ฒฝ์ฐ this๋ฅผ ์ฌ์ฉํด์ ์ ๊ทผํด์ผ ํ๋ค.
internal์ smart contract์ ์ธํฐํ์ด์ค๋ก ๋น๊ณต๊ฐํ๋ค.์ปจํธ๋ํธ ๋ด๋ถ์์๋ง ์ฌ์ฉํ๋ค.
์์ ๋ฐ์ ์ปจํธ๋ํธ์์๋ ์ฌ์ฉ ๊ฐ๋ฅํ๋ค.
public์ smart contract์ ์ธํฐํ์ด์ค๋ก ๊ณต๊ฐํ๋ค.์ปจํธ๋ํธ์ ๋ด๋ถ์ ์ธ๋ถ์์ ๋ชจ๋ ํธ์ถํ ์ ์๋ค.
์ปจํธ๋ํธ ๋ด๋ถ์์ ํธ์ถํ ๊ฒฝ์ฐ this๋ฅผ ์ฌ์ฉํด์ ์ ๊ทผํด์ผ ํ๋ค.
OpenZeppelin์ Ownable์ ํ์ฉํ๋ฉด ๋์ฑ ๊ฐ๋จํ๊ฒ ๊ตฌํํ ์ ์๋ค.
Last updated