
์ด ๊ธ์ ๋ค ์ฝ์ผ์๋ฉด, Remix-Solidity IDE๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ๋จํ ์ด๋๋ฆฌ์ ์ค๋งํธ ๊ณ์ฝ์ ์์ฑํ๋ ๋ฐฉ๋ฒ์ ์๊ฒ ๋ ๊ฒ์ ๋๋ค.
์ด๋๋ฆฌ์์ด๋ ๋ฌด์์ธ๊ฐ?
2009๋ , ๋๊ตฐ๊ฐ ์ฌํ ์ ๋์นด๋ชจํ ๋ผ๋ ์๋ช ์ผ๋ก ๋นํธ์ฝ์ธ์ ๊ฐ๋ ์ ๋์ ํ์ต๋๋ค. ๋นํธ์ฝ์ธ์ ํ์ฌ๊น์ง ๊ฐ์ฅ ์ฑ๊ณต์ ์ธ ๋์งํธ ํตํ์ ๋๋ค. ๋นํธ์ฝ์ธ์ ๋ธ๋ก์ฒด์ธ์ ๋ชจ๋ ๊ฑฐ๋๊ฐ ๋ณด๊ด๋๋ ์๋ฒฝํ๊ฒ ํ์ค์ํ๋ ํํ ์์คํ ์ ๊ฐ๋ ์ ๋์คํ์์ผฐ์ต๋๋ค. ์ด๋๋ฆฌ์์ ํ์ค์์ ๊ฑฐ๋์ ํ๊ณผ ํ๋ง ์์ (turing-complete) ํ๋ก๊ทธ๋๋ฐ ์ธ์ด(๋ณธ์ง์ ์ผ๋ก ๋ชจ๋ ํฉ๋ฆฌ์ ๊ณ์ฐ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ ์ ์์์ ์๋ฏธ)๋ฅผ ๊ฒฐํฉํ์ฌ ๋ ๋ง์ ๊ฒ์ ์๋ํ๊ณ ์ ํฉ๋๋ค.
์ฒ์์ผ๋ก ์ค๋งํธ ๊ณ์ฝ์ ์ง์ ์์ฑํด๋ณด๊ณ ์ถ๋ค๋ฉด, ํ์ฌ ๊ฐ์ฅ ๋์คํ๋ ์ธ์ด์ธ ์๋ฆฌ๋ํฐ(Solidity)๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์ต๋๋ค. ๋ณธ ๊ฐ์ด๋๋ ์ด๋๋ฆฌ์ ์ค๋งํธ ๊ณ์ฝ์๋ฅผ ์์ฑํจ์ผ๋ก์จ ์๋ฆฌ๋ํฐ์ ๋จ๊ณ๋ณ ํ์ต์ ์ ๊ณตํฉ๋๋ค.
์ฌ๋ฌ๋ถ์ ์ฒซ ๋ฒ์งธ ์ค๋งํธ ๊ณ์ฝ
์ฐ์ , ์ฐ๋ฆฌ๋ ํฌํ ์ค๋งํธ ๊ณ์ฝ์๋ฅผ ์์ฑํ ๊ฒ์ ๋๋ค. ์ดย ์ค๋งํธ ๊ณ์ฝ์ ํตํด ์ฌ์ฉ์๋ค์ ์๋ก์ด ์ ์์๋ฅผ ์ ์ํ ์์์ต๋๋ค. ์ฆ, ๊ธฐ์กด์ ์ ์์ ๋ํด ์ฐฌ์ฑ ํน์ ๋ฐ๋ํฌํ๋ฅผ ํ์ฌ ๋ ๋ง์ ํฌํ๋ฅผ ๋ฐ์ ์ ์์ ์ ์ํ ์ง์ํ ์ ์์ต๋๋ค. ์ด๋ฌํ ์์ด๋์ด๋ย CarbonVote์์ ์๊ฐ์ ๋ฐ์ ๊ฒ์ ๋๋ค. CarbonVote๋ ํฌํ์๋ค์ ์ง๊ฐ์์ ์ฝ์ธ์ ์๊ตฌํ์ง์๋ ํฌํ ๊ธฐ๋ฅ์ ๊ฐ์ง ์น ํ์ด์ง์ ๋๋ค. ํฌํ๋ ์ ํน์ ์๋์ค๋ฅผ ๋ํ๋ด๋ ๊ฐ ์ฃผ์์ย ETH ๊ธ์ก์ ๋ณด๊ณ ์ธ์ ๋ ์ง ๊ณ์ฐ ๊ฐ๋ฅํฉ๋๋ค. ์ ์์๋ ์ ์์๋ฅผ ๋ท๋ฐ์นจํ ETH๋ฅผ ์ง๋ถํด์ผ ํฉ๋๋ค (์๋ฅผ ๋ค์ด 5 ETH). ๊ทธ๋ฆฌ๊ณ ์ด ๊ธ์ก์ ์ ์์๋ฅผ์ทจ์/์ข ๋ฃํ ๋ ๋ค์ ๋ฐ์ ์ ์์ต๋๋ค.
Remix๋ก ์์ํ๊ธฐ
์ด๋๋ฆฌ์์ ๊ฐ๋ฐํ๋ ๊ฒ์ด ์ฒ์์ด๋ผ๋ฉด, ์ด๋ ๊ต์ฅํ ์ด๋ ค์ด ๊ณผ์ ์ฒ๋ผ ๋๊ปด์ง ์๋ ์์ต๋๋ค. ๋์ฑ ์ฌ์ด ์ดํด๋ฅผ ์ํด, ๋ณธ ๊ธ์ ๊ฐ๋ฅํ ํ ๊ฐ๋จํ๊ฒ ์ฐ๊ฒ ์ต๋๋ค. ๊ฐ์ ๋ชฉ์ ์ผ๋ก, zero install ์ธ๋ธ๋ผ์ฐ์ IDEย The Remix Solidity Editor๋ฅผ ์ฌ์ฉํ๊ฒ ์ต๋๋ค.

