1. Development environment setup and smart contract writing/debugging
์ค๋งํธ ์ปจํธ๋ํธ ์์ฑ
์ด๋ฒ ํํ ๋ฆฌ์ผ์์๋ EVM์์ ์ค๋งํธ ์ปจํธ๋ํธ๊ฐ ์ด๋ป๊ฒ ๋์ํ๋์ง ์์๋ณธ ๋ค ๊ฐ๋จํ ์ปจํธ๋ํธ ์ฝ๋๋ฅผ ์์ฑํ๊ณ ๋น๋, ๋๋ฒ๊น , ๋ฐฐํฌํ๋ ๋ฐฉ๋ฒ์ ์์๋ณด๊ฒ ์ต๋๋ค. ์ค์ต์์๋ Solidity ์ธ์ด๋ฅผ ์ฌ์ฉํด EVM ์ค๋งํธ ์ปจํธ๋ํธ๋ฅผ ์์ฑํ ์์ ์ ๋๋ค.
Smart Contract Language
์ด๋๋ฆฌ์ ํ๊ฒฝ์์์ ์ค๋งํธ ์ปจํธ๋ํธ๋ฅผ ์์ฑํ๊ธฐ ์ํด ์ค๊ณ๋ Solidity๋ ์ ์ ํ์ ์ธ์ด๋ก ์์, ๋ผ์ด๋ธ๋ฌ๋ฆฌ, ๋ณต์กํ ์ ์ ์ ์ง์ ํ์ ์ ์ง์ํ๋ฉฐ ๋ค์ํ ์ด๋๋ฆฌ์ ํ๊ฒฝ์ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด ์ค ๊ฐ์ฅ ๋์ค์ ์ผ๋ก ์ฌ์ฉ๋๋ ์ธ์ด์ ๋๋ค.
- Solidity ์ธ์ด๋ ๋ฌธ๋ฒ์ ๋ํ ์์ธํ ์ค๋ช ์ ์ฌ๊ธฐ๋ฅผ ํตํด ํ์ธํ ์ ์์ต๋๋ค.
How Smart Contract Works on EVM?
์ค๋งํธ ์ปจํธ๋ํธ ์์ค ์ฝ๋๋ ์ปดํ์ผ๋ฌ๋ฅผ ํตํด ๋ฐ์ดํธ์ฝ๋๋ก ๋ณํํ ํ ๋ธ๋ก์ฒด์ธ์ ๋ฐฐํฌํ ์ ์์ต๋๋ค. Solidity ์ปดํ์ผ๋ฌ๋ ์ค๋งํธ ์ปจํธ๋ํธ ์ฝ๋๋ฅผ ๋ฐ์ดํธ์ฝ๋๋ก ๋ณํํ ๋ ์ค๋งํธ ์ปจํธ๋ํธ์ ์ธ๋ถ ์ ํ๋ฆฌ์ผ์ด์ ๊ฐ์ ์ํธ์์ฉ์ ์ ์ํ ABI๋ฅผ ๋ฐํํด์ฃผ๋ฉฐ ์ธ๋ถ ์ ํ๋ฆฌ์ผ์ด์ ์ ABI๋ฅผ ์ด์ฉํด ์ค๋งํธ ์ปจํธ๋ํธ์ ํจ์ ์ด๋ฆ, ๋งค๊ฐ๋ณ์, ๋ฐํ๊ฐ ๋ฑ์ ํ์ธํ๊ณ ํจ์ ํธ์ถ ์ ์ด๋ฌํ ๊ฐ์ ๋ง๋ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์ดํธ์ฝ๋๋ก ์ธ์ฝ๋ฉํ์ฌ ํธ๋์ญ์ ํ์ด๋ก๋์ ๋ด์ ๋ฐฐํฌ๋ ์ค๋งํธ ์ปจํธ๋ํธ์ ์ํธ์์ฉํ ์ ์์ต๋๋ค.
๋ฐฐํฌ๋ ์ค๋งํธ ์ปจํธ๋ํธ๋ ๊ณ ์ ์ ์ฃผ์๋ฅผ ๊ฐ์ง๊ณ ์์ผ๋ฉฐ ํด๋ผ์ด์ธํธ๊ฐ ํธ๋์ญ์ ์ ์คํํด ์ค๋งํธ ์ปจํธ๋ํธ์ ํจ์๋ฅผ ํธ์ถํ๋ฉด ์ด ์ฃผ์๋ฅผ ํตํด ์ค๋งํธ ์ปจํธ๋ํธ๋ฅผ ํน์ ํ ์ ์์ต๋๋ค. ํน์ ๋ ์ค๋งํธ ์ปจํธ๋ํธ์ ๋ฐ์ดํธ์ฝ๋๋ ๋ ธ๋์ EVM์ ๋ก๋๋์ด ํด๋ผ์ด์ธํธ์ ํธ๋์ญ์ ํ์ด๋ก๋์ ๋ฐ๋ผ ๋ก์ง์ ์คํํ๊ฒ ๋ฉ๋๋ค.
๊ตฌํํ ์ค๋งํธ ์ปจํธ๋ํธ์ ๋ก์ง๊ณผ ๊ธฐ๋ฅ
์ค๋งํธ ์ปจํธ๋ํธ๊ฐ ์ด๋ป๊ฒ ๋ฐฐํฌ๋๋์ง ์์๋ณด์์ผ๋ ๊ฐ๋จํ ๋ฉ์์ง ์ค๋งํธ ์ปจํธ๋ํธ ์ฝ๋๋ฅผ ์์ฑํ๊ณ ์ด๋๋ฆฌ์์ ๋ฐฐํฌํ๊ณ ํธ์ถํด ๋ณผ๊น์?
- ๋ฉ์์ง ์ค๋งํธ ์ปจํธ๋ํธ์ ๋ก์ง
- ์ด๊ธฐ ๋ฉ์์ง๋ฅผ ์ค์ ํฉ๋๋ค.
- ์ด๊ธฐ์ ์ค์ ํ ๋ฉ์์ง๋ฅผ ํ์ธํฉ๋๋ค.
- ์ฌ์ฉ์๊ฐ ์ ๋ ฅํ ๊ฐ์ผ๋ก ๋ฉ์์ง๋ฅผ ๋ณ๊ฒฝํฉ๋๋ค.
- ๋ณ๊ฒฝ๋ ๋ฉ์์ง๋ฅผ ํ์ธํฉ๋๋ค.
์ ๋ด์ฉ์ ๊ตฌํํ๊ธฐ ์ํด ๊ฐ ๋ก์ง๋ง๋ค ํ์ํ ๊ธฐ๋ฅ์ ์ ์ํด ๋ณด๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- ์ด๊ธฐ ๋ฉ์์ง๋ฅผ ์ค์ ํฉ๋๋ค.
- ์ปจํธ๋ํธ ๋ฐฐํฌ ์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ ๋ ฅ๋ ๋ฉ์์ง๋ฅผ ์ ์ฉ
- ์ด๊ธฐ์ ์ค์ ํ ๋ฉ์์ง๋ฅผ ํ์ธํฉ๋๋ค.
- ๋ธ๋ก์ฒด์ธ๊ณผ ์ํธ์์ฉํ์ฌ ์ปจํธ๋ํธ์ ์ ๋ ฅ๋ ๋ฉ์์ง๋ฅผ ์กฐํ
- ์ฌ์ฉ์๊ฐ ์
๋ ฅํ ๊ฐ์ผ๋ก ๋ฉ์์ง๋ฅผ ๋ณ๊ฒฝํฉ๋๋ค.
- ๋ธ๋ก์ฒด์ธ๊ณผ ์ํธ์์ฉํ์ฌ ์ปจํธ๋ํธ์ ๋ฉ์์ง๋ฅผ ์ ๋ ฅ
- ๋ธ๋ก์ฒด์ธ๊ณผ ์ํธ์์ฉํ์ฌ ์ปจํธ๋ํธ์ ์ ๋ ฅ๋ ๋ฉ์์ง๋ฅผ ์กฐํ
- ๋ฉ์์ง๋ฅผ ์ด๊ธฐํ ํฉ๋๋ค.
- ํ์ฌ์ ๋ฉ์์ง๋ฅผ ์ด๊ธฐํํ์ฌ ๋น ๊ฐ์ผ๋ก ๋ณ๊ฒฝ
์ด์์ผ๋ก ์ค๋งํธ ์ปจํธ๋ํธ์ ๊ธฐ๋ฅ๊ณผ ๋ก์ง ๋ชจ๋ ์ค๋น๊ฐ ๋์์ต๋๋ค! ์ด์ ์ค๋งํธ ์ปจํธ๋ํธ๋ฅผ ํจ๊ป ์์ฑํด ๋ด ์๋ค!
์ค๋งํธ ์ปจํธ๋ํธ ์์ฑ
ํธ๋ฆฌํ๊ฒ ์ค๋งํธ ์ปจํธ๋ํธ๋ฅผ ์์ฑํ๊ณ ํ ์คํธํด ๋ณด๊ธฐ ์ํด Remix IDE๋ฅผ ์ด์ฉํ๊ฒ ์ต๋๋ค. ์๋ ๋งํฌ๋ฅผ ํด๋ฆญํ์ฌ Remix IDE๋ฅผ ์ด์ฉํ ์ ์์ต๋๋ค.
Remix IDE์ ์ ๊ทผํ๋ฉด ๋ค์๊ณผ ๊ฐ์ ํ๋ฉด์ด ๋ํ๋ฉ๋๋ค. ์ฐ์ธก์ ํญ ์ค contracts ๋๋ ํ ๋ฆฌ๋ฅผ ํด๋ฆญํ๋ฉด Remix IDE์์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ ๊ณตํด์ฃผ๋ ์ปจํธ๋ํธ ์์ ๋ฅผ ํ์ธํ ์ ์์ต๋๋ค.
์๋ก์ด Solidity ํ์ผ์ ๋ง๋ค์ด ๋ฉ์์ง ์ปจํธ๋ํธ๋ฅผ ์์ฑํ๊ฒ ์ต๋๋ค. Solidity ํ์ผ์ ํ์ฅ์๋ .sol ์
๋๋ค. ํ์ผ์ ์ด๋ฆ์ 4_Message.sol
๋ก ๋ช
๋ช
ํฉ๋๋ค.
๋ผ์ด์ผ์ค ๋ฐ ๋ฒ์ ์ค์
์ฝ๋๋ฅผ ์์ฑํ ์ค๋น๊ฐ ๋์๋ค๋ฉด ๊ฐ์ฅ ๋จผ์ ์์ฑํ ์ฝ๋๋ ๋ผ์ด์ผ์ค์ ์ฌ์ฉํ Solidity ๋ฒ์ ์ ๋ช ์ํ๋ ๊ฒ์ ๋๋ค. ๋ผ์ด์ผ์ค๋ SPDX ํ์ค์ ๋ฐ๋ฅด๋ฉฐ ํด๋น ์ฝ๋๋ ๋๊ตฌ๋ ์ฌ์ฉํ ์ ์๋๋ก Unlicensed๋ก ๋ช ์ํ์์ต๋๋ค.
pragma solidity
๋ solidity ๋ฒ์ ์ ์๋ฏธํฉ๋๋ค. ํน์ ๋ฒ์ ์ ์ง์ ํ ์ ์์ผ๋ฉฐ ์๋์ ๊ฐ์ด ์ฌ์ฉํ ์ ์๋ ๋ฒ์ ์ ๋ฒ์๋ฅผ ์ค์ ํ ์ ์์ต๋๋ค. ๋ฒ์ ์ ๋ฐ๋ผ ๋ฌธ๋ฒ์ด ๋ฌ๋ผ์ง ์ ์์ด ์ฌ์ฉํ๋ Solidity ๋ฌธ๋ฒ์ ๋ง๋ ๋ฒ์ ์ ์ค์ ํด์ผ ํฉ๋๋ค.
์ค๋งํธ ์ปจํธ๋ํธ ์ ์ธ
์ด์ ์ปจํธ๋ํธ์ ์ด๋ฆ์ ์ ์ธํ๊ณ ๊ธฐ๋ฅ์ ๊ตฌํํ ์ ์์ต๋๋ค. contract Name {}
๊ณผ ๊ฐ์ ๊ตฌ์กฐ๋ก ์ ์ธํ ์ ์์ผ๋ฉฐ ๋ณธ ํํ ๋ฆฌ์ผ์์๋ Message๋ผ๋ ์ด๋ฆ์ผ๋ก ๋ช
๋ช
ํ์์ต๋๋ค. ์ดํ ์ค๊ดํธ ์์ ํด๋น ์ปจํธ๋ํธ์ ๊ธฐ๋ฅ์ ๊ตฌํํ์ฌ์ผ ํฉ๋๋ค.
// SPDX-License-Identifier: Unlicensed
pragma solidity >=0.7.0 <0.9.0;
contract Message {
// write your contract functions
}
๋ณธ ํํ ๋ฆฌ์ผ์์ ๊ตฌํํ ๊ธฐ๋ฅ์ ๋ค์ ์๊ธฐํด ๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
-
์ด๊ธฐ ๋ฉ์์ง๋ฅผ ์ค์ ํฉ๋๋ค.
์ปจํธ๋ํธ ๋ฐฐํฌ ์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ ๋ ฅ๋ ๋ฉ์์ง๋ฅผ ์ ์ฉ
-
์ด๊ธฐ์ ์ค์ ํ ๋ฉ์์ง๋ฅผ ํ์ธํฉ๋๋ค.
๋ธ๋ก์ฒด์ธ๊ณผ ์ํธ์์ฉํ์ฌ ์ปจํธ๋ํธ์ ์ ๋ ฅ๋ ๋ฉ์์ง๋ฅผ ์กฐํ
-
์ฌ์ฉ์๊ฐ ์ ๋ ฅํ ๊ฐ์ผ๋ก ๋ฉ์์ง๋ฅผ ๋ณ๊ฒฝ ๋ฐ ํ์ธํฉ๋๋ค.
๋ธ๋ก์ฒด์ธ๊ณผ ์ํธ์์ฉํ์ฌ ์ปจํธ๋ํธ์ ๋ฉ์์ง๋ฅผ ์ ๋ ฅ
๋ธ๋ก์ฒด์ธ๊ณผ ์ํธ์์ฉํ์ฌ ์ปจํธ๋ํธ์ ์ ๋ ฅ๋ ๋ฉ์์ง๋ฅผ ์กฐํ
-
๋ฉ์์ง๋ฅผ ์ด๊ธฐํ ํฉ๋๋ค.
ํ์ฌ์ ๋ฉ์์ง๋ฅผ ์ด๊ธฐํํ์ฌ ๋น ๊ฐ์ผ๋ก ๋ณ๊ฒฝ
- ์ด๊ธฐ ๋ฉ์์ง ์ค์
์ ๋ด์ฉ์ ๋ฐ๋ฅด๋ฉด ๊ฐ์ฅ ๋จผ์ ํด์ผํ ๊ฒ์ ์ด๊ธฐ ๋ฉ์์ง ์ค์ ์ ๋๋ค. ์ด๊ธฐ ๋ฉ์์ง ์ค์ ์ ์ํด Constructor ํจ์๋ฅผ ์์ฑํฉ๋๋ค. Constructor ํจ์๋ ์ปจํธ๋ํธ ๋ฐฐํฌ ์์ ์๋ง ํ ๋ฒ ์คํ๋๋ ํจ์๋ก ์ปจํธ๋ํธ์ ์ด๊ธฐ๊ฐ์ ์ค์ ํ๋๋ฐ์ ์ฌ์ฉ๋ฉ๋๋ค.
// SPDX-License-Identifier: Unlicensed
pragma solidity >=0.7.0 <0.9.0;
contract Message {
string public currentMessage;
constructor() {
currentMessage = "Hello World! This is Nodit!";
}
}
string ํ์
์ currentMessage
๋ผ๋ ๋ณ์๋ฅผ ์ ์ธํ๊ณ constructor ํจ์๋ฅผ ์ด์ฉํด ๋ฐฐํฌ ์ ์ด๊ธฐ ๋ฉ์์ง๋ก โHello World! This is Nodit!โ์ด ์ค์ ๋๋๋ก ์์ฑํ์์ต๋๋ค.
- ์ด๊ธฐ์ ์ค์ ํ ๋ฉ์์ง๋ฅผ ํ์ธ
์ค์ ํ ๋ฉ์์ง๋ฅผ ํ์ธํ๊ธฐ ์ํด getMessage ํจ์๋ฅผ ๊ตฌํํฉ๋๋ค. ํ์ฌ ๋ฉ์์ง๊ฐ ์๋ค๋ฉด your current message is empty!
๋ผ๋ ๋ฉ์์ง๋ฅผ ๋ณด์ฌ์ฃผ๊ณ ํ์ฌ ๋ฉ์์ง๊ฐ ์๋ค๋ฉด currentMessage ๋ณ์ ๊ฐ์ ๋ฐํํฉ๋๋ค.
function getMessage() public view returns (string memory) {
return currentMessage;
}
์ ์ธ๋ ํจ์๋ฅผ ์ดํด๋ณด๋ฉด ๋ค์๊ณผ ๊ฐ์ ์๋ฏธ๋ฅผ ๊ฐ์ง๊ณ ์์ต๋๋ค.
public
: Solidity ์ธ์ด์ ํน์ง์ผ๋ก ํจ์์ ๊ฐ์์ฑ์ ๋ํ๋
๋๋ค. public์ ๋ค๋ฅธ ์ปจํธ๋ํธ ํน์ ๋ค๋ฅธ EOA๊ฐ ํธ์ถํ ์ ์๋ ํจ์์์ ์๋ฏธํ๋ฉฐ public ์ธ์๋ internal, external, private ๋ฑ์ด ์์ต๋๋ค. ๊ฐ์์ฑ์ ๋ํ ์์ธํ ์ค๋ช
์ ์ฌ๊ธฐ์ ํ์ธํ ์ ์์ต๋๋ค.
view
: ํจ์์ ํ์
์ค ํ๋๋ก ํด๋น ํจ์๊ฐ view function ์์ ์๋ฏธํฉ๋๋ค. view function์ด๋ ์ํ ๋ณ์์ ์ ๊ทผํ์ง๋ง ๊ฐ์ ๋ณ๊ฒฝํ์ง ์๋ ํจ์๋ก ์ํ ๋ณ๊ฒฝ์ด ์๊ธฐ ๋๋ฌธ์ ํด๋น ํจ์๋ฅผ ํธ์ถํ ๋ ๊ฐ์ค๋ฅผ ์๋ชจํ์ง ์์ต๋๋ค.
returns (string memory)
: ํด๋น ํจ์์ ๊ฒฐ๊ณผ๋ก ๋ฐํ๋๋ ๊ฐ์ ํ์
๊ณผ Data Location์ ์๋ฏธํฉ๋๋ค. Data Location์๋ memory, calldata, storage๊ฐ ์์ผ๋ฉฐ ์์ธํ ์ค๋ช
์ ์ฌ๊ธฐ์ ํ์ธํ ์ ์์ต๋๋ค.
TIP : Solidity์์๋ ๋ฌธ์์ด์ ์ฐ์ฐ์๋ก ์ง์ ๋น๊ตํ ์ ์๊ธฐ ๋๋ฌธ์ currentMessage์ ๋น ๋ฌธ์์ด์ ํ์ ์ ๋ณํํ ํ ๋น๊ตํด์ผ ํฉ๋๋ค. ์ ์ฝ๋์์๋ ๋ฌธ์์ด์ ๋ฐ์ดํธ์ฝ๋๋ก ๋ณํํ ํ ์ด๋ฅผ ํด์ํํ์ฌ ํด์๊ฐ์ ๋น๊ตํฉ๋๋ค.
- ์ฌ์ฉ์๊ฐ ์ ๋ ฅํ ๊ฐ์ผ๋ก ๋ฉ์์ง๋ฅผ ๋ณ๊ฒฝ
์ด์ ์ฌ์ฉ์๊ฐ ์ ๋ ฅํ ๊ฐ์ผ๋ก ๋ฉ์์ง๋ฅผ ๋ณ๊ฒฝํ ์ ์๋ setMessage ํจ์๋ฅผ ๊ตฌํํฉ๋๋ค.
function setMessage(string memory _newMessage) public returns (string memory) {
currentMessage = _newMessage;
return string(abi.encodePacked("your current message is :",currentMessage));
}
์ฌ์ฉ์๊ฐ ์ ๋ ฅํ ๋ฌธ์์ด์ currentMessage์ ํ ๋นํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ด๋ฅผ โyour current message is :โ๋ผ๋ ๋ฌธ์ฅ๊ณผ ํฉ์ณ ๋ฐํํฉ๋๋ค.
abi.encodePacked()
: ์ธ์๋ก ๋ฐ์ ๊ฐ์ ๋ฐ์ดํธ๋ก ๋ณํํ์ฌ ํฉ์นฉ๋๋ค. ํ์ฌ ์ฝ๋์์๋ โyour current message isโ์ currentMessage๋ฅผ ํฉ์ณ ํ๋์ ๋ฐ์ดํธ๋ก ํฉ์ณค์ต๋๋ค.string()
: ์ธ์๋ก ๋ฐ์ ๊ฐ์ string ํ์ ์ผ๋ก ๋ณํํฉ๋๋ค. ํ์ฌ ์ฝ๋์์๋ ํฉ์ณ์ง ๋ฐ์ดํธ๋ฅผ string ํ์ ์ผ๋ก ๋ณํํ๊ณ ์์ต๋๋ค.
setMessage ํจ์๋ฅผ ์์ ๊ฐ์ด ์ ์ํด ์ฌ์ฉ์๊ฐ ์ ๋ ฅํ ๊ฐ์ผ๋ก ๋ฉ์์ง๋ฅผ ๋ณ๊ฒฝํ๋ ๋์์ ์ํํ ์ ์์ต๋๋ค. ๋ค๋ง ๊ธฐ๋์น ๋ชปํ ๋์์ด ํ ๊ฐ์ง ๋ฐ์ํ ์ ์๋๋ฐ ์ด๋ค ๊ฒ์ผ์ง ์์์ด ๊ฐ์๋์?
๋ฐ๋ก ๊ฐ์์ฑ์ด public์ด๊ธฐ ๋๋ฌธ์ ๋๊ตฌ๋ setMessage๋ฅผ ํธ์ถํ์ฌ ๋ฉ์์ง๋ฅผ ๋ณ๊ฒฝํ ์ ์๋ค๋ ์ ์ ๋๋ค. ์ปจํธ๋ํธ๋ฅผ ๋ฐฐํฌํ ์ฌ์ฉ์๋ง ๋ฉ์์ง๋ฅผ ๋ณ๊ฒฝํ ์ ์๋๋ก ์ฝ๋๋ฅผ ์์ ํด ๋ณด๊ฒ ์ต๋๋ค.
// SPDX-License-Identifier: Unlicensed
pragma solidity >=0.7.0 <0.9.0;
contract Message {
string public currentMessage;
**address private owner = msg.sender;**
**modifier onlyOnwer() {
require(msg.sender == owner, "Caller is not owner");
_;
}**
constructor() {
currentMessage = "Hello World! This is Nodit!";
**owner = msg.sender;**
}
function getMessage() public view returns (string memory) {
if (keccak256(abi.encodePacked(currentMessage)) == keccak256(abi.encodePacked(""))) {
return "your current message is empty!";
} else {
return currentMessage;
}
}
function setMessage(string memory _newMessage) public **onlyOnwer** returns (string memory) {
currentMessage = _newMessage;
return string(abi.encodePacked("your current message is :",currentMessage));
}
}
modifier ํจ์๋ ์ ํด์ง ์กฐ๊ฑด์ด ์ผ์นํ๋ ๊ฒฝ์ฐ์๋ง ํจ์๋ฅผ ์คํํ๊ณ ์กฐ๊ฑด์ด ์ผ์นํ์ง ์๋ ๊ฒฝ์ฐ ์๋ฌ ๋ฉ์์ง๋ฅผ ๋ฐํํฉ๋๋ค. ํ์ฌ ์ฝ๋์์๋ owner๋ผ๋ ์ด๋ฆ์ ๋ณ์๊ฐ ํจ์๋ฅผ ํธ์ถํ๋ ์ฃผ์์ ๋ค๋ฅผ ๊ฒฝ์ฐ ์๋ฌ ๋ฉ์์ง๋ฅผ ๋ฐํํ๋๋ก ์์ฑ๋์ด ์์ต๋๋ค.
address private owner;
modifier onlyOnwer() {
require(msg.sender == owner, "Caller is not owner");
_;
}
๊ทธ๋ฆฌ๊ณ ์ปจํธ๋ํธ๋ฅผ ๋ฐฐํฌํ๋ ์ฃผ์๋ฅผ owner๋ก ์ค์ ํ๋๋ก constructor ํจ์๋ฅผ ์์ ํฉ๋๋ค.
constructor() {
owner = msg.sender;
currentMessage = "Hello World! This is Nodit!";
}
onlyOwner๋ผ๋ modifier ํจ์๋ก ์ ๊ทผ์ด ์ ์ด๋๊ณ ์๋ setMessage ํจ์๋ ์ปจํธ๋ํธ๋ฅผ ๋ฐฐํฌํ ์ฃผ์๊ฐ ํธ์ถํ์ง ์๋ ์ด์ ์คํํ ์ ์๋๋ก ์ ์ด๋ฉ๋๋ค.
function setMessage(string memory _newMessage) public **onlyOwner** returns (string memory) {
currentMessage = _newMessage;
return string(abi.encodePacked("your current message is :",currentMessage));
}
- ๋ฉ์์ง ์ด๊ธฐํ
์ฌ์ฉ์๊ฐ ์ ์ฅ๋ ๋ฉ์์ง๋ฅผ ์ง์ฐ๊ณ ๋น ๊ฐ์ผ๋ก ๋ณ๊ฒฝํ ์ ์๋ initMessage ํจ์๋ฅผ ๊ตฌํํฉ๋๋ค. modifier๋ฅผ ์ด์ฉํด ์ค๋งํธ ์ปจํธ๋ํธ๋ฅผ ๋ฐฐํฌํ ์ฃผ์๋ง ํด๋น ํจ์๋ฅผ ํธ์ถํ ์ ์๋๋ก ๊ตฌํํฉ๋๋ค.
function initMessage() public onlyOwner {
currentMessage = "";
}
์ด์ ๋ฉ์์ง ์ปจํธ๋ํธ์ ๋ชจ๋ ๊ธฐ๋ฅ์ ๊ตฌํํ์์ต๋๋ค. ์์ฑ๋ ์ปจํธ๋ํธ์ ์ฝ๋๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
// SPDX-License-Identifier: Unlicensed
pragma solidity >=0.7.0 <0.9.0;
contract Message {
string public currentMessage;
address private owner;
modifier onlyOwner() {
require(msg.sender == owner, "Caller is not owner");
_;
}
constructor() {
owner = msg.sender;
currentMessage = "Hello World! This is Nodit!";
}
function getMessage() public view returns (string memory) {
if (keccak256(abi.encodePacked(currentMessage)) == keccak256(abi.encodePacked(""))) {
return "your current message is empty!";
} else {
return currentMessage;
}
}
function setMessage(string memory _newMessage) public onlyOwner returns (string memory) {
currentMessage = _newMessage;
return string(abi.encodePacked("your current message is ",currentMessage));
}
function initMessage() public onlyOwner {
currentMessage = "";
}
}
์ด์ Remix IDE์ ๊ธฐ๋ฅ์ ์ด์ฉํ์ฌ ์ฝ๋๋ฅผ ์ปดํ์ผํ๊ณ ํ ์คํธ๋ฅผ ํด ๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค! ๐
์ค๋งํธ ์ปจํธ๋ํธ ์ปดํ์ผ ๋ฐ ํ
์คํธ
์ค๋งํธ ์ปจํธ๋ํธ ์ปดํ์ผ ๋ฐ ๋ก์ปฌ ํ๊ฒฝ ๋ฐฐํฌ
์ปจํธ๋ํธ ์์ฑ์ ์๋ฃํ ํ Remix IDE ์ข์ธก ๋ฉ๋ด ์ค 3๋ฒ์งธ ๋ฉ๋ด์ธ [Solidity compiler]๋ฅผ ํด๋ฆญํฉ๋๋ค. [Compile 4_Message.sol] ๋ฒํผ์ ํด๋ฆญํ์ฌ ์ปดํ์ผ์ ์งํํ ์ ์์ผ๋ฉฐ ์ ์์ ์ผ๋ก ์ปดํ์ผ์ ์๋ฃํ๋ฉด [Solidity compiler] ๋ฉ๋ด์ ์ด๋ก์ ๋ฐฐ๊ฒฝ์ ์ฒดํฌ ์์ด์ฝ์ด ๋ํ๋ฉ๋๋ค.
์ปดํ์ผ ์ compiler์ ๋ฒ์ ์ด Solidity ํ์ผ์ ๋ช ์ํ ๋ฒ์ ๊ณผ ์ผ์นํด์ผ ํ๋ฉฐ ์ผ์นํ์ง ์์ ๊ฒฝ์ฐ ์ปดํ์ผ์ด ์คํจํ ์ ์์ต๋๋ค.
์ปดํ์ผ์ ์๋ฃํ๋ค๋ฉด Remix IDE ์ข์ธก ๋ฉ๋ด ์ค 4๋ฒ์งธ ๋ฉ๋ด์ธ [Deploy & run transactions] ๋ฉ๋ด๋ฅผ ํด๋ฆญํ์ฌ ์ฒด์ธ์ ๋ฐฐํฌํ๊ธฐ ์ ์ ๊ฐ์์ ํ๊ฒฝ์์ ํ ์คํธ๋ฅผ ์งํํ ์ ์์ต๋๋ค.
Environment ํญ์์ ์คํํ VM์ ๋ฒ์ ์ ์ ํํ ์ ์์ผ๋ฉฐ ์ํํ ํ ์คํธ๋ฅผ ์ํด 100 ETH๋ฅผ ๊ฐ์ง ๊ณ์ ์ 15๊ฐ๋ฅผ ์ ๊ณต๋ฐ์ต๋๋ค. Contract ํญ์๋ ์ปดํ์ผ์ ์๋ฃํ ๋ฉ์์ง ์ปจํธ๋ํธ๊ฐ ์๋์ผ๋ก ์ ํ๋์ด ์์ผ๋ฉฐ ์๋ [Deploy] ๋ฒํผ์ ํด๋ฆญํ์ฌ ๋ฉ์์ง ์ปจํธ๋ํธ๋ฅผ ๋ฐฐํฌํ ์ ์์ต๋๋ค.
์ค๋งํธ ์ปจํธ๋ํธ ํ
์คํธ
์ฑ๊ณต์ ์ผ๋ก ๋ฐฐํฌ๊ฐ ์๋ฃ๋๋ฉด ๋ฉ๋ด ํ๋จ์ [Deployed/Unpinned Contracts] ํญ์์ ๋ฐฐํฌ๋ ์ปจํธ๋ํธ๋ฅผ ํ์ธํ ์ ์๊ณ ์ปจํธ๋ํธ์ ์์ฑ๋ ํจ์๋ฅผ ์คํํ ์ ์์ต๋๋ค. ๊ตฌํํ๋ ค ํ๋ ๋ก์ง์ด ์ ์์ ์ผ๋ก ๋์์ ํ๋์ง ํ์ธํด ๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค. ์ด๊ธฐ ๊ธฐํํ ๋ก์ง์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- ์ด๊ธฐ ๋ฉ์์ง๋ฅผ ์ค์ ํฉ๋๋ค.
- ์ด๊ธฐ์ ์ค์ ํ ๋ฉ์์ง๋ฅผ ํ์ธํฉ๋๋ค.
- ์ฌ์ฉ์๊ฐ ์ ๋ ฅํ ๊ฐ์ผ๋ก ๋ฉ์์ง๋ฅผ ๋ณ๊ฒฝํฉ๋๋ค.
- ๋ฉ์์ง๋ฅผ ์ด๊ธฐํ ํฉ๋๋ค.
- ์ด๊ธฐ ๋ฉ์์ง ์ค์ ๋ฐ ๋ฉ์์ง ํ์ธ
์ด๊ธฐ ๋ฉ์์ง ์ค์ ์ ๊ฒฝ์ฐ constructor ํจ์๋ฅผ ์ด์ฉํด ์ปจํธ๋ํธ๊ฐ ๋ฐฐํฌ๋ ๋ ์ค์ ์ด ๋์์ ๊ฒ์ ๋๋ค. ์ด๋ฅผ ํ์ธํ๊ธฐ ์ํด [getMessage] ๋ฒํผ์ ํด๋ฆญํด ํ์ฌ currentMessage๊ฐ ๋ฌด์์ธ์ง ํ์ธํด ๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
getMessage ํจ์์ ์คํ ๊ฒฐ๊ณผ๋ก constructor ํจ์์ ์ ๋ ฅํ๋ โHello World! This is Nodit!โ ๋ผ๋ string ๊ฐ์ด ๋ฐํ๋๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค. ์ปจํธ๋ํธ๊ฐ ๋ฐฐํฌ๋ ๋ constructor ํจ์๊ฐ ์ ์์ ์ผ๋ก ๋์ํ์๊ตฐ์!
- ์ฌ์ฉ์๊ฐ ์ ๋ ฅํ ๊ฐ์ผ๋ก ๋ฉ์์ง ๋ณ๊ฒฝ ๋ฐ ๋ฉ์์ง ํ์ธ
์ด์ ์ฌ์ฉ์๊ฐ ์ ๋ ฅํ ๊ฐ์ผ๋ก ๋ฉ์์ง๋ฅผ ๋ณ๊ฒฝํด ๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค. [setMessage] ๋ฒํผ ์ Input์ ์ํ๋ ๋ด์ฉ์ ์ ๋ ฅํ๊ณ [setMessage] ๋ฒํผ์ ํด๋ฆญํฉ๋๋ค.
Remix IDE์ ํฐ๋ฏธ๋์์ ์๋ ์ฌ์ง๊ณผ ๊ฐ์ด ํธ๋์ญ์ ์ด ์คํ๋ ๋ด์ญ์ ํ์ธํ ์ ์์ผ๋ฉฐ ํด๋ฆญํด ํธ๋์ญ์ ์ ์ ๋ณด๋ฅผ ํ์ธํ ์ ์์ต๋๋ค.
decoded ์์ญ์์ ์ ๋ ฅํ ๋ด์ฉ๊ณผ setMessage ํจ์์์ ์ถ๋ ฅํ๋๋ก ๊ตฌ์ฑํ ๋ด์ฉ์ด ์ ์์ ์ผ๋ก ๋ฐํ๋๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค.
๋ค์ [getMessage] ๋ฒํผ์ ํด๋ฆญํด ๋ณผ๊น์? setMessage ํจ์๋ฅผ ์ด์ฉํด ์ ๋ ฅํ ๋ด์ฉ์ด ์ถ๋ ฅ๋๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค.
- ๋ฉ์์ง ์ด๊ธฐํ ๋ฐ ๋ฉ์์ง ํ์ธ
๋ก์ง์ ๋ง์ง๋ง ๋จ๊ณ์ธ ๋ฉ์์ง ์ด๊ธฐํ ๊ธฐ๋ฅ์ ํ์ธํด ๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค. [initMessage] ๋ฒํผ์ ํด๋ฆญํ์ฌ ํด๋น ํจ์๋ฅผ ํธ์ถํด ๋ฉ์์ง๋ฅผ ์ด๊ธฐํ ํ ์ ์์ต๋๋ค.
setMessage ํจ์๋ฅผ ์คํํ ๋์ ๊ฐ์ด ํฐ๋ฏธ๋์์ ํจ์๊ฐ ์ ์์ ์ผ๋ก ์คํ๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค.
๋ค์ [getMessage] ๋ฒํผ์ ํด๋ฆญํ์ฌ ํ์ฌ ๋ฉ์์ง์ ๋ด์ฉ์ ํ์ธํด ๋ณผ๊น์? ์ปจํธ๋ํธ์ ์์ฑํ๋ ์ฝ๋์ ๊ฐ์ด ๋น string ๊ฐ์ด ๋ฐํ๋๋ ๊ฒ์ ํ์ธํ ์ ์์ผ๋ฉฐ ๋ชจ๋ ํจ์๊ฐ ์๋ํ๋๋ก ๋์ํ๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค!
์ค๋งํธ ์ปจํธ๋ํธ ๋๋ฒ๊น
Remix IDE ์ข์ธก ๋ฉ๋ด ์ค 5๋ฒ์งธ ๋ฉ๋ด์ธ [Debugger]๋ฅผ ํด๋ฆญํ์ฌ Remix IDE์์ ์ ๊ณตํ๋ ๋๋ฒ๊น ๊ธฐ๋ฅ์ ์ด์ฉํ ์ ์์ต๋๋ค.
Remix IDE์ ๋๋ฒ๊น ๊ธฐ๋ฅ์ ์ฌ์ฉํ๋ฉด, ์ฌ์ฉ์๋ ์คํ ์ค์ธ ํจ์, ์ ๋ ฅ๋ ์ธ์, ํ์ฌ ์คํ๋๊ณ ์๋ EVM์ opcode, ๊ทธ๋ฆฌ๊ณ ์ค๋งํธ ๊ณ์ฝ์ ์ํ ๋ฑ์ ํ์ธํ ์ ์์ต๋๋ค. ์ด๋ฅผ ํตํด ๋ฎ์ ๋ ๋ฒจ์์ ๋๋ฒ๊น ์ ์ํํ๊ณ ์ค๋ฅ๋ฅผ ์๋ณํ๊ฑฐ๋ ์ฝ๋ ์ต์ ํ๋ฅผ ์งํํ ์ ์์ต๋๋ค. ์์ฑํ ์ฝ๋๋ก ์๋ฅผ ๋ค์ด ๋ณด๊ฒ ์ต๋๋ค.
ํธ๋์ญ์ ์คํ์ ์คํจํ ์ผ์ด์ค๋ฅผ ์ถ๊ฐํ๊ธฐ ์ํด ๋ฉ์์ง์ ๊ธธ์ด๊ฐ 5๊ธ์ ๋ณด๋ค ์งง๋ค๋ฉด ์๋ฌ๊ฐ ๋ฐ์ํ์ฌ ํธ๋์ญ์ ์ด ์คํจํ๋๋ก setMessage ํจ์๋ฅผ ์์ ํ์์ต๋๋ค.
function setMessage(string memory _newMessage) public onlyOwner returns (string memory) {
require(bytes(_newMessage).length > 5, "Message is too short!");
currentMessage = _newMessage;
return string(abi.encodePacked("your current message is : ", currentMessage));
}
์ดํ ํด๋น ์ปจํธ๋ํธ๋ฅผ ๋ฐฐํฌํ๊ณ setMessage์ ์ธ์๋ฅผ 5๊ธ์ ๋ณด๋ค ์งง๊ฒ ์์ฑํ ํ ํจ์๋ฅผ ํธ์ถํฉ๋๋ค. ์๋ ์ฌ์ง๊ณผ ๊ฐ์ด ํธ๋์ญ์ ์ด revert๊ฐ ๋ฐ์ํ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค.
ํด๋น ํธ๋์ญ์ ์ ์ด์ฉํด ๋๋ฒ๊น ํด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค. ์๋ ์ฌ์ง๊ณผ ๊ฐ์ด opcode์ ์งํ์ ๋ฐ๋ผ ์๋ชจ๋๋ gas์ ์์ ํ์ธํ ์ ์์ผ๋ฉฐ ์ด๋ค call์์ ํธ๋์ญ์ ์ด revert ๋์๋์ง ํ์ธํ ์ ์์ต๋๋ค.
Remix IDE์ ๋๋ฒ๊น ๊ธฐ๋ฅ์ ํ์ฉํ์ฌ ์ค๋ฅ๋ฅผ ์ฐพ์๋ด๊ณ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํจ์ผ๋ก์จ ๋์ฑ ์์ ์ ์ด๊ณ ์์ฑ๋ ๋์ ์ค๋งํธ ์ปจํธ๋ํธ ์ฝ๋๋ฅผ ์์ฑํ ์ ์์ต๋๋ค!
์ด๋ฒ ํํ ๋ฆฌ์ผ์์๋ Web3 ๊ฐ๋ฐ ํ๊ฒฝ์ ์ค์ ํ๋ ๋ฐฉ๋ฒ๊ณผ ๊ฐ๋จํ ์ปจํธ๋ํธ ์์ฑ ๋ฐ ํ ์คํธ, ๊ทธ๋ฆฌ๊ณ ๋๋ฒ๊น ์ ํ๋ ๋ฐฉ๋ฒ์ ์์๋ณด์์ต๋๋ค. ๋ค์ ํํ ๋ฆฌ์ผ์์๋ ํ ์คํธ ์๋ฃํ ์ปจํธ๋ํธ๋ฅผ ์ค์ ์ด๋๋ฆฌ์ ์ฒด์ธ์ ๋ฐฐํฌํ๋ ๋ฐฉ๋ฒ๊ณผ ํธ๋์ญ์ ์ ์คํํ๋ ๋ฐฉ๋ฒ์ ์์๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค!
Updated about 1 month ago