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์— ๋กœ๋“œ๋˜์–ด ํด๋ผ์ด์–ธํŠธ์˜ ํŠธ๋žœ์žญ์…˜ ํŽ˜์ด๋กœ๋“œ์— ๋”ฐ๋ผ ๋กœ์ง์„ ์‹คํ–‰ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2024-09-10 แ„‹แ…ฉแ„’แ…ฎ 6.19.29.png

๊ตฌํ˜„ํ•  ์Šค๋งˆํŠธ ์ปจํŠธ๋ž™ํŠธ์˜ ๋กœ์ง๊ณผ ๊ธฐ๋Šฅ

์Šค๋งˆํŠธ ์ปจํŠธ๋ž™ํŠธ๊ฐ€ ์–ด๋–ป๊ฒŒ ๋ฐฐํฌ๋˜๋Š”์ง€ ์•Œ์•„๋ณด์•˜์œผ๋‹ˆ ๊ฐ„๋‹จํ•œ ๋ฉ”์‹œ์ง€ ์Šค๋งˆํŠธ ์ปจํŠธ๋ž™ํŠธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ณ  ์ด๋”๋ฆฌ์›€์— ๋ฐฐํฌํ•˜๊ณ  ํ˜ธ์ถœํ•ด ๋ณผ๊นŒ์š”?

  • ๋ฉ”์‹œ์ง€ ์Šค๋งˆํŠธ ์ปจํŠธ๋ž™ํŠธ์˜ ๋กœ์ง
    1. ์ดˆ๊ธฐ ๋ฉ”์‹œ์ง€๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
    2. ์ดˆ๊ธฐ์— ์„ค์ •ํ•œ ๋ฉ”์‹œ์ง€๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
    3. ์‚ฌ์šฉ์ž๊ฐ€ ์ž…๋ ฅํ•œ ๊ฐ’์œผ๋กœ ๋ฉ”์‹œ์ง€๋ฅผ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค.
    4. ๋ณ€๊ฒฝ๋œ ๋ฉ”์‹œ์ง€๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

์œ„ ๋‚ด์šฉ์„ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด ๊ฐ ๋กœ์ง๋งˆ๋‹ค ํ•„์š”ํ•œ ๊ธฐ๋Šฅ์„ ์ •์˜ํ•ด ๋ณด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  1. ์ดˆ๊ธฐ ๋ฉ”์‹œ์ง€๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
    • ์ปจํŠธ๋ž™ํŠธ ๋ฐฐํฌ ์‹œ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ž…๋ ฅ๋  ๋ฉ”์‹œ์ง€๋ฅผ ์ ์šฉ
  2. ์ดˆ๊ธฐ์— ์„ค์ •ํ•œ ๋ฉ”์‹œ์ง€๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
    • ๋ธ”๋ก์ฒด์ธ๊ณผ ์ƒํ˜ธ์ž‘์šฉํ•˜์—ฌ ์ปจํŠธ๋ž™ํŠธ์— ์ž…๋ ฅ๋œ ๋ฉ”์‹œ์ง€๋ฅผ ์กฐํšŒ
  3. ์‚ฌ์šฉ์ž๊ฐ€ ์ž…๋ ฅํ•œ ๊ฐ’์œผ๋กœ ๋ฉ”์‹œ์ง€๋ฅผ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค.
    • ๋ธ”๋ก์ฒด์ธ๊ณผ ์ƒํ˜ธ์ž‘์šฉํ•˜์—ฌ ์ปจํŠธ๋ž™ํŠธ์— ๋ฉ”์‹œ์ง€๋ฅผ ์ž…๋ ฅ
    • ๋ธ”๋ก์ฒด์ธ๊ณผ ์ƒํ˜ธ์ž‘์šฉํ•˜์—ฌ ์ปจํŠธ๋ž™ํŠธ์— ์ž…๋ ฅ๋œ ๋ฉ”์‹œ์ง€๋ฅผ ์กฐํšŒ
  4. ๋ฉ”์‹œ์ง€๋ฅผ ์ดˆ๊ธฐํ™” ํ•ฉ๋‹ˆ๋‹ค.
    • ํ˜„์žฌ์˜ ๋ฉ”์‹œ์ง€๋ฅผ ์ดˆ๊ธฐํ™”ํ•˜์—ฌ ๋นˆ ๊ฐ’์œผ๋กœ ๋ณ€๊ฒฝ