์ผ์ชฝ ์๋จ์ (+) ๋ฒํผ์ ๋๋ฌ ์๋ก์ด ํ์ผ์ ๋ง๋ค์ดย Voting.sol๋ก ํ์ผ๋ช ์ ์ ์ฅํฉ๋๋ค.
์ฝ๋ ์ค์ผ๋ ํค(Code skeleton)
์๋ฆฌ๋ํฐ ๋ฒ์
์ฐ์ ์ฐ๋ฆฌ๊ฐ ์ง์ํ๋ ์๋ฆฌ๋ํฐ ๋ฒ์ ์ ์ ์ธํ๊ณ ๊ณ์ฝ์ ์์ฑ์ ์์ํฉ๋๋ค:
๊ณ์ฝ์ ์๋ฆฌ๋ํฐ ์ปดํ์ผ๋ฌ ๋ฒ์ 0.4.15 ์ดํ์ ๋ฒ์ ์ ์ง์ํ์ง๋ง 0.5.0 ์ดํ์ ๋ฒ์ ์ ์ง์ํ์ง ์์ต๋๋ค. (๋๋ฒ์งธ ์กฐ๊ฑด์ ^๋ฅผ ์ฌ์ฉํ์ฌ ์ถ๊ฐ๋ฉ๋๋ค)
๋ฐ์ดํฐ ๊ตฌ์กฐ(Structs)
๋ณธ ๊ณ์ฝ์์๋ 2๊ฐ์ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ๋ง๋ค์์ต๋๋ค: ํฌํ์์ ์ ์์์ ๋๋ค. ํฌํ์ ๋ฐ์ดํฐ ๊ตฌ์กฐ์๋ ์ฌ์ ์ด ํฌํจ๋ฉ๋๋ค. ์ด ์ฌ์ ์ ์ ์์์ ์์ธ์ ์ฐธ/๊ฑฐ์ง์ผ๋ก ๋งคํํ์ฌ ํฌํ์๊ฐ ์ด๋ฏธ $index ์ ์์์ ํฌํํ๋์ง ๋ณด์ฌ์ค๋๋ค. ๊ฐ๊ฐ์ ์ ์์๋ ๋ค์๊ณผ ๊ฐ์ ์ ๋ณด๋ฅผ ๊ฐ์ง๊ฒ ๋ฉ๋๋ค: ์ ์์์ ๋ด์ฉ, ์ฐฌ์ฑ/๋ฐ๋ ํฌํ์, ์ ์์๊ฐ ์ ์๋ ๋ธ๋ก ์ซ์, ์ ์์์ ์ฃผ์ ๊ทธ๋ฆฌ๊ณ ์ทจ์๋ ์ํ(์ ์์๊ฐ ์ทจ์ํ๋ค๋ฉด ์ฐธ, ๊ทธ๋ ์ง ์์ ๊ฒฝ์ฐ ๊ฑฐ์ง).
์ฌ๊ฑด(Events)
๊ณ์ฝ์๋ ์ ์์์ ๋ํ ์ฐฌ์ฑ ํน์ ๋ฐ๋ํฌํ(VoteFor/VoteAgainst), ์๋ก์ด ์ ์์๋ฅผ ์ถ๊ฐ ํน์ ์ทจ์(ProposalAdded/ProposalCanceled)๊ทธ๋ฆฌ๊ณ ์ ์์์๊ฒ ์ด๋(Ether)๋ฅผ ๋ค์ ํ๋ถ(Refund) ๋ ๋ ์ฌ๊ฑด์ ๋ด๋ณด๋ ๋๋ค. ๊ฐ๊ฐ์ ์ฌ๊ฑด์๋ ํฌํ๊ฐ ์ํ๋ ๋ ์ผ์ด๋๋ ์ผ์ ์ถ์ ํ๋๋ฐ ํ์ํ ์ ๋ณด๊ฐ ๋ค์ด์์ต๋๋ค.
์์์(Modifiers)
์๋ฆฌ๋ํฐ ๋ฌธ์์์, ์์์๋:
๊ธฐ๋ฅ์ ์คํํ๊ธฐ ์ ์ ์๋์ผ๋ก ์กฐ๊ฑด์ ํ์ธํ ์ ์์ต๋๋ค. ์์์๋ ๊ณ์ฝ์ ์์ ๊ฐ๋ฅํ ์์ฑ์ด๋ฉฐ, ํ์๋ ๊ณ์ฝ์ ์ํด ๋ฌด์๋ ์ ์์ต๋๋ค.
๋ณธ ๊ณ์ฝ์์๋, ํฌํ๊ฐ ๊ณ์ ์คํ ์ค์ธ์ง ํ์ธํ๊ธฐ ์ํดnotEndedย ์์์๋ฅผ ์ฌ์ฉํ์ต๋๋ค.ย checkValueย ์์์๋ ์ ์์๋ค์ด ๊ฐ๊ฐ์ ์ ์์์ ๋ํ ์ถฉ๋ถํ ์ด๋๋ฅผ ์ง๋ถํ๋์ง ํ์ธํ๊ณ ์ด๊ณผ๋ถ์ ํ๋ถํ๋ ๊ธฐ๋ฅ์ ํฉ๋๋ค.
์์ฑ(Constructions)
๊ณ์ฝ์ ๋ฐฐํฌํ๋ฉด ์์ฑ์๊ฐ ํธ์ถ๋ฉ๋๋ค. ์ด ์์ฑ์๋ ๋จ ํ ๋ฒ๋ง ํธ์ถ๋๋ฉฐ ๋ค์๋ ํธ์ถ๋ ์ ์์ต๋๋ค. ์์ฑ์๋ ์ด๊ธฐ์ ์ ๊ฑด์ ๋ฐ ํฌํ ์ํ๋ฅผ ์ด๊ธฐํํฉ๋๋ค.
์ ์์ ์ ์ํ๊ธฐ
์ฌ์ฉ์๊ฐ ์๋ก์ด ์ ์์๋ฅผ ์ ์ํ ๋๋ง๋ค, ์ฌ๊ฑด์ด ๊ธฐ๋ก๋ย proposalsย ๋ฐฐ์ด์ ์ถ๊ฐ๋ฉ๋๋ค. ์ ์์์ ์์ ์ ์์๊ฐ ์ง๋ถํ ์ด๋์ ๊ธ์ก ๋ํ ์ ์ฐจ ์ปค์ง๋๋ค.
์ฃผ์:ย ํ ๊ธฐ๋ฅ์ ๋ค์์ ์์์๋ฅผ ์ ์ฉํ ์ ์์ต๋๋ค. ์ด๋ ๊ธฐ๋ฅ ๋จธ๋ฆฌ๊ธ์ ๊ณต๋ฐฑ์ผ๋ก ๊ตฌ๋ถ๋ ๋ชฉ๋ก์ ์์์๋ฅผ ์ถ๊ฐํจ์ผ๋ก์จ ๊ฐ๋ฅํฉ๋๋ค. ์์์๋ ์ ์๋ ์์๋๋ก ํ๊ฐ๋ฉ๋๋ค. ์ ์ฝ๋ ์กฐ๊ฐ์์ ์ฐ๋ฆฌ๋ ์ฌ์ ํ ํฌํ๊ฐ ์งํ ์ค์ธ์ง ํ์ธํ๊ณ ์ ์์๊ฐ ๊ณ์ฝ์ ์ ๋น๋์ ์ด๋๋ฅผ ์ ์กํ๋์ง ํ์ธํ๊ธฐ ์ํดย notEndedย ๊ทธ๋ฆฌ๊ณ ย checkValue, 2๊ฐ์ ์์์๋ฅผ ์ถ๊ฐํ์ต๋๋ค.
์ ์์ ์ทจ์ ๋ฐ ํ๋ถ
์ ์์๊ฐ ๋ณธ ์ ์์์ ์ํด ์ทจ์๋๋ ๊ฒฝ์ฐ ์ทจ์๋์๋ค๊ณ ํ์๋๋ฉฐ ์ง๋ถ๋ ์ด๋๋ ๋ค์ ํ๋ถ๋ฉ๋๋ค.ย Sendย ๋ฐฉ์์ ์ง์ ๋ ์ด๋์ ๊ธ์ก์ ๋ค์ ์ ์์์๊ฒ ์ ์กํฉ๋๋ค. ํ๋ถ์ด ์ฑ๊ณต์ ์ผ๋ก ์ด๋ค์ก๋์ง๋ฅผ ๋ํ๋ด๋ ์ฐธ/๊ฑฐ์ง์ ๋ฐํํ๊ฒ ๋ฉ๋๋ค.
๊ฒฝ๊ณ :ย ์ฌ์ง์ ์ฐฉ์ทจ(reentrancy exploit)๋ฅผ ์๋ฐฉํ๊ธฐ ์ํด์๋ ํญ์ย send๋ฅผ ํธ์ถํ๊ธฐ ์ด์ ์ ์์ก์ ์ฐจ๊ฐํด์ผ ํฉ๋๋ค. ๊ณต๊ฒฉ์๋ย refundย ๊ธฐ๋ฅ์ ์คํธํ ์ ์์ต๋๋ค.ย Sendย ๋ฐฉ์์ ๊ณต๊ฒฉ์๊ฐ ๋ ๋ค๋ฅธ refund๋ฅผ ํธ์ถํ๊ธฐ ์ด์ ์ ์๋ฃ๋์ง ์์, ๊ฒฐ๊ตญ ์ฌ๋ฌ ๋ฒ์ย send๋ฅผ ํธ์ถํ์ฌ ์ ์์์ ์์ก์ ์ฝํํ ์ ์์ต๋๋ค.
ํฌํ
์ฌ์ฉ์๊ฐ ํฌํํ ๋, ์ ์์์ ์ฐฌ์ฑํ๊ฑฐ๋ ๋ฐ๋ํ ์ ์์ต๋๋ค. ์ฐ๋ฆฌ๋ ์ ์์ ์์ธ์ด ์ ํจํ์ง ๊ทธ๋ฆฌ๊ณ ํฌํ๊ฐ ์งํ๋๊ธฐ ์ด์ ์ ์ทจ์๋์ง๋ ์์๋์ง ํ์ธํ๊ณ ์ถ์ต๋๋ค. ๋ํ, ์ฌ์ฉ์๊ฐ ๊ฐ์ ์ ์์์ ์ค๋ณต์ผ๋ก ํฌํํ๋ ๊ฒ์ ์๋ฐฉํ๊ณ ์ ํฉ๋๋ค. ์ด๋ ๊ฐ ํฌํ์์ย votedProposals์ ์ฌ์ ์์ ํ์ธํจ์ผ๋ก์จ ํด๊ฒฐํ ์ ์์ต๋๋ค. ๊ทธ๋ฐ ๋ค์, ์ ์์์ ๋ํ ํฌํ์์ ์ด๋ ๊ธ์ก(wei ๋จ์)์ ๊ฐ์ง๊ณ ํฌํ ์๋ฅผ ์ฆ๊ฐ์ํต๋๋ค. ํฌํ๋ฅผ ํ์ํ๊ธฐ ์ํ ์ฌ๊ฑด๋ ๊ธฐ๋ก๋ฉ๋๋ค.
์ ์์์ ๋ชจ๋ ์ ๋ณด ์ง์
์ ์ ํ ์์ธ์ผ๋ก ์ด ๊ธฐ๋ฅ์ ํธ์ถํ๋ฉด ์ ์์์ ๊ด๋ จํ์ฌ ํ์ํ ๋ชจ๋ ์ ๋ณด(๋ด์ฉ, ์ฐฌ์ฑ ๋ฐ ๋ฐ๋ํฌํ ์, ์ ์์ ์ฃผ์, ์ ์๋ ๋ธ๋ก ๋ฒํธ)๋ฅผ ์ป์ ์ ์์ต๋๋ค. ์ด ๊ธฐ๋ฅ์ ํฌํ ๊ฐ์ ๋๋ ค์ฃผ๋๋ฐ, ์ด ๊ฐ์ ์ถํ์ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ํตํด ์ถ์ถํ ์ ์์ต๋๋ค.
์ฐ์น ์ ์ ์ง์
์ด ๊ธฐ๋ฅ์ด ํธ์ถ๋๋ฉด, ๊ฐ์ฅ ๋์ (์ฐฌ์ฑ ํน์ ๋ฐ๋) ํฌํ๋ฅผ ๋ฐ์ ์ ์์ ์์ธ์ ๋๋ ค์ค๋๋ค.
๋ฐฐ์น ๋ฐ ํ ์คํธ

