Vyper چیست؟ آموزش کامل و جامع Vyper
فهرست مطالب
Vyper چیست؟
Vyper یک زبان برنامهنویسی قرارداد هوشمند است که برای پلتفرم اتریوم طراحی شده است. این زبان با تمرکز بر امنیت و سادگی، جایگزینی امنتر برای Solidity ارائه میدهد.
# @version ^0.3.7
struct Token:
name: String[64]
symbol: String[32]
total_supply: uint256
token: public(Token)
@external
def __init__():
self.token.name = "MyToken"
self.token.symbol = "MTK"
self.token.total_supply = 1000000
تاریخچه Vyper
Vyper در سال 2017 توسط تیم توسعه اتریوم به عنوان جایگزینی برای Solidity معرفی شد. هدف اصلی آن، ارائه زبانی سادهتر و امنتر برای نوشتن قراردادهای هوشمند بود.
ساختار پایه Vyper
یک قرارداد Vyper از چندین بخش اصلی تشکیل شده است که شامل تعریف نسخه، متغیرهای حالت، رویدادها و توابع میشود.
# @version ^0.3.7
# تعریف رویداد
event TokenTransfer:
sender: indexed(address)
receiver: indexed(address)
amount: uint256
# متغیرهای حالت
total_supply: public(uint256)
balances: public(HashMap[address, uint256])
owner: public(address)
# تابع سازنده
@external
def __init__():
self.total_supply = 1000000
self.owner = msg.sender
self.balances[msg.sender] = self.total_supply
# توابع عمومی
@external
def transfer(_to: address, _amount: uint256) -> bool:
assert self.balances[msg.sender] >= _amount, "Insufficient balance"
self.balances[msg.sender] -= _amount
self.balances[_to] += _amount
log TokenTransfer(msg.sender, _to, _amount)
return True
ویژگیهای Vyper
۱. امنیت بالا
Vyper با حذف ویژگیهای خطرناک و مبهم، امنیت را در اولویت قرار میدهد.
۲. خوانایی کد
سینتکس ساده و شبیه به Python باعث خوانایی بیشتر کد میشود.
۳. قابلیت حسابرسی
ساختار ساده کد امکان حسابرسی و بررسی امنیتی را آسانتر میکند.
مقایسه Vyper با Solidity
تفاوتهای اصلی بین Vyper و Solidity:
# Vyper
@external
def transfer(_to: address, _value: uint256) -> bool:
self.balanceOf[msg.sender] -= _value
self.balanceOf[_to] += _value
return True
// Solidity
function transfer(address _to, uint256 _value) public returns (bool) {
balanceOf[msg.sender] -= _value;
balanceOf[_to] += _value;
return true;
}
قراردادهای هوشمند در Vyper
نوشتن قراردادهای هوشمند در Vyper با تمرکز بر امنیت و سادگی انجام میشود.
# @version ^0.3.7
from vyper.interfaces import ERC20
implements: ERC20
event Transfer:
sender: indexed(address)
receiver: indexed(address)
value: uint256
name: public(String[32])
symbol: public(String[32])
decimals: public(uint8)
totalSupply: public(uint256)
balanceOf: public(HashMap[address, uint256])
allowance: public(HashMap[address, HashMap[address, uint256]])
@external
def __init__(_name: String[32], _symbol: String[32], _decimals: uint8, _supply: uint256):
self.name = _name
self.symbol = _symbol
self.decimals = _decimals
self.totalSupply = _supply
self.balanceOf[msg.sender] = _supply
امنیت در Vyper
Vyper با تمرکز بر امنیت طراحی شده و از چندین مکانیزم برای جلوگیری از آسیبپذیریها استفاده میکند:
۱. جلوگیری از سرریز عددی
Vyper به طور خودکار از سرریز اعداد جلوگیری میکند.
۲. محدودیت حلقهها
برای جلوگیری از حملات حلقه بینهایت، تعداد تکرار حلقهها باید مشخص باشد.
انواع داده در Vyper
Vyper انواع داده متنوعی را برای نوشتن قراردادهای هوشمند ارائه میدهد:
# انواع داده اصلی
bool_var: bool
int_var: int128
uint_var: uint256
decimal_var: decimal
address_var: address
bytes32_var: bytes32
# ساختارهای داده
struct Person:
name: String[100]
age: uint256
# آرایهها و نگاشتها
numbers: uint256[10]
balances: HashMap[address, uint256]
توابع در Vyper
توابع در Vyper نقش مهمی در تعامل با قرارداد هوشمند دارند. انواع مختلف توابع با دکوراتورهای متفاوت مشخص میشوند.
# @version ^0.3.7
# متغیرهای حالت
balance: public(HashMap[address, uint256])
# تابع خارجی (قابل فراخوانی از بیرون قرارداد)
@external
def deposit():
self.balance[msg.sender] += msg.value
# تابع view (فقط خواندنی، بدون تغییر حالت)
@view
@external
def get_balance(account: address) -> uint256:
return self.balance[account]
# تابع pure (بدون دسترسی به حالت)
@pure
@external
def calculate_fee(_amount: uint256) -> uint256:
return _amount * 3 / 100
# تابع داخلی (فقط قابل فراخوانی از داخل قرارداد)
@internal
def _update_balance(_account: address, _amount: uint256):
self.balance[_account] = _amount
بهترین شیوههای کدنویسی Vyper
۱. امنیت
همیشه از بررسیهای امنیتی و assert برای اعتبارسنجی ورودیها استفاده کنید:
@external
def withdraw(_amount: uint256):
assert _amount > 0, "Amount must be positive"
assert self.balance[msg.sender] >= _amount, "Insufficient balance"
self.balance[msg.sender] -= _amount
send(_amount)
۲. بهینهسازی گاز
برای کاهش هزینههای تراکنش:
- از متغیرهای موقت برای کاهش دسترسی به storage استفاده کنید
- از تایپهای مناسب برای ذخیرهسازی اعداد استفاده کنید
- عملیاتهای غیرضروری را حذف کنید
۳. مستندسازی
کد را با توضیحات مناسب مستند کنید:
# @notice تابع انتقال توکن بین دو آدرس
# @param _to آدرس گیرنده
# @param _amount مقدار توکن
# @return موفقیت عملیات
@external
def transfer(_to: address, _amount: uint256) -> bool:
"""
انتقال توکن به آدرس مشخص شده
هشدار: قبل از فراخوانی، موجودی کافی را بررسی کنید
"""
assert not self.is_contract(_to), "Cannot transfer to a contract"
self._do_transfer(msg.sender, _to, _amount)
return True
استقرار قراردادهای Vyper
برای استقرار قراردادهای Vyper میتوانید از ابزارهای مختلفی استفاده کنید:
۱. استفاده از Brownie
# نصب Brownie
pip install eth-brownie
# ایجاد پروژه جدید
brownie init
# کامپایل و استقرار
brownie compile
brownie run scripts/deploy.py
۲. استفاده از Remix
Remix IDE از Vyper پشتیبانی میکند و میتوانید با نصب پلاگین Vyper، قراردادها را مستقیماً استقرار کنید.
ابزارهای مفید برای کار با Vyper
۱. محیطهای توسعه
- Remix IDE با پلاگین Vyper
- Visual Studio Code با افزونه Vyper
- PyCharm با پشتیبانی Python
۲. فریمورکها و ابزارها
- Brownie – فریمورک تست و استقرار
- Web3.py – کتابخانه تعامل با بلاکچین
- Vyper Online Compiler – کامپایلر آنلاین
۳. ابزارهای تست و دیباگ
- Ganache – بلاکچین محلی برای تست
- pytest – فریمورک تست در Python
- eth-tester – کتابخانه تست قراردادهای هوشمند