์ด์ƒ์œผ๋กœ ์Šค๋งˆํŠธ ์ปจํŠธ๋ž™ํŠธ์˜ ๊ธฐ๋Šฅ๊ณผ ๋กœ์ง ๋ชจ๋‘ ์ค€๋น„๊ฐ€ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค! ์ด์ œ ์Šค๋งˆํŠธ ์ปจํŠธ๋ž™ํŠธ๋ฅผ ํ•จ๊ป˜ ์ž‘์„ฑํ•ด ๋ด…์‹œ๋‹ค!

์Šค๋งˆํŠธ ์ปจํŠธ๋ž™ํŠธ ์ž‘์„ฑ

ํŽธ๋ฆฌํ•˜๊ฒŒ ์Šค๋งˆํŠธ ์ปจํŠธ๋ž™ํŠธ๋ฅผ ์ž‘์„ฑํ•˜๊ณ  ํ…Œ์ŠคํŠธํ•ด ๋ณด๊ธฐ ์œ„ํ•ด Remix IDE๋ฅผ ์ด์šฉํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ์•„๋ž˜ ๋งํฌ๋ฅผ ํด๋ฆญํ•˜์—ฌ Remix IDE๋ฅผ ์ด์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Remix IDE์— ์ ‘๊ทผํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํ™”๋ฉด์ด ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค. ์šฐ์ธก์˜ ํƒญ ์ค‘ contracts ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ํด๋ฆญํ•˜๋ฉด Remix IDE์—์„œ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ œ๊ณตํ•ด์ฃผ๋Š” ์ปจํŠธ๋ž™ํŠธ ์˜ˆ์ œ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2024-09-06 แ„‹แ…ฉแ„’แ…ฎ 5.54.21.png

์ƒˆ๋กœ์šด 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
}

๋ณธ ํŠœํ† ๋ฆฌ์–ผ์—์„œ ๊ตฌํ˜„ํ•  ๊ธฐ๋Šฅ์„ ๋‹ค์‹œ ์ƒ๊ธฐํ•ด ๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

  1. ์ดˆ๊ธฐ ๋ฉ”์‹œ์ง€๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

    • ์ปจํŠธ๋ž™ํŠธ ๋ฐฐํฌ ์‹œ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ž…๋ ฅ๋  ๋ฉ”์‹œ์ง€๋ฅผ ์ ์šฉ
  2. ์ดˆ๊ธฐ์— ์„ค์ •ํ•œ ๋ฉ”์‹œ์ง€๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

    • ๋ธ”๋ก์ฒด์ธ๊ณผ ์ƒํ˜ธ์ž‘์šฉํ•˜์—ฌ ์ปจํŠธ๋ž™ํŠธ์— ์ž…๋ ฅ๋œ ๋ฉ”์‹œ์ง€๋ฅผ ์กฐํšŒ
  3. ์‚ฌ์šฉ์ž๊ฐ€ ์ž…๋ ฅํ•œ ๊ฐ’์œผ๋กœ ๋ฉ”์‹œ์ง€๋ฅผ ๋ณ€๊ฒฝ ๋ฐ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

    • ๋ธ”๋ก์ฒด์ธ๊ณผ ์ƒํ˜ธ์ž‘์šฉํ•˜์—ฌ ์ปจํŠธ๋ž™ํŠธ์— ๋ฉ”์‹œ์ง€๋ฅผ ์ž…๋ ฅ
    • ๋ธ”๋ก์ฒด์ธ๊ณผ ์ƒํ˜ธ์ž‘์šฉํ•˜์—ฌ ์ปจํŠธ๋ž™ํŠธ์— ์ž…๋ ฅ๋œ ๋ฉ”์‹œ์ง€๋ฅผ ์กฐํšŒ
  4. ๋ฉ”์‹œ์ง€๋ฅผ ์ดˆ๊ธฐํ™” ํ•ฉ๋‹ˆ๋‹ค.

    • ํ˜„์žฌ์˜ ๋ฉ”์‹œ์ง€๋ฅผ ์ดˆ๊ธฐํ™”ํ•˜์—ฌ ๋นˆ ๊ฐ’์œผ๋กœ ๋ณ€๊ฒฝ


  1. ์ดˆ๊ธฐ ๋ฉ”์‹œ์ง€ ์„ค์ •

์œ„ ๋‚ด์šฉ์— ๋”ฐ๋ฅด๋ฉด ๊ฐ€์žฅ ๋จผ์ € ํ•ด์•ผํ•  ๊ฒƒ์€ ์ดˆ๊ธฐ ๋ฉ”์‹œ์ง€ ์„ค์ •์ž…๋‹ˆ๋‹ค. ์ดˆ๊ธฐ ๋ฉ”์‹œ์ง€ ์„ค์ •์„ ์œ„ํ•ด 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!โ€์ด ์„ค์ •๋˜๋„๋ก ์ž‘์„ฑํ•˜์˜€์Šต๋‹ˆ๋‹ค.


  1. ์ดˆ๊ธฐ์— ์„ค์ •ํ•œ ๋ฉ”์‹œ์ง€๋ฅผ ํ™•์ธ