๋ฐฐ์น
์ฐ์ธก ํจ๋์, ์๋๋๋ก ์ค์ ํ์ญ์์ค:
ยท ํ๊ฒฝ(Environment): Javascript VM
ยท ๊ฐ์ค ํ๊ณ(Gas Limit): 300000
ยท ๊ฐ์ค ๊ฐ๊ฒฉ(Gas Price): 0
ยท ๊ฐ(Value): 0
ยท ๋ง๋ค๊ธฐ(Create): <๊ณต๋ฐฑ(keep blank)>
๋ค์์ผ๋กย Create๋ฅผ ํด๋ฆญํฉ๋๋ค. ๊ณ์ฝ์ด ํ ์คํธ ๋ธ๋ก์ฒด์ธ์ ๋ฐฐ์น๋ฉ๋๋ค.

๊ณ์ฝ๊ณผ ์ํธ ์์ฉ
addNewProposalย ๋ฐ์ค์ ์ํ๋ ์ ์์๋ฅผ ์ถ๊ฐํ๊ณ , ๊ฐ ๋ฐ์ค์ ๊ณ์ฝ์ ๋ณด๋ด๊ณ ์ถ์ ๊ฐ์ ์ ๋ ฅํ๋ฉด ๋ฉ๋๋ค. ์ฐ๋ฆฌ์ ์์์์๋, 30 ETH์ โBuild a voting contractโ ์ ์์๋ฅผย addNewProposalย ๊ธฐ๋ฅ์ ๋ณด๋์ต๋๋ค.
์ ์์์ ํจ๊ป 30 ETH๋ฅผ ์ ์กํ์ง๋ง, 5 ETH๋ง ์ฐจ๊ฐ๋ ๊ฒ์ ๋ณด์ค ์ ์์ต๋๋ค. ์ด๋ย checkValue()์์์๊ฐ ์ด๊ณผ ๊ธ์ก์ ํ์ธํ์ฌ ๋ถํ์ํ ๊ธ์ก์ ๋ฐํํ๊ธฐ ๋๋ฌธ์ ๋๋ค.
์์ธ(์์์ ๊ฒฝ์ฐ 0)์ ์ด์ฉํ์ฌ ์ ์์๋ฅผ ์ง์ํ๋ฉด ์ ์์์ ๋ชจ๋ ์ ๋ณด๊ฐ ํ์๋ฉ๋๋ค. (๋ด์ฉ, ์ฐฌ์ฑ ๋ฐ ๋ฐ๋ ํฌํ์, ์ ์ก์ ๋ฐ ๋ธ๋ก ๋ฒํธ)

