استاندارد توکن ERC-20
آخرین ویرایش: @Bijan_F(opens in a new tab), ۲۲ خرداد ۱۴۰۳
معرفی
توکن چیست؟
توکن ها میتوانند هرچیزی را بصورت مجازی در اتریوم ارائه دهند:
- امتیاز شهرت در یک پلتفرم آنلاین
- مهارت های یک کاراکتر در یک بازی
- دارایی های اقتصادی مانند سهام یک شرکت
- یک ارز فیات مانند دلار
- یک اونس طلا
- و موارد دیگر...
این نوع ویژگی قدرتمند اتریوم باید با یک استاندارد قوی اداره شود، اینطور نیست؟ این دقیقا همان جایی است که ERC-20 نقش خودش را اجرا میکند! این استانداردها به توسعه دهندگان این امکان را می دهد تا توکن اپلیکیشن هایی که با سایر محصولات و خدمات سازگار هستند را بسازند. همچنین این استاندارد عملکرد اضافهتری را برای اتر (واحد ارز داخلی اتریم یا ETH) فراهم میکند.
ERC-20 چیست؟
ERC-20 استانداردی را برای توکنهای تعویض پذیر معرفی می کند، به عبارت دیگر، آنها دارای خاصیتی هستند که باعث می شود هر توکن دقیقاً مشابه (از نظر نوع و مقدار) با توکن دیگر باشد. برای مثال توکن های ERC-20 دقیقا مثل اتر رفتار میکنند. به این معنی که 1 توکن همیشه با دیگر توکن ها برابر بوده و خواهد بود.
پیش نیاز ها
ساختار
مفهوم توکن ERC-20 یا درخواست اتریوم برای نظرات 20 توسط فابیان ووگلستلر در نوامبر 2015 به عنوان استاندارد توکنی بیان شد که یک API برای توکن های قراردادهای هوشمند ارایه میکند.
نمونه هایی از عملکردهای ERC-20 عبارتند از:
- انتقال توکن ها از یک حساب به حساب دیگر
- دریافت موجودی توکن یک حساب
- دریافت کل عرضه توکن موجود در شبکه
- تایید این که آیا مقداری توکن از یک حساب میتواند توسط یک حساب شخص ثالث خرج شود یا خیر
اگر یک قرارداد هوشمند روشها و رویدادهای زیر را اجرا کند، میتوان آن را یک قرارداد توکن تعویض ناپذیر ERC-20 نامید و پس از استقرار، مسئولیت پیگیری توکنهای ایجاد شده در اتریوم را بر عهده خواهد داشت.
از EIP-20(opens in a new tab):
روشها
1function name() public view returns (string)2function symbol() public view returns (string)3function decimals() public view returns (uint8)4function totalSupply() public view returns (uint256)5function balanceOf(address _owner) public view returns (uint256 balance)6function transfer(address _to, uint256 _value) public returns (bool success)7function transferFrom(address _from, address _to, uint256 _value) public returns (bool success)8function approve(address _spender, uint256 _value) public returns (bool success)9function allowance(address _owner, address _spender) public view returns (uint256 remaining)نمایش همهکپی
رویدادها
1event Transfer(address indexed _from, address indexed _to, uint256 _value)2event Approval(address indexed _owner, address indexed _spender, uint256 _value)کپی
مثالها
بیایید ببینیم سادگی یک استاندارد چقدر مهم است تا باعث شود هر گونه قرارداد توکن ERC-20 را در اتریوم بازرسی کنیم. ما برای ایجاد یک رابط در هر توکن ERC-20، فقط به رابط دوتایی برنامه قرارداد (ABI) نیاز داریم. همانطور که در زیر می بینید ما از یک ABI ساده شده استفاده می کنیم تا آن را به مثال قابل هضمی تبدیل کنیم.
مثال Web3.py
ابتدا مطمئن شوید که کتابخانه پایتون Web3.py(opens in a new tab) را نصب کرده اید:
1pip install web3
1from web3 import Web3234w3 = Web3(Web3.HTTPProvider("https://cloudflare-eth.com"))56dai_token_addr = "0x6B175474E89094C44Da98b954EedeAC495271d0F" # DAI7weth_token_addr = "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2" # Wrapped ether (WETH)89acc_address = "0xA478c2975Ab1Ea89e8196811F51A7B7Ade33eB11" # Uniswap V2: DAI 21011# This is a simplified Contract Application Binary Interface (ABI) of an ERC-20 Token Contract.12# It will expose only the methods: balanceOf(address), decimals(), symbol() and totalSupply()13simplified_abi = [14 {15 'inputs': [{'internalType': 'address', 'name': 'account', 'type': 'address'}],16 'name': 'balanceOf',17 'outputs': [{'internalType': 'uint256', 'name': '', 'type': 'uint256'}],18 'stateMutability': 'view', 'type': 'function', 'constant': True19 },20 {21 'inputs': [],22 'name': 'decimals',23 'outputs': [{'internalType': 'uint8', 'name': '', 'type': 'uint8'}],24 'stateMutability': 'view', 'type': 'function', 'constant': True25 },26 {27 'inputs': [],28 'name': 'symbol',29 'outputs': [{'internalType': 'string', 'name': '', 'type': 'string'}],30 'stateMutability': 'view', 'type': 'function', 'constant': True31 },32 {33 'inputs': [],34 'name': 'totalSupply',35 'outputs': [{'internalType': 'uint256', 'name': '', 'type': 'uint256'}],36 'stateMutability': 'view', 'type': 'function', 'constant': True37 }38]3940dai_contract = w3.eth.contract(address=w3.to_checksum_address(dai_token_addr), abi=simplified_abi)41symbol = dai_contract.functions.symbol().call()42decimals = dai_contract.functions.decimals().call()43totalSupply = dai_contract.functions.totalSupply().call() / 10**decimals44addr_balance = dai_contract.functions.balanceOf(acc_address).call() / 10**decimals4546# DAI47print("===== %s =====" % symbol)48print("Total Supply:", totalSupply)49print("Addr Balance:", addr_balance)5051weth_contract = w3.eth.contract(address=w3.to_checksum_address(weth_token_addr), abi=simplified_abi)52symbol = weth_contract.functions.symbol().call()53decimals = weth_contract.functions.decimals().call()54totalSupply = weth_contract.functions.totalSupply().call() / 10**decimals55addr_balance = weth_contract.functions.balanceOf(acc_address).call() / 10**decimals5657# WETH58print("===== %s =====" % symbol)59print("Total Supply:", totalSupply)60print("Addr Balance:", addr_balance)نمایش همهکپی
مشکلات شناخته شده
مشکل دریافت توکن ERC-20
هنگامی که توکنهای ERC-20 به یک قرارداد هوشمند ارسال میشوند که برای مدیریت توکنهای ERC-20 طراحی نشده است، توکنها برای همیشه از دست خواهند رفت. این زمانی اتفاق میافتد که قرارداد هوشمند گیرنده، عملکرد لازم برای شناسایی یا پاسخ به توکنهای دریافتی را ندارد و هیچ مکانیزمی در استاندارد ERC-20 وجود ندارد که قرارداد دریافت کننده را از توکنهای دریافتی مطلع کند. راههای اصلی شکلگیری این موضوع:
- مکانیسم انتقال توکن
- توکنهای ERC-20 با استفاده از تابع transfer یا transferFrom انتقال مییابند
- هنگامی که کاربر با استفاده از این توابع، توکنها را به آدرس یک قرارداد هوشمند ارسال میکند، توکنها بدون در نظر گرفتن این که آیا قرارداد دریافت کننده برای رسیدگی به آنها طراحی شده است یا خیر، انتقال خواهند یافت
- عدم اطلاع رسانی
- قرارداد دریافتکننده اعلان یا تماسی مبنی بر ارسال توکن به آن دریافت نمیکند
- اگر قرارداد دریافتکننده مکانیزمی برای مدیریت توکنها نداشته باشد (به عنوان مثال، یک تابع بازگشتی یا یک تابع اختصاصی برای مدیریت دریافت توکن)، توکنها به طور مؤثر در آدرس قرارداد گیر میکنند
- بدون مدیریت داخلی
- استاندارد ERC-20 دارای یک تابع اجباری برای اجرای دریافت قراردادها نیست، که این امر منجر به وضعیتی میشود که بسیاری از قراردادها قادر به مدیریت صحیح توکنهای دریافتی نیستند
برخی استانداردهای جایگزین بر این مشکل فائق آمدهاند، مانند ERC-223
اطلاعات بیشتر
- EIP-20: استاندارد توکن ERC-20(opens in a new tab)
- OpenZeppelin - توکن ها(opens in a new tab)
- OpenZeppelin - پیادهسازی ERC-20(opens in a new tab)
- Alchemy - راهنمایی برای توکنهای ERC-20 نوشته شده با Solidity(opens in a new tab)