์ด๋๋ฆฌ์ ๊ฐ์ ๋จธ์ (EVM)์์ Python ์ค๋งํธ ๊ณ์ฝ์ ์ธ๊ณ๋ฅผ ํํํ์ธ์. Python์ ๊ฐ๋ ์ฑ๊ณผ ๊ฐ๋ ฅํ ์ํ๊ณ๋ฅผ ๋ธ๋ก์ฒด์ธ ๊ฐ๋ฐ์ ํ์ฉํ๋ ๋ฒ์ ๋ฐฐ์ฐ๊ณ , EVM ๊ธฐ๋ณธ ์๋ฆฌ ๋ฐ ์์ ํ ๊ณ์ฝ ์์ฑ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ์์๋ด ๋๋ค.
Python ์ค๋งํธ ๊ณ์ฝ: ์ด๋๋ฆฌ์ ๊ฐ์ ๋จธ์ ์์ ์ ์ฌ๋ ฅ ๋ฐํํ๊ธฐ
์ด๋๋ฆฌ์๊ณผ ๊ฐ์ ์ํธํํ๊ฐ ์ฃผ๋ํ๋ ๋ธ๋ก์ฒด์ธ ํ๋ช ์ ์ ๋ขฐ, ํฌ๋ช ์ฑ, ํ์ค์ํ ์์คํ ์ ๋ํ ์ฐ๋ฆฌ์ ์ฌ๊ณ ๋ฐฉ์์ ํจ๋ฌ๋ค์์ ์ ํ์ ๊ฐ์ ธ์์ต๋๋ค. ์ด ํ๋ช ์ ํต์ฌ์๋ ์ค๋งํธ ๊ณ์ฝ์ด๋ผ๋ ๊ฐ๋ , ์ฆ ๊ณ์ฝ ์กฐ๊ฑด์ด ์ฝ๋๋ก ์ง์ ์์ฑ๋ ์์ฒด ์คํ ๊ณ์ฝ์ด ์์ต๋๋ค. Solidity๊ฐ ์ด๋๋ฆฌ์ ๊ฐ์ ๋จธ์ (EVM)์์ ์ค๋งํธ ๊ณ์ฝ์ ์์ฑํ๋ ๋ฐ ์ง๋ฐฐ์ ์ธ ์ธ์ด์์ง๋ง, ๊ฐ๋ ์ฑ, ๊ด๋ฒ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ, ๊ฐ๋ฐ์ ์นํ์ฑ์ผ๋ก ์ ๋ช ํ Python์ ํ์ฉํ๋ ค๋ ๊ด์ฌ์ด ์ปค์ง๊ณ ์์ต๋๋ค. ์ด ๊ฒ์๋ฌผ์ EVM์์ ์ค๋งํธ ๊ณ์ฝ ๊ฐ๋ฐ์ ์ํ Python์ ํฅ๋ฏธ๋ก์ด ์ ์ฌ๋ ฅ์ ํ๊ตฌํ๋ฉฐ, ์ ์ธ๊ณ ๊ฐ๋ฐ์๋ค์ด ๊ทธ ํ์ ํ์ฉํ ์ ์๋๋ก ํ๋ ๋๊ตฌ, ๊ฐ๋ ๋ฐ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ์ดํด๋ด ๋๋ค.
์ด๋๋ฆฌ์ ๊ฐ์ ๋จธ์ (EVM): ์ด๋๋ฆฌ์์ ์ฌ์ฅ
Python ์ค๋งํธ ๊ณ์ฝ์ ๋ฐ์ด๋ค๊ธฐ ์ ์, ๊ทธ๊ฒ๋ค์ด ์๋ํ๋ ํ๊ฒฝ์ธ ์ด๋๋ฆฌ์ ๊ฐ์ ๋จธ์ (EVM)์ ์ดํดํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. EVM์ ์ด๋๋ฆฌ์ ๋คํธ์ํฌ์์ ์ค๋งํธ ๊ณ์ฝ์ ์คํํ๋ ๋ถ์ฐํ ํ๋ง ์์ ๊ฐ์ ๋จธ์ ์ ๋๋ค. ์์ฒ ๊ฐ์ ๋ ธ๋์ ๊ฑธ์ณ ๊ฒฐ์ ๋ก ์ ์ด๊ณ ๊ฒ์ฆ ๊ฐ๋ฅํ ๋ฐฉ์์ผ๋ก ์ฝ๋๋ฅผ ์คํํ๋ ๊ธ๋ก๋ฒ ๋ถ์ฐ ์ปดํจํฐ๋ผ๊ณ ์๊ฐํ๋ฉด ๋ฉ๋๋ค. ์ด๋๋ฆฌ์ ๋คํธ์ํฌ์ ๋ชจ๋ ๋ ธ๋๋ EVM ์ธ์คํด์ค๋ฅผ ์คํํ์ฌ ์ค๋งํธ ๊ณ์ฝ ์คํ์ด ์ผ๊ด๋๊ณ ๋ณ์กฐ ๋ฐฉ์ง๋จ์ ๋ณด์ฅํฉ๋๋ค.
EVM์ ์ฃผ์ ํน์ง:
- ํ์ค์ํ: ๋จ์ผ ์๋ฒ๊ฐ ์๋ ์ปดํจํฐ ๋คํธ์ํฌ์ ๋๋ค.
- ๊ฒฐ์ ๋ก ์ : ๋์ผํ ์ ๋ ฅ๊ณผ ์ํ๊ฐ ์ฃผ์ด์ง๋ฉด EVM์ ํญ์ ๋์ผํ ์ถ๋ ฅ์ ์์ฑํฉ๋๋ค. ์ด๋ ํฉ์์ ๋งค์ฐ ์ค์ํฉ๋๋ค.
- ํ๋ง ์์ : ์ผ๋ฐ ์ปดํจํฐ๊ฐ ์ํํ ์ ์๋ ๋ชจ๋ ๊ณ์ฐ์ ์ํํ ์ ์์ด ๋ณต์กํ ์ค๋งํธ ๊ณ์ฝ ๋ก์ง์ด ๊ฐ๋ฅํฉ๋๋ค.
- ๊ฐ์ค ๋ฉ์ปค๋์ฆ: EVM์ ๋ชจ๋ ์์ ์๋ '๊ฐ์ค'๋ผ๋ ํน์ ๋น์ฉ์ด ๋ฐ์ํ๋ฉฐ, ์ด๋ ์ด๋๋ก ์ง๋ถ๋ฉ๋๋ค. ์ด๋ ๋ฌดํ ๋ฃจํ๋ฅผ ๋ฐฉ์งํ๊ณ ํจ์จ์ ์ธ ์ฝ๋ ์์ฑ์ ์ฅ๋ คํฉ๋๋ค.
- ์๋๋ฐ์ค ํ๊ฒฝ: ์ค๋งํธ ๊ณ์ฝ์ ๊ฒฉ๋ฆฌ๋ ํ๊ฒฝ์์ ์คํ๋์ด ํธ์คํธ ์์คํ ์ ์ ๊ทผํ๊ฑฐ๋ ์ํฅ์ ๋ฏธ์น๋ ๊ฒ์ ๋ฐฉ์งํฉ๋๋ค.
EVM์ ๋ฐ์ดํธ์ฝ๋ ์์ค์์ ์๋ํฉ๋๋ค. Solidity์ ๊ฐ์ ์ธ์ด๋ EVM ๋ฐ์ดํธ์ฝ๋๋ก ์ปดํ์ผ๋์ง๋ง, ๋ค์๊ณผ ๊ฐ์ ์๋ฌธ์ด ์๊น๋๋ค. ์ด ๋ชฉ์ ์ ์ํด Python์ ์ง์ ๋๋ ๊ฐ์ ์ ์ผ๋ก ํ์ฉํ ์ ์์๊น์?
๋ธ๋ก์ฒด์ธ ๊ฐ๋ฐ์์ Python์ ๋งค๋ ฅ
Python์ ์ธ๊ธฐ๋ ๋ถ์ธํ ์ ์์ต๋๋ค. ๋ช ํํ ๊ตฌ๋ฌธ, ๊ด๋ฒ์ํ ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ, ํ๋ฐํ ์ปค๋ฎค๋ํฐ ๋๋ถ์ ์น ๊ฐ๋ฐ ๋ฐ ๋ฐ์ดํฐ ๊ณผํ์์ ๋จธ์ ๋ฌ๋ ๋ฐ ์๋ํ์ ์ด๋ฅด๊ธฐ๊น์ง ๊ด๋ฒ์ํ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ํ ์ฃผ์ ์ธ์ด๊ฐ ๋์์ต๋๋ค. ์ด๋ฌํ ๊ฐ์ ์ ๋ธ๋ก์ฒด์ธ ์ธ๊ณ์๋ ๋๋๋๋ก ์ ์ ์ฉ๋ฉ๋๋ค.
- ๊ฐ๋ ์ฑ ๋ฐ ๋จ์์ฑ: Python์ ๊น๋ํ ๊ตฌ๋ฌธ์ ์ค๋งํธ ๊ณ์ฝ ํ๋ก๊ทธ๋๋ฐ์ ์ฒ์ ์ ํ๋ ๊ฐ๋ฐ์์ ํ์ต ๊ณก์ ์ ํฌ๊ฒ ์ค์ฌ์ค๋๋ค. ์ด๋ฌํ ์ ๊ทผ์ฑ์ ๋ธ๋ก์ฒด์ธ ๊ฐ๋ฐ์ ๋ฏผ์ฃผํํ๊ณ ์ ์ธ๊ณ์ ์ผ๋ก ๋ ๋์ ์ธ์ฌ ํ์ ์ ์นํ ์ ์์ต๋๋ค.
- ๋ฐฉ๋ํ ์ํ๊ณ ๋ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ: Python์ ๊ฑฐ์ ๋ชจ๋ ์์ ์ ์ํ ๋น๊ตํ ์ ์๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ปฌ๋ ์ ์ ์๋ํฉ๋๋ค. ์ด๋ ๊ฐ๋ฐ์๊ฐ ๋ฐ์ดํฐ ์กฐ์, ์ํธํ, ๋คํธ์ํน ๋ฑ๊ณผ ๊ฐ์ ์์ ์ ์ํด ๊ธฐ์กด ๋๊ตฌ๋ฅผ ํ์ฉํ์ฌ ๊ฐ๋ฐ ์ฃผ๊ธฐ๋ฅผ ๊ฐ์ํํ ์ ์์์ ์๋ฏธํฉ๋๋ค.
- ๊ฐ๋ฐ์ ์์ฐ์ฑ: Python ์ฝ๋๋ฅผ ์์ฑํ๊ณ ํ ์คํธํ๋ ์ฉ์ด์ฑ์ ์ผ๋ฐ์ ์ผ๋ก ๊ฐ๋ฐ์ ์์ฐ์ฑ์ ๋์ ๋๋ค. ์ด๋ ๋น ๋ฅธ ๋ฐ๋ณต์ด ์ข ์ข ํ์ํ ๋น ๋ฅด๊ฒ ๋ณํํ๋ ๋ธ๋ก์ฒด์ธ ๊ณต๊ฐ์์ ํนํ ์ ์ฉํฉ๋๋ค.
- ์ปค๋ฎค๋ํฐ ์ง์: ๋ฐฉ๋ํ๊ณ ํ๋ฐํ Python ์ปค๋ฎค๋ํฐ๋ ๋์์ ์ํ ํ๋ถํ ์๋ฃ, ํํ ๋ฆฌ์ผ ๋ฐ ํฌ๋ผ์ ์๋ฏธํฉ๋๋ค. ์ด ๊ธ๋ก๋ฒ ์ง์ ๋คํธ์ํฌ๋ ์ด๋ ค์์ ๊ฒช๋ ๊ฐ๋ฐ์์๊ฒ ๋งค์ฐ ์ค์ํฉ๋๋ค.
Python๊ณผ EVM ์ฐ๊ฒฐํ๊ธฐ: Pythonic ์ค๋งํธ ๊ณ์ฝ ์ธ์ด Vyper
Python ์์ฒด๋ EVM ๋ฐ์ดํธ์ฝ๋๋ก ์ง์ ์ปดํ์ผ๋์ง ์์ง๋ง, ๋ธ๋ก์ฒด์ธ ์ปค๋ฎค๋ํฐ๋ ์ด๋ฌํ ๊ฒฉ์ฐจ๋ฅผ ํด์ํ๊ธฐ ์ํ ์๋ฃจ์ ์ ๊ฐ๋ฐํ์ต๋๋ค. ์ด ์ค ๊ฐ์ฅ ์ค์ํ ๊ฒ์ Vyper์ ๋๋ค. Vyper๋ Python๊ณผ ์ค์ํ ๊ตฌ๋ฌธ์ ์ ์ฌ์ฑ์ ๊ณต์ ํ๋ ๊ณ์ฝ ์งํฅ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์ ๋๋ค. ํนํ EVM์ ์ํด ์์ ํ๊ณ ๊ฐ์ฌ ๊ฐ๋ฅํ๋ฉฐ ์์ฑํ๊ธฐ ์ฝ๋๋ก ์ค๊ณ๋์์ต๋๋ค.
Vyper์ ์ค๊ณ ์ฒ ํ์ ์ฅํฉํจ๋ณด๋ค ๋ช ํ์ฑ๊ณผ ๋ณด์์ ๊ฐ์กฐํฉ๋๋ค. ์๋์ ์ผ๋ก Python(๋ฐ Solidity)์์ ๋ฐ๊ฒฌ๋๋ ํน์ ๊ธฐ๋ฅ์ ์ ํํ์ฌ ์ทจ์ฝ์ ์ ์ ๋ฐํ๊ฑฐ๋ ์ฝ๋๋ฅผ ๊ฐ์ฌํ๊ธฐ ์ด๋ ต๊ฒ ๋ง๋ค ์ ์๋ ์์๋ฅผ ์ ๊ฑฐํฉ๋๋ค. ์ด๋ฌํ ๋ณด์ ์ค์ฌ ์ ๊ทผ ๋ฐฉ์์ ์ค์ํ ์ค๋งํธ ๊ณ์ฝ์ ์์ฑํ๋ ๋ฐ ๋งค๋ ฅ์ ์ธ ์ต์ ์ด ๋ฉ๋๋ค.
Vyper ์๋ ๋ฐฉ์:
- Pythonic ๊ตฌ๋ฌธ: Vyper ์ฝ๋๋ Python๊ณผ ๋น์ทํ๊ฒ ๋ณด์ด๊ณ ๋๊ปด์ ธ Python ๊ฐ๋ฐ์์๊ฒ ์ต์ํฉ๋๋ค.
- EVM ๋ฐ์ดํธ์ฝ๋ ์ปดํ์ผ: Vyper ์์ค ์ฝ๋๋ EVM ๋ฐ์ดํธ์ฝ๋๋ก ์ปดํ์ผ๋๋ฉฐ, ์ด๋ ์ด๋๋ฆฌ์ ๋ธ๋ก์ฒด์ธ์ ๋ฐฐํฌ๋ ์ ์์ต๋๋ค.
- ๋ณด์ ์ค์ : Vyper๋ ๋ ์๊ฒฉํ ๊ท์น์ ์ ์ฉํ๊ณ ์ ์ฉ๋ ์ ์๋ ํน์ ๋ณต์กํ ๊ธฐ๋ฅ์ด ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, Solidity์ ๊ฐ์ ๋ฐฉ์์ผ๋ก ์์์ ์ง์ํ์ง ์์ผ๋ฉฐ, ๋ ์์ธก ๊ฐ๋ฅํ ๊ฐ์ค ๋น์ฉ์ ๋ชฉํ๋ก ํฉ๋๋ค.
- ๊ฐ์ฌ ์ฉ์ด์ฑ: ๋ ๊ฐ๋จํ ๊ตฌ๋ฌธ๊ณผ ์ถ์๋ ๊ธฐ๋ฅ ์ธํธ๋ ๊ฐ์ฌ์๊ฐ Vyper ๊ณ์ฝ์ ๋ ์ฝ๊ฒ ๊ฒํ ํ๊ณ ๊ฐ๋ฐ์๊ฐ ์ดํดํ๊ธฐ ์ฝ๊ฒ ๋ง๋ญ๋๋ค.
์์: Vyper๋ก ์์ฑ๋ ๊ฐ๋จํ ํ ํฐ ๊ณ์ฝ
Vyper์์ ํ ํฐ ๊ณ์ฝ์ ๊ฐ์ํ๋ ์๋ฅผ ์ดํด๋ณด๋ฉฐ Pythonic ํน์ฑ์ ์ค๋ช ํ๊ฒ ์ต๋๋ค.
# SPDX-License-Identifier: MIT
# A simplified ERC20-like token contract
owner: public(address)
total_supply: public(uint256)
balances: HashMap[address, uint256]
@external
def __init__():
self.owner = msg.sender
self.total_supply = 1_000_000 * 10**18 # 1 million tokens with 18 decimal places
self.balances[msg.sender] = self.total_supply
@external
def transfer(_to: address, _value: uint256) -> bool:
assert _value <= self.balances[msg.sender], "Insufficient balance"
self.balances[msg.sender] -= _value
self.balances[_to] += _value
log Transfer(msg.sender, _to, _value)
return True
@external
def get_balance(_owner: address) -> uint256:
return self.balances[_owner]
๋ฐ์ฝ๋ ์ดํฐ(`@external`)๊ฐ ์๋ ํจ์ ์ ์, ํ์ ํํธ๊ฐ ์๋ ๋ณ์ ์ ์ธ, ํ์ค ์ ์ด ํ๋ฆ ๋ฑ Python๊ณผ์ ์ ์ฌ์ฑ์ ์ฃผ๋ชฉํ์ญ์์ค. ์ด๋ Python ๊ฐ๋ฐ์์๊ฒ ํจ์ฌ ๋ ๋ถ๋๋ฌ์ด ์ ํ์ ๊ฐ๋ฅํ๊ฒ ํฉ๋๋ค.
๋ค๋ฅธ ์ ๊ทผ ๋ฐฉ์ ๋ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
Vyper๊ฐ ์ฃผ์ ์ ์ฉ Pythonic ์ค๋งํธ ๊ณ์ฝ ์ธ์ด์ด์ง๋ง, ๋ค๋ฅธ ๋๊ตฌ ๋ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ Python๊ณผ EVM์ ์ํธ ์์ฉ์ ์ฉ์ดํ๊ฒ ํฉ๋๋ค.
- Web3.py: ์ด๊ฒ์ Python์์ ์ด๋๋ฆฌ์ ๋ธ๋ก์ฒด์ธ๊ณผ ์ํธ ์์ฉํ๊ธฐ ์ํ ์ค์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋๋ค. ์ด๋๋ฆฌ์ ๋ ธ๋(Ganache, Infura ๋๋ ๋ก์ปฌ ๋ ธ๋์ ๊ฐ์)์ ์ฐ๊ฒฐํ๊ณ , ํธ๋์ญ์ ์ ๋ณด๋ด๊ณ , ๋ธ๋ก์ฒด์ธ ๋ฐ์ดํฐ๋ฅผ ์ฟผ๋ฆฌํ๋ฉฐ, Solidity ๋๋ Vyper๋ก ์์ฑ๋ ๊ณ์ฝ์ ๋ฐฐํฌํ ์ ์์ต๋๋ค. Web3.py ์์ฒด๋ ์ค๋งํธ ๊ณ์ฝ์ ์์ฑํ์ง ์์ง๋ง, ์ค๋งํธ ๊ณ์ฝ์ ๊ด๋ฆฌํ๊ณ ์ํธ ์์ฉํ๋ ๋ฐ ํ์์ ์ ๋๋ค.
- Brownie: ์ค๋งํธ ๊ณ์ฝ์ ์ํ Python ๊ธฐ๋ฐ ๊ฐ๋ฐ ๋ฐ ํ ์คํธ ํ๋ ์์ํฌ์ ๋๋ค. Brownie๋ ํ๋ก์ ํธ ๊ด๋ฆฌ์, ํ์คํฌ ๋ฌ๋, ํตํฉ ์ฝ์๊ณผ ๊ฐ์ ๊ธฐ๋ฅ์ ์ ๊ณตํ์ฌ ์ค๋งํธ ๊ณ์ฝ์ ๊ตฌ์ถ, ํ ์คํธ ๋ฐ ๋ฐฐํฌํ๋ ํ๋ก์ธ์ค๋ฅผ ๊ฐ์ํํฉ๋๋ค. Solidity ๋ฐ Vyper์ ์ํํ๊ฒ ์๋ํฉ๋๋ค.
- Eth-Brownie: (Brownie์ ์ข ์ข ์ํธ ๊ตํ์ ์ผ๋ก ์ฌ์ฉ๋จ) - Python์ผ๋ก ์์ฑ๋ ์ด๋๋ฆฌ์ ์ค๋งํธ ๊ณ์ฝ์ ์ํ ๊ฐ๋ ฅํ ๊ฐ๋ฐ ํ๋ ์์ํฌ์ ๋๋ค. ์ข ์์ฑ์ ๊ด๋ฆฌํ๊ณ , ๊ณ์ฝ์ ์ปดํ์ผํ๊ณ , ํ ์คํธ๋ฅผ ์คํํ๊ณ , ๋ธ๋ก์ฒด์ธ๊ณผ ์ํธ ์์ฉํ๋ ํธ๋ฆฌํ ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค.
์ด๋ฌํ ๋๊ตฌ๋ Python ๊ฐ๋ฐ์๊ฐ ๋ธ๋ก์ฒด์ธ ์ํธ ์์ฉ์ ๋ง์ ์ ์์ค ๋ณต์ก์ฑ์ ์ถ์ํํ์ฌ ๋ณต์กํ ํ์ค์ํ ์ ํ๋ฆฌ์ผ์ด์ (dApps)์ ๊ตฌ์ถํ ์ ์๋๋ก ์ง์ํฉ๋๋ค.
Python (Vyper)์ผ๋ก ์์ ํ ์ค๋งํธ ๊ณ์ฝ ์์ฑํ๊ธฐ
์ค๋งํธ ๊ณ์ฝ ๊ฐ๋ฐ์์ ๋ณด์์ ๊ฐ์ฅ ์ค์ํฉ๋๋ค. ์ค๋งํธ ๊ณ์ฝ์ ๋ฒ๊ทธ๋ ์๋นํ ์ฌ์ ์ ์์ค๊ณผ ๋ช ์ฑ์ ๋์ดํฌ ์ ์๋ ์์์ ์ด๋ํ ์ ์์ต๋๋ค. Vyper์ ์ค๊ณ๋ ์ ํ์ ๋์ด ๋ณธ์ง์ ์ผ๋ก ๋ณด์์ ์ด์งํฉ๋๋ค. ๊ทธ๋ฌ๋ ๊ฐ๋ฐ์๋ ์ฌ์ ํ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ์ค์ํด์ผ ํฉ๋๋ค.
์์ ํ ์ค๋งํธ ๊ณ์ฝ์ ์ํ ๋ชจ๋ฒ ์ฌ๋ก:
- ๊ฐ๋จํ๊ฒ ์ ์ง: ๋ณต์กํ ์ฝ๋๋ ์ค๋ฅ ๋ฐ ์ทจ์ฝ์ ์ ๋ ์ทจ์ฝํฉ๋๋ค. ๊ณ์ฝ์ ํ์ํ ํ์ ๋ก์ง์ ๊ณ ์ํ์ญ์์ค.
- ์ฒ ์ ํ ํ ์คํธ: ๋ชจ๋ ๊ณ์ฝ ๊ธฐ๋ฅ์ ๋ํด ํฌ๊ด์ ์ธ ๋จ์ ํ ์คํธ ๋ฐ ํตํฉ ํ ์คํธ๋ฅผ ์์ฑํ์ญ์์ค. ํจ์จ์ ์ธ ํ ์คํธ๋ฅผ ์ํด Brownie์ ๊ฐ์ ํ๋ ์์ํฌ๋ฅผ ์ฌ์ฉํ์ญ์์ค.
- ๊ฐ์ค ๋น์ฉ ์ดํด: ๋นํจ์จ์ ์ธ ์ฝ๋๋ ๊ณผ๋ํ๊ฒ ๋์ ๊ฐ์ค ์์๋ฃ๋ก ์ด์ด์ ธ ์ฌ์ฉ์ ๊ฒฝํ์ ์ํฅ์ ๋ฏธ์น๊ณ ์ ์ฌ์ ์ผ๋ก ๊ณ์ฝ์ ๋น๊ฒฝ์ ์ ์ผ๋ก ๋ง๋ค ์ ์์ต๋๋ค. Vyper๋ ์์ธก ๊ฐ๋ฅ์ฑ์ ๋ชฉํ๋ก ํ์ง๋ง, ์ธ์์ด ์ค์ํฉ๋๋ค.
- ์ฌ์ง์ ๊ณต๊ฒฉ: ์ธ๋ถ ๊ณ์ฝ์ด ์ด๊ธฐ ์คํ์ด ์๋ฃ๋๊ธฐ ์ ์ ํธ์ถ ๊ณ์ฝ์ผ๋ก ๋ค์ ํธ์ถํ์ฌ ์๊ธ์ ๊ณ ๊ฐ์ํฌ ์ ์๋ ์ฌ์ง์ ์ทจ์ฝ์ ์ ์ธ์งํ์ญ์์ค. Vyper์ ์ค๊ณ๋ ์ด๋ฌํ ์ํ ์ค ์ผ๋ถ๋ฅผ ์ํํฉ๋๋ค.
- ์ ์ ์ค๋ฒํ๋ก์ฐ/์ธ๋ํ๋ก์ฐ: Vyper๊ฐ ์ผ๋ถ ์์ ์ ์์ ์ ๋ฐ๋ ์ ์๋ฅผ ์ฌ์ฉํ์ง๋ง, ๊ฐ๋ฐ์๋ ํนํ ์ธ๋ถ ์ ๋ ฅ ๋๋ ๊ณ์ฐ์ ๋ค๋ฃฐ ๋ ์ ์ฌ์ ์ธ ์ค๋ฒํ๋ก์ฐ ๋๋ ์ธ๋ํ๋ก์ฐ ๋ฌธ์ ์ ์ฌ์ ํ ์ ์ํด์ผ ํฉ๋๋ค.
- ์ ๊ทผ ์ ์ด: ์น์ธ๋ ์ฃผ์๋ง ๋ฏผ๊ฐํ ์์ ์ ์ํํ ์ ์๋๋ก ๊ฐ๋ ฅํ ์ ๊ทผ ์ ์ด ๋ฉ์ปค๋์ฆ์ ๊ตฌํํ์ญ์์ค. `owner` ๋๋ ์ญํ ๊ธฐ๋ฐ ์ ๊ทผ ์ ์ด์ ๊ฐ์ ์์ ์๋ฅผ ์ฌ์ฉํ์ญ์์ค.
- ์ธ๋ถ ํธ์ถ: ์ธ๋ถ ๊ณ์ฝ์ ํธ์ถํ ๋ ์ฃผ์ํ์ญ์์ค. ๋ฐํ ๊ฐ์ ๊ฒ์ฆํ๊ณ ์ธ๋ถ ๊ณ์ฝ์ด ์๊ธฐ์น ์๊ฒ ์๋ํ ๊ฐ๋ฅ์ฑ์ ๊ณ ๋ คํ์ญ์์ค.
- ๊ฐ์ฌ: ๋ชจ๋ ํ๋ก๋์ ์ค๋น ์ค๋งํธ ๊ณ์ฝ์ ๋ํด ์ ๋ฌธ ๋ณด์ ๊ฐ์ฌ๋ ํ์์ ์ ๋๋ค. ์ ๋ขฐํ ์ ์๋ ๊ฐ์ฌ ๋ฒ์ธ์ ๊ณ ์ฉํ์ฌ ์ฝ๋๋ฅผ ๊ฒํ ํ์ญ์์ค.
์์: Vyper์์์ ์ ๊ทผ ์ ์ด
๋ค์์ Vyper์์ ๊ฐ๋จํ ์์ ์ ๊ธฐ๋ฐ ์ ๊ทผ ์ ์ด๋ฅผ ๊ตฌํํ๋ ๋ฐฉ๋ฒ์ ๋๋ค.
# SPDX-License-Identifier: MIT
owner: public(address)
@external
def __init__():
self.owner = msg.sender
# Modifier to restrict access to the owner
@modifier
def only_owner():
assert msg.sender == self.owner, "Only the owner can call this function"
assert.gas_left(GAS_MAINTENANCE_THRESHOLD) # Example gas check
init_gas_left = gas_left()
@external
def __default__()(_data: bytes) -> bytes32:
# The logic within the modified function would go here
# For this example, we'll just return a dummy value
pass
# The following lines are conceptually where the wrapped function's code would execute
# In actual Vyper, this is handled more directly by the compiler
# For demonstration, imagine the decorated function's body is executed here
# Example of executing the original function logic after checks
# This part is conceptual for demonstration, actual Vyper handles this internally
# Let's assume some operation happens here...
# The following line is a placeholder for what the original function would return
# In a real scenario, the decorated function would return its specific value
return as_bytes32(0)
@external
@only_owner
def withdraw_funds():
# This function can only be called by the owner
# Placeholder for withdrawal logic
pass
์ด ์์์ `@only_owner` ์์ ์๋ ๊ณ์ฝ์ ๋ฐฐํฌํ ์ฃผ์(`self.owner`)๋ง์ด `withdraw_funds` ํจ์๋ฅผ ์คํํ ์ ์๋๋ก ๋ณด์ฅํฉ๋๋ค. ์ด ํจํด์ ๋ธ๋ก์ฒด์ธ์์ ๋ฏผ๊ฐํ ์์ ์ ๊ด๋ฆฌํ๋ ๋ฐ ์ค์ํฉ๋๋ค.
์ค๋งํธ ๊ณ์ฝ์ Python (Vyper) ์ฌ์ฉ์ ์ด์
์ค๋งํธ ๊ณ์ฝ ๊ฐ๋ฐ์ Vyper์ ๊ฐ์ Pythonic ๋๊ตฌ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๋ช ๊ฐ์ง ๋ถ๋ช ํ ์ด์ ์ ์ ๊ณตํฉ๋๋ค.
- ๋ฎ์ ์ง์ ์ฅ๋ฒฝ: ๋ฐฉ๋ํ ์ ์ธ๊ณ Python ๊ฐ๋ฐ์๋ค์๊ฒ Vyper๋ Solidity๋ฅผ ์ฒ์๋ถํฐ ๋ง์คํฐํ๋ ๊ฒ๋ณด๋ค ํจ์ฌ ๋ ์๋งํ ํ์ต ๊ณก์ ์ ์ ๊ณตํฉ๋๋ค. ์ด๋ ๋ธ๋ก์ฒด์ธ ๊ธฐ์ ์ฑํ์ ์๋นํ ๊ฐ์ํํ ์ ์์ต๋๋ค.
- ํฅ์๋ ๊ฐ๋ ์ฑ ๋ฐ ์ ์ง๋ณด์์ฑ: Python์ ๋ณธ์ง์ ์ธ ๊ฐ๋ ์ฑ์ ๋ ๋ช ํํ๊ณ ์ ์ง๋ณด์ํ๊ธฐ ์ฌ์ด ์ค๋งํธ ๊ณ์ฝ ์ฝ๋๋ก ์ด์ด์ง๋๋ค. ์ด๋ ์ฅ๊ธฐ์ ์ธ ํ๋ก์ ํธ ๊ด๋ฆฌ ๋ฐ ํ์ , ํนํ ๊ตญ์ ํ์์ ๋งค์ฐ ์ค์ํฉ๋๋ค.
- ๋น ๋ฅธ ํ๋กํ ํ์ดํ ๋ฐ ๊ฐ๋ฐ: Python์ ๊ด๋ฒ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ Vyper์ ๊ฐ๋ฐ์ ์นํ์ ์ธ ํน์ฑ์ ํ์ฉํ๋ฉด ๋ ๋น ๋ฅธ ๊ฐ๋ฐ ์ฃผ๊ธฐ์ dApp์ ๋ ๋น ๋ฅธ ํ๋กํ ํ์ดํ์ด ๊ฐ๋ฅํฉ๋๋ค.
- ๋ณด์ ์ค์ : Vyper์ ์ค๊ณ ์ ํ์ ๋ณด์๊ณผ ๊ฐ์ฌ ๊ฐ๋ฅ์ฑ์ ์ฐ์ ์ํ์ฌ ๊ฐ๋ฐ์๊ฐ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ ๊ฐ๋ ฅํ ๊ณ์ฝ์ ๊ตฌ์ถํ๋ ๋ฐ ๋์์ ์ค๋๋ค.
- ๋๊ตฌ ๋ฐ ํตํฉ: Python์ ์ฑ์ํ ์ํ๊ณ๋ ์ค๋งํธ ๊ณ์ฝ ํ ์คํธ, ๋๋ฒ๊น ๋ฐ ์ํธ ์์ฉ(์: Web3.py, Brownie)์ ์ํ ํ๋ฅญํ ๋๊ตฌ๋ฅผ ์ ๊ณตํ์ฌ ์ ์ฒด ๊ฐ๋ฐ ์ํฌํ๋ก์ฐ๋ฅผ ๊ฐ์ํํฉ๋๋ค.
๊ณผ์ ๋ฐ ๊ณ ๋ ค ์ฌํญ
์ฅ์ ์๋ ๋ถ๊ตฌํ๊ณ ์ค๋งํธ ๊ณ์ฝ์ Python์ ์ฌ์ฉํ๋ ๊ฒ์ ๋ค์๊ณผ ๊ฐ์ ๊ณผ์ ๋ ๋ฐ๋ฆ ๋๋ค.
- EVM์ ํ๊ณ: EVM ์์ฒด์๋ ํ๊ณ๊ฐ ์์ผ๋ฉฐ ์์ ๊ณผ ๊ด๋ จ๋ ํน์ ๊ฐ์ค ๋น์ฉ์ด ์์ต๋๋ค. ๊ฐ๋ฐ์๋ ์ฌ์ฉ๋๋ ๊ณ ๊ธ ์ธ์ด์ ๊ด๊ณ์์ด ์ด๋ฌํ ๋ฏธ๋ฌํ ์ฐจ์ด๋ฅผ ์ดํดํด์ผ ํฉ๋๋ค.
- Vyper์ ๊ธฐ๋ฅ ์ธํธ: Vyper์ ์ถ์๋ ๊ธฐ๋ฅ ์ธํธ๊ฐ ๋ณด์์ ๊ฐํํ์ง๋ง, Solidity์ ๋นํด ํน์ ๋ณต์กํ ํจํด์ด๋ ์ต์ ํ๋ฅผ ๋ ์ด๋ ต๊ฒ ๋ง๋ค ์ ์์ต๋๋ค. ๊ฐ๋ฐ์๋ ์ด๋ฌํ ์ ์ฝ ์กฐ๊ฑด์ ์ ์ํด์ผ ํฉ๋๋ค.
- ์ปค๋ฎค๋ํฐ ๋ฐ ์ฑํ: ์ฑ์ฅํ๊ณ ์์ง๋ง, Vyper ๋ฐ Python ์ค๋งํธ ๊ณ์ฝ ๊ฐ๋ฐ ์ปค๋ฎค๋ํฐ๋ Solidity๋ณด๋ค ์์ต๋๋ค. ์ด๋ ์ฌ์ ๊ตฌ์ถ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ, ์์ ๋ฐ ๊น์ ์ ๋ฌธ ์ง์์ ๊ฐ์ถ ๊ฐ๋ฐ์๊ฐ ๋ ์ ๋ค๋ ๊ฒ์ ์๋ฏธํ ์ ์์ต๋๋ค.
- ๋๊ตฌ ์ฑ์๋: ๋ธ๋ก์ฒด์ธ์ ์ํ Python ๋๊ตฌ๋ ํ๋ฅญํ์ง๋ง, Solidity์ ๋๊ตฌ ์ํ๊ณ(์: Hardhat, Truffle)๋ ๋ ์ฑ์ํ๊ณ ๋ ๋ง์ ์ฌ์ฉ์ ๊ธฐ๋ฐ์ ๊ฐ์ง๊ณ ์๋ค๊ณ ํ ์ ์์ต๋๋ค.
- ๊ฐ์ค ์ต์ ํ: ์ต์ ์ ๊ฐ์ค ํจ์จ์ฑ์ ๋ฌ์ฑํ๋ ๊ฒ์ ๋๋๋ก ๊ณ ๊ธ ์ธ์ด์์ ๋ ์ด๋ ค์ธ ์ ์์ต๋๋ค. ๊ฐ๋ฐ์๋ ํจ์จ์ ์ธ ์ฝ๋๋ฅผ ์์ฑํ๊ณ Vyper ์ฝ๋๊ฐ EVM ๋ฐ์ดํธ์ฝ๋๋ก ์ด๋ป๊ฒ ๋ณํ๋๋์ง ์ดํดํ๋ ๋ฐ ๋ถ์ง๋ฐํด์ผ ํฉ๋๋ค.
Python ์ค๋งํธ ๊ณ์ฝ์ ๋ฏธ๋
๋ธ๋ก์ฒด์ธ ๊ฐ๋ฐ ํ๊ฒฝ์ ๋์์์ด ์งํํ๊ณ ์์ต๋๋ค. ์ด๋ฌํ ์งํ์์ Python์ ์ญํ ์ ์ปค์ง ๊ฒ์ผ๋ก ์์๋ฉ๋๋ค.
- Vyper ์ฑํ ์ฆ๊ฐ: ๋ ๋ง์ ๊ฐ๋ฐ์๊ฐ Vyper์ ์ด์ ์ ๋ฐ๊ฒฌํจ์ ๋ฐ๋ผ ์ฑํ์ด ์ฆ๊ฐํ ๊ฒ์ผ๋ก ์์๋๋ฉฐ, ์ด๋ ๋ ํฐ ์ปค๋ฎค๋ํฐ์ ๋ ํ๋ถํ ๋๊ตฌ ๋ฐ ๋ฆฌ์์ค ์ํ๊ณ๋ก ์ด์ด์ง ๊ฒ์ ๋๋ค.
- ์ํธ ์ด์ฉ์ฑ: ๋ค์ํ ์ค๋งํธ ๊ณ์ฝ ์ธ์ด ๋ฐ ํ๋ซํผ ๊ฐ์ ์ํธ ์ด์ฉ์ฑ์ ๊ฐ์ ํ๊ธฐ ์ํ ๋ ธ๋ ฅ์ด ์งํ ์ค์ ๋๋ค. ์ด๋ Python ๊ธฐ๋ฐ ์ค๋งํธ ๊ณ์ฝ๊ณผ ๊ธฐ์กด Solidity ๊ธฐ๋ฐ ์์คํ ์ ๋ณด๋ค ์ํํ ํตํฉ์ผ๋ก ์ด์ด์ง ์ ์์ต๋๋ค.
- ๋ ์ด์ด 2 ์๋ฃจ์ : ๋ ์ด์ด 2 ํ์ฅ ์๋ฃจ์ ์ ๋ฑ์ฅ์ผ๋ก ์ค๋งํธ ๊ณ์ฝ ๋ฐฐํฌ ๋น์ฉ๊ณผ ๋ณต์ก์ฑ์ด ๊ฐ์ํ๊ณ ์์ต๋๋ค. ์ด๋ Pythonic ์ค๋งํธ ๊ณ์ฝ์ ๋ ๊ด๋ฒ์ํ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ ์ ๊ทผํ๊ธฐ ์ฝ๊ณ ์ค์ฉ์ ์ผ๋ก ๋ง๋ค ์ ์์ต๋๋ค.
- ๊ต์ก ๋ฐ ๋ฆฌ์์ค: ์ ์ธ๊ณ์ ์ผ๋ก ๋ธ๋ก์ฒด์ธ ๊ฐ๋ฐ์์ ๋ํ ์์๊ฐ ์ฆ๊ฐํจ์ ๋ฐ๋ผ Python ๊ธฐ๋ฐ ์ค๋งํธ ๊ณ์ฝ ๊ฐ๋ฐ์ ์ํ ๊ต์ก ๋ฆฌ์์ค๊ฐ ๋์ฑ ํ๋ถํด์ ธ ์ง์ ์ฅ๋ฒฝ์ ๋์ฑ ๋ฎ์ถ ๊ฒ์ ๋๋ค.
Python ์ค๋งํธ ๊ณ์ฝ ๊ฐ๋ฐ ์์ํ๊ธฐ
Python์ผ๋ก ์ค๋งํธ ๊ณ์ฝ ๊ตฌ์ถ์ ์์ํ ์ค๋น๊ฐ ๋์ จ์ต๋๊น? ๋ค์์ ๋ก๋๋งต์ ๋๋ค.
- Python ์ค์น: ์์คํ ์ ์ต์ ๋ฒ์ ์ Python์ด ์ค์น๋์ด ์๋์ง ํ์ธํ์ญ์์ค.
- Vyper ์ค์น: ๊ณต์ Vyper ๋ฌธ์๋ฅผ ๋ฐ๋ผ ์ปดํ์ผ๋ฌ๋ฅผ ์ค์นํ์ญ์์ค.
- ๊ฐ๋ฐ ํ๋ ์์ํฌ ์ค์น: ํ๋ก์ ํธ ๊ด๋ฆฌ, ํ ์คํธ ๋ฐ ๋ฐฐํฌ๋ฅผ ์ํด Brownie(๋๋ ApeWorX์ ๊ฐ์ ๋ค๋ฅธ ํ๋ ์์ํฌ)๋ฅผ ์ค์นํ์ญ์์ค. pip๋ฅผ ์ฌ์ฉํ์ญ์์ค: `pip install eth-brownie`.
- ๋ก์ปฌ ๋ธ๋ก์ฒด์ธ ์ค์ : ์ค์ ๊ฐ์ค ๋น์ฉ ์์ด ๋ก์ปฌ ๊ฐ๋ฐ ๋ฐ ํ ์คํธ๋ฅผ ์ํด Ganache ๋๋ Hardhat Network๋ฅผ ์ฌ์ฉํ์ญ์์ค.
- ์ฒซ ๋ฒ์งธ ๊ณ์ฝ ์์ฑ: ์ด์ ์ ๋ณด์ฌ์ค ํ ํฐ ๊ณ์ฝ๊ณผ ๊ฐ์ ๊ฐ๋จํ ์์๋ก ์์ํ์ฌ ์ ์ง์ ์ผ๋ก ๋ณต์ก์ฑ์ ๊ตฌ์ถํ์ญ์์คใ
- ์ฒ ์ ํ ํ ์คํธ: ๊ณ์ฝ์ ๋ชจ๋ ๊ธฐ๋ฅ์ ๋ํด ๊ด๋ฒ์ํ ํ ์คํธ๋ฅผ ์์ฑํ์ญ์์ค.
- ์ปค๋ฎค๋ํฐ์์ ๋ฐฐ์ฐ๊ธฐ: ์ง์ ๋ฐ ์ง์ ๊ณต์ ๋ฅผ ์ํด Vyper ๋ฐ Brownie ์ปค๋ฎค๋ํฐ์ ์ฐธ์ฌํ์ญ์์ค.
- Web3.py ํ์: Web3.py๋ฅผ ์ฌ์ฉํ์ฌ Python ์ ํ๋ฆฌ์ผ์ด์ ์์ ๋ฐฐํฌ๋ ๊ณ์ฝ๊ณผ ์ํธ ์์ฉํ๋ ๋ฐฉ๋ฒ์ ์ดํดํ์ญ์์ค.
๊ฒฐ๋ก
Python์ ์ ๊ทผ ๊ฐ๋ฅํ ๊ตฌ๋ฌธ๊ณผ ๊ฐ๋ ฅํ ์ํ๊ณ๋ฅผ ํตํด ์ค๋งํธ ๊ณ์ฝ ๊ฐ๋ฐ ์ธ๊ณ์์ ์ค์ํ ์์น๋ฅผ ์ฐจ์งํ๊ณ ์์ต๋๋ค. Vyper์ ๊ฐ์ ์ธ์ด์ Brownie์ ๊ฐ์ ๊ฐ๋ ฅํ ๊ฐ๋ฐ ํ๋ ์์ํฌ๋ฅผ ํตํด Python ๊ฐ๋ฐ์๋ ์ด์ ์ด๋๋ฆฌ์ ๊ฐ์ ๋จธ์ ์ ์ค๋งํธ ๊ณ์ฝ์ ์์ ์๊ฒ ๊ตฌ์ถ, ํ ์คํธ ๋ฐ ๋ฐฐํฌํ ์ ์์ต๋๋ค. ์ฌ์ ํ ๊ณผ์ ๊ฐ ๋จ์ ์์ง๋ง, ๊ฐ๋ฐ ์์ฐ์ฑ ์ฆ๊ฐ, ๊ฐ๋ ์ฑ ํฅ์, ๋ฎ์ ์ง์ ์ฅ๋ฒฝ ๋ฑ์ ์ด์ ์ Python์ ํ์ค์ํ ์ ํ๋ฆฌ์ผ์ด์ ๊ฐ๋ฐ์ ๋ฏธ๋๋ฅผ ์ํ ๋งค๋ ฅ์ ์ธ ์ ํ์ผ๋ก ๋ง๋ญ๋๋ค. ์ด๋ฌํ ๋๊ตฌ์ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ์์ฉํจ์ผ๋ก์จ ์ ์ธ๊ณ ๊ฐ๋ฐ์๋ค์ ๊ธ์ฑ์ฅํ๋ Web3 ์ํ๊ณ์ ๊ธฐ์ฌํ๊ณ ํ์ค์ํ๋ ๋ฏธ๋๋ฅผ ์ํ ์๋ก์ด ๊ฐ๋ฅ์ฑ์ ์ด ์ ์์ต๋๋ค.
๋ธ๋ก์ฒด์ธ ๊ธฐ์ ์ ๊ธ๋ก๋ฒ ํน์ฑ์ ํ์ ๊ณผ ์ฌ์ฉ ํธ์์ฑ์ ์ด์งํ๋ ๋๊ตฌ์ ์ธ์ด๊ฐ ์์ฐ์ค๋ฝ๊ฒ ์ค์์ฑ์ ์ป์ ๊ฒ์์ ์๋ฏธํฉ๋๋ค. Python์ ๋ณดํธ์ ์ธ ๋งค๋ ฅ์ผ๋ก ์ฐจ์ธ๋ ์ค๋งํธ ๊ณ์ฝ ๋ฐ ํ์ค์ํ ํ์ ์ ํ์ฑํ๋ ๋ฐ ๋ ํฐ ์ญํ ์ ํ ์ ์๋ ์๋ฒฝํ ์์น์ ์์ต๋๋ค.