๋ ๋ง์ ์ ์์๋ฅผ ์ถ๊ฐํ๊ณ , ์ฌ๋ฌ ๊ณ์ ์ ์ ํํ๊ณ , ์ ์์์ ์ฐฌ๋ฐ ํฌํ๋ฅผ ํ๊ณ , ์ฐ์น ์ ์์์ ์ง์ํจ์ผ๋ก์จ ๊ณ์ฝ๊ณผ๋ ๋ง์ ์ํธ ์์ฉ์ ํ ์ ์์ต๋๋ค.
๊ทธ ๋ค์์?
๊ธ์ ๋ค ์ฝ์๋ค๋ฉด ์ด์ ๋ฌด์์ ํ ์ ์์๊น์?
์ด๋๋ฆฌ์ ํ ์คํธ๋ท์ด ์ ์ฝ๋๋ฅผ ํ ์คํธํด๋ณด๊ฑฐ๋, ์ฌ์ฉ์๋ค์ด ํฌํ ๊ณ์ฝ๊ณผ ์ํธ์์ฉํ ์ ์๋ ์น ์์ฉ ํ๋ก๊ทธ๋จ์ ๋ง๋ค ์ ์์ต๋๋ค.
์๋ฆฌ๋ํฐ ํํ ๋ฆฌ์ผ์ ๋งค์ฐ ๋ง์ง๋ง, ์๋๋ ๊ฐ์ฅ ๋์์ด ๋ ๋ฒํ ์๋ฃ๋ค์ ๋๋ค:
ยทย Learning Solidityย series byย Karl Floersch.
ยทย Getting Started as an Ethereum Web Developerย byย Alex Miller.
ยทย Karl Floerschย ์ย Learning Solidityย ์๋ฆฌ์ฆ
ยทย Alex Miller์ย Getting Started as an Ethereum Web Developer
์ด๋ ์๋ฆฌ๋ํฐ์ ์ด๋๋ฆฌ์ ์ค๋งํธ ๊ณ์ฝ์ ๋ฐฐ์ฐ๋ ๊ฐ์ฅ ์ฒซ ๋ฒ์งธ ๋จ๊ณ์ ๋๋ค. ์ฌ๋ฌ๋ถ๋ค์ด ์์ผ๋ก ์ด๋ค ์ฝ๋ฉ์ ํ ์ง ๊ต์ฅํ ๊ธฐ๋๋ฉ๋๋ค.