์„ค์ •ํ•œ ๋ฉ”์‹œ์ง€๋ฅผ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด 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์™€ ๋นˆ ๋ฌธ์ž์—ด์˜ ํƒ€์ž…์„ ๋ณ€ํ™˜ํ•œ ํ›„ ๋น„๊ตํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์œ„ ์ฝ”๋“œ์—์„œ๋Š” ๋ฌธ์ž์—ด์„ ๋ฐ”์ดํŠธ์ฝ”๋“œ๋กœ ๋ณ€ํ™˜ํ•œ ํ›„ ์ด๋ฅผ ํ•ด์‹œํ™”ํ•˜์—ฌ ํ•ด์‹œ๊ฐ’์„ ๋น„๊ตํ•ฉ๋‹ˆ๋‹ค.


  1. ์‚ฌ์šฉ์ž๊ฐ€ ์ž…๋ ฅํ•œ ๊ฐ’์œผ๋กœ ๋ฉ”์‹œ์ง€๋ฅผ ๋ณ€๊ฒฝ

์ด์ œ ์‚ฌ์šฉ์ž๊ฐ€ ์ž…๋ ฅํ•œ ๊ฐ’์œผ๋กœ ๋ฉ”์‹œ์ง€๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋Š” 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));
}

  1. ๋ฉ”์‹œ์ง€ ์ดˆ๊ธฐํ™”

์‚ฌ์šฉ์ž๊ฐ€ ์ €์žฅ๋œ ๋ฉ”์‹œ์ง€๋ฅผ ์ง€์šฐ๊ณ  ๋นˆ ๊ฐ’์œผ๋กœ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋Š” 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 ํŒŒ์ผ์— ๋ช…์‹œํ•œ ๋ฒ„์ „๊ณผ ์ผ์น˜ํ•ด์•ผ ํ•˜๋ฉฐ ์ผ์น˜ํ•˜์ง€ ์•Š์„ ๊ฒฝ์šฐ ์ปดํŒŒ์ผ์ด ์‹คํŒจํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2024-09-09 แ„‹แ…ฉแ„’แ…ฎ 4.56.40.png

์ปดํŒŒ์ผ์„ ์™„๋ฃŒํ–ˆ๋‹ค๋ฉด Remix IDE ์ขŒ์ธก ๋ฉ”๋‰ด ์ค‘ 4๋ฒˆ์งธ ๋ฉ”๋‰ด์ธ [Deploy & run transactions] ๋ฉ”๋‰ด๋ฅผ ํด๋ฆญํ•˜์—ฌ ์ฒด์ธ์— ๋ฐฐํฌํ•˜๊ธฐ ์ „์— ๊ฐ€์ƒ์˜ ํ™˜๊ฒฝ์—์„œ ํ…Œ์ŠคํŠธ๋ฅผ ์ง„ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2024-09-09 แ„‹แ…ฉแ„’แ…ฎ 5.14.17.png

Environment ํƒญ์—์„œ ์‹คํ–‰ํ•  VM์˜ ๋ฒ„์ „์„ ์„ ํƒํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์›ํ™œํ•œ ํ…Œ์ŠคํŠธ๋ฅผ ์œ„ํ•ด 100 ETH๋ฅผ ๊ฐ€์ง„ ๊ณ„์ •์„ 15๊ฐœ๋ฅผ ์ œ๊ณต๋ฐ›์Šต๋‹ˆ๋‹ค. Contract ํƒญ์—๋Š” ์ปดํŒŒ์ผ์„ ์™„๋ฃŒํ•œ ๋ฉ”์‹œ์ง€ ์ปจํŠธ๋ž™ํŠธ๊ฐ€ ์ž๋™์œผ๋กœ ์„ ํƒ๋˜์–ด ์žˆ์œผ๋ฉฐ ์•„๋ž˜ [Deploy] ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜์—ฌ ๋ฉ”์‹œ์ง€ ์ปจํŠธ๋ž™ํŠธ๋ฅผ ๋ฐฐํฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


์Šค๋งˆํŠธ ์ปจํŠธ๋ž™ํŠธ ํ…Œ์ŠคํŠธ

