Solidity patterns
์๋ฆฌ๋ํฐ์ ๋ค์ํ ํจํด์ ๋ํด์ ๋ค๋ฃจ์ด๋ณด๋ ค๊ณ ํ๋ค.
์๋ ๋งํฌ๋ฅผ ์ฐธ๊ณ ํด์ ์ฐ์ฌ์ง ๊ธ์ด๋ฉฐ, ๋ณธ ๊ธ์์๋ ๋ชจ๋ ๋ด์ฉ์ ๋ด๊ณ ์์ง๋ ์๋ค.
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) {
// ...
}
}
์ค๋งํธ ์ปจํธ๋ํธ์์ ์๋น์ค ๋ก์ง์ ๊ตฌํํ๋ ๊ฒฝ์ฐ, ์์ ์ฃผ๊ธฐ๋ฅผ ๊ด๋ฆฌํด์ผ ํ๋ ๊ฒฝ์ฐ๊ฐ ์๋ค.
์๊ฐ์ ๋ฐ๋ผ์, ๋จ๊ณ์ ๋ฐ๋ผ์ ๋ฑ ๋ค์ํ ๊ฒฝ์ฐ๊ฐ ์์ ์ ์๋ค.
๋ค์๊ณผ ๊ฐ์ ๊ฒฝ์ฐ์ ์ํ๋ฅผ ๊ฐ์ง๋๋ก ๊ตฌํํ ์ ์๋ค.
์ค๋งํธ ์ปจํธ๋ํธ๋ ์๋ช
์ฃผ๊ธฐ๋์ ์ฌ๋ฌ ๋จ๊ณ๋ก ์ ํํด์ผํ๋ค.
์ค๋งํธ ์ปจํธ๋ํธ์ ๊ธฐ๋ฅ์ ํน์ ๋จ๊ณ์์๋ง ์ ๊ทผ ๊ฐ๋ฅํด์ผํ๋ค.
์ฌ์ฉ์์ ํ๋์ ๋ฐ๋ผ์ ์ค๋งํธ ์ปจํธ๋ํธ์ ์ํ๊ฐ ๋ณ๊ฒฝ๋์ด์ผ ํ๋ค.
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์ ํ์ฉํ๋ฉด ๋์ฑ ๊ฐ๋จํ๊ฒ ๊ตฌํํ ์ ์๋ค.