์„ฑ๊ณต์ ์œผ๋กœ ๋ฐฐํฌ๊ฐ€ ์™„๋ฃŒ๋˜๋ฉด ๋ฉ”๋‰ด ํ•˜๋‹จ์˜ [Deployed/Unpinned Contracts] ํƒญ์—์„œ ๋ฐฐํฌ๋œ ์ปจํŠธ๋ž™ํŠธ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ๊ณ  ์ปจํŠธ๋ž™ํŠธ์— ์ž‘์„ฑ๋œ ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ตฌํ˜„ํ•˜๋ ค ํ–ˆ๋˜ ๋กœ์ง์ด ์ •์ƒ์ ์œผ๋กœ ๋™์ž‘์„ ํ•˜๋Š”์ง€ ํ™•์ธํ•ด ๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ์ดˆ๊ธฐ ๊ธฐํšํ•œ ๋กœ์ง์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  1. ์ดˆ๊ธฐ ๋ฉ”์‹œ์ง€๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
  2. ์ดˆ๊ธฐ์— ์„ค์ •ํ•œ ๋ฉ”์‹œ์ง€๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
  3. ์‚ฌ์šฉ์ž๊ฐ€ ์ž…๋ ฅํ•œ ๊ฐ’์œผ๋กœ ๋ฉ”์‹œ์ง€๋ฅผ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค.
  4. ๋ฉ”์‹œ์ง€๋ฅผ ์ดˆ๊ธฐํ™” ํ•ฉ๋‹ˆ๋‹ค.

  • ์ดˆ๊ธฐ ๋ฉ”์‹œ์ง€ ์„ค์ • ๋ฐ ๋ฉ”์‹œ์ง€ ํ™•์ธ

์ดˆ๊ธฐ ๋ฉ”์‹œ์ง€ ์„ค์ •์˜ ๊ฒฝ์šฐ constructor ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•ด ์ปจํŠธ๋ž™ํŠธ๊ฐ€ ๋ฐฐํฌ๋  ๋•Œ ์„ค์ •์ด ๋˜์—ˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋ฅผ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด [getMessage] ๋ฒ„ํŠผ์„ ํด๋ฆญํ•ด ํ˜„์žฌ currentMessage๊ฐ€ ๋ฌด์—‡์ธ์ง€ ํ™•์ธํ•ด ๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2024-09-09 แ„‹แ…ฉแ„’แ…ฎ 5.27.33.png

getMessage ํ•จ์ˆ˜์˜ ์‹คํ–‰ ๊ฒฐ๊ณผ๋กœ constructor ํ•จ์ˆ˜์— ์ž…๋ ฅํ–ˆ๋˜ โ€œHello World! This is Nodit!โ€ ๋ผ๋Š” string ๊ฐ’์ด ๋ฐ˜ํ™˜๋˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ปจํŠธ๋ž™ํŠธ๊ฐ€ ๋ฐฐํฌ๋  ๋•Œ constructor ํ•จ์ˆ˜๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ๋™์ž‘ํ•˜์˜€๊ตฐ์š”!

แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2024-09-09 แ„‹แ…ฉแ„’แ…ฎ 5.33.35.png
  • ์‚ฌ์šฉ์ž๊ฐ€ ์ž…๋ ฅํ•œ ๊ฐ’์œผ๋กœ ๋ฉ”์‹œ์ง€ ๋ณ€๊ฒฝ ๋ฐ ๋ฉ”์‹œ์ง€ ํ™•์ธ

์ด์ œ ์‚ฌ์šฉ์ž๊ฐ€ ์ž…๋ ฅํ•œ ๊ฐ’์œผ๋กœ ๋ฉ”์‹œ์ง€๋ฅผ ๋ณ€๊ฒฝํ•ด ๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. [setMessage] ๋ฒ„ํŠผ ์˜† Input์— ์›ํ•˜๋Š” ๋‚ด์šฉ์„ ์ž…๋ ฅํ•˜๊ณ  [setMessage] ๋ฒ„ํŠผ์„ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.

แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2024-09-09 แ„‹แ…ฉแ„’แ…ฎ 6.59.52.png

Remix IDE์˜ ํ„ฐ๋ฏธ๋„์—์„œ ์•„๋ž˜ ์‚ฌ์ง„๊ณผ ๊ฐ™์ด ํŠธ๋žœ์žญ์…˜์ด ์‹คํ–‰๋œ ๋‚ด์—ญ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ํด๋ฆญํ•ด ํŠธ๋žœ์žญ์…˜์˜ ์ •๋ณด๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2024-09-09 แ„‹แ…ฉแ„’แ…ฎ 7.00.31.png

decoded ์˜์—ญ์—์„œ ์ž…๋ ฅํ•œ ๋‚ด์šฉ๊ณผ setMessage ํ•จ์ˆ˜์—์„œ ์ถœ๋ ฅํ•˜๋„๋ก ๊ตฌ์„ฑํ•œ ๋‚ด์šฉ์ด ์ •์ƒ์ ์œผ๋กœ ๋ฐ˜ํ™˜๋˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2024-09-09 แ„‹แ…ฉแ„’แ…ฎ 7.00.43.png

๋‹ค์‹œ [getMessage] ๋ฒ„ํŠผ์„ ํด๋ฆญํ•ด ๋ณผ๊นŒ์š”? setMessage ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•ด ์ž…๋ ฅํ•œ ๋‚ด์šฉ์ด ์ถœ๋ ฅ๋˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2024-09-09 แ„‹แ…ฉแ„’แ…ฎ 7.01.56.png
  • ๋ฉ”์‹œ์ง€ ์ดˆ๊ธฐํ™” ๋ฐ ๋ฉ”์‹œ์ง€ ํ™•์ธ

๋กœ์ง์˜ ๋งˆ์ง€๋ง‰ ๋‹จ๊ณ„์ธ ๋ฉ”์‹œ์ง€ ์ดˆ๊ธฐํ™” ๊ธฐ๋Šฅ์„ ํ™•์ธํ•ด ๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. [initMessage] ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜์—ฌ ํ•ด๋‹น ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•ด ๋ฉ”์‹œ์ง€๋ฅผ ์ดˆ๊ธฐํ™” ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2024-09-09 แ„‹แ…ฉแ„’แ…ฎ 7.05.44.png

setMessage ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•  ๋•Œ์™€ ๊ฐ™์ด ํ„ฐ๋ฏธ๋„์—์„œ ํ•จ์ˆ˜๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ์‹คํ–‰๋œ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2024-09-09 แ„‹แ…ฉแ„’แ…ฎ 7.06.11.png

๋‹ค์‹œ [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๊ฐ€ ๋ฐœ์ƒํ•œ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2024-09-10 แ„‹แ…ฉแ„Œแ…ฅแ†ซ 11.19.42.png

ํ•ด๋‹น ํŠธ๋žœ์žญ์…˜์„ ์ด์šฉํ•ด ๋””๋ฒ„๊น… ํ•ด๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ์•„๋ž˜ ์‚ฌ์ง„๊ณผ ๊ฐ™์ด opcode์˜ ์ง„ํ–‰์— ๋”ฐ๋ผ ์†Œ๋ชจ๋˜๋Š” gas์˜ ์–‘์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์–ด๋–ค call์—์„œ ํŠธ๋žœ์žญ์…˜์ด revert ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2024-09-10 แ„‹แ…ฉแ„Œแ…ฅแ†ซ 11.23.23.png แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2024-09-10 แ„‹แ…ฉแ„Œแ…ฅแ†ซ 11.24.36.png

Remix IDE์˜ ๋””๋ฒ„๊น… ๊ธฐ๋Šฅ์„ ํ™œ์šฉํ•˜์—ฌ ์˜ค๋ฅ˜๋ฅผ ์ฐพ์•„๋‚ด๊ณ  ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•จ์œผ๋กœ์จ ๋”์šฑ ์•ˆ์ •์ ์ด๊ณ  ์™„์„ฑ๋„ ๋†’์€ ์Šค๋งˆํŠธ ์ปจํŠธ๋ž™ํŠธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค!

์ด๋ฒˆ ํŠœํ† ๋ฆฌ์–ผ์—์„œ๋Š” Web3 ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์„ ์„ค์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•๊ณผ ๊ฐ„๋‹จํ•œ ์ปจํŠธ๋ž™ํŠธ ์ž‘์„ฑ ๋ฐ ํ…Œ์ŠคํŠธ, ๊ทธ๋ฆฌ๊ณ  ๋””๋ฒ„๊น…์„ ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ์•„๋ณด์•˜์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ ํŠœํ† ๋ฆฌ์–ผ์—์„œ๋Š” ํ…Œ์ŠคํŠธ ์™„๋ฃŒํ•œ ์ปจํŠธ๋ž™ํŠธ๋ฅผ ์‹ค์ œ ์ด๋”๋ฆฌ์›€ ์ฒด์ธ์— ๋ฐฐํฌํ•˜๋Š” ๋ฐฉ๋ฒ•๊ณผ ํŠธ๋žœ์žญ์…˜์„ ์‹คํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ์•„๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค!