ERC20 چیست؟
حتما شما هم بارها نام توکنهای ERC20 را شنیدهاید. استاندارد ERC20 مخصوص توکنهایی است که از بلاک چین اتریوم به عنوان بستر ارزی خود استفاده میکنند. ۹۹% از توکنهای اتریوم دارای استاندارد ERC20 هستند. این استاندارد مخصوص توسعه دهندگانی است که هنوز بلاک چین خود را ایجاد نکردهاند و با ایجاد یک توکن ECR20 بر روی بلاک چین اتریوم قصد دارند تا با انجام یک ICO پروژههای خود را تامین مالی کنند. در این مقاله به بررسی و معرفی مفهوم این استاندارد برنامهنویسی میپردازیم.
حتما شما هم بارها نام توکنهای ERC20 را شنیدهاید. استاندارد ERC20 مخصوص توکنهایی است که از بلاک چین اتریوم به عنوان بستر ارزی خود استفاده میکنند. ۹۹% از توکنهای اتریوم دارای استاندارد ERC20 هستند. این استاندارد مخصوص توسعه دهندگانی است که هنوز بلاک چین خود را ایجاد نکردهاند و با ایجاد یک توکن ECR20 بر روی بلاک چین اتریوم قصد دارند تا با انجام یک ICO پروژههای خود را تامین مالی کنند. در این مقاله سعی شده است تا مفهوم این استاندارد برنامهنویسی معرفیشود.
- چگونه ERC20 بخریم؟
- ERC20 چگونه عمل میکند؟
- توکن ERC20 چیست؟
در نگارش این مقاله فرض شده که خواننده پیش از این حداقل با مفاهیمی همچون بلاک چین های اتریوم، اپلیکیشنهای غیرمتمرکز (dapps )، اتر(ether)، قراردادهای هوشمند و ICO ها آشنا شده است.
برای اینکه سریع به سراغ اصل مطلب برویم باید گفت، اتریوم یک پلتفرم محاسباتی توزیع شده متن باز (open-source) و مبتنی بر بلاک چین است. این پلتفرم محاسباتی، یعنی همان شبکه اتریوم، میزبان نرم افزارهای غیرمتمرکز (dapps) است که با هزاران خط کد اجرا می شوند؛ نام این کدها قراردادهای هوشمند است، تمام معاملات در شبکه اتریوم با ارز رمزنگاری شده اتریوم یعنی همان اتر انجام میشوند، و هچنین هزینههای محاسباتی اجرای قراردادهای هوشمند نیز با اتر پرداخت میشوند.
بعضی از این نرم افزارهای غیرمتمرکز نیاز به یک ارز درون نرم افزاری (in-dapp) اضافی دارند. نرم افزارهای غیرمتمرکز جدید، ارز منحصر به فرد خود را با نام توکن (token) معرفی میکنند و از طریق ارائه و فروش اولیه سکه (ICO) منابع مالی را ایجاد میکنند.
پلتفرم بلاک چین اتریوم به روشی ساخته شده است که تمام انواع نرم افزارهای های غیرمتمرکز را از جمله آنهایی که نیاز به ایجاد، نگهداری و انتقال دارایی های دیجیتال دارند، در درون خود پرورش میدهند. این توکنهای ویژه و درون-نرم افزاری اتریوم، برای ایجاد یک شبکه از نرم افزارهای غیرمتمرکز به کار گرفته میشوند. از این نرم افزارها برای ثبت صورتحساب تراکنش ها، پرداختهای درون مرورگر و کارتهای اعتباری رمز ارز استفاده میشود.
تمامی ایده هایی که در اینجا ذکر شدند، به تحقق پیوستهاند و همان توکنهای دروننرم افزاری غیرمتمرکز اتریوم هستند که از یک استاندارد برنامه نویسی بسیار معمول استفاده میکنند. در واقع، ۹۹ درصد از تمام توکنهای اتریوم که به کار بسته شدهاند، از همین استاندارد یعنی استاندارد ERC20 پیروی میکنند.
استاندارد توکن ERC20 که حروف اول کلمات Ethereum Requests for Comment (درخواستهای اتریوم برای نظرخواهی) را تشکیل میدهد، یک مجموعه استاندارد از قوانین برنامه نویسی است که انتظار میرود کلیه توکنهای مبتنی بر اتریوم آن را دنبال کنند. توسعهدهندگان در مورد این شش تابع و دو رویداد توافق کردند که به عنوان حداقل توکن قابل قبول برای استاندارد سازی رفتارهای مورد انتظار، در هنگام برقراری ارتباط در شبکه اتریوم در نظر گرفته میشوند. با ایجاد این پروتکل، توسعه دهندگان اتریوم به راحتی قادرند تا با قراردادهای هوشمند خارج از شبکه کار کنند.
معرفی Solidity (زبان اختصاصی اتریوم)
در حالی که کدهای محبوبترین کلاینت اتریوم در حال حاضر به زبان GO گوگل نوشته شده است، گزینههای زیادی برای انتخاب یک زبان مناسب هر توسعهدهنده، برای نوشتن کدهای قرارداد هوشمند وجود دارد. توسعهدهندگان میتوانند از میان زبان هایی مانند Vyper، Bamboo، Serpent و Solidity یکی را انتخاب کنند.
Solidity یک زبان برنامه نویسی قرارداد-محور سطح بالا است که برای اجرای قراردادهای هوشمند استفاده میشود. سینتکس Solidity، برای افرادی که با برنامه نویسی آشنا هستند، مخلوطی از مفاهیم مورد استفاده در Javascript، Python و Cاست؛ یکی از انواع آن که به صورت استاتیک تایپ شده است، از قابلیت وراثت پشتیبانی میکند و از همان ابتدا دارای یک کتابخانه است.
پیادهسازی گام به گام رابط ERC20
ما قصد داریم تا کمی ژرفتر به چیستی این استاندارد بپردازیم و ببینیم که چگونه این استاندارد در شبکه اتریوم اجرا میشود. همان طور که قبلا ذکر شد، ما این موضوع را به طور خاص در سینتکس Solidity پوشش خواهیم داد.
در قلمرو و سرزمین اتریوم، همه چیز با قرارداد شروع و پایان مییابد. اسناد Solidity قراردادها را به عنوان “مجموعه ای از کد (توابع آن) و دادهها (حالت آن) که در یک آدرس خاص در بلاک چین اتریوم قرار دارند” تعریف میکند. قراردادهای اتریوم از قابلیت وراثت پشتیبانی میکنند، بنابراین هر قرارداد میتواند نمونهای از قرارداد دیگر باشد.
با پیروی از این منطق، یک قرارداد انتزاعی، که موکداً برای قابلیت وراثت مورد استفاده قرار می گیرد، همچنین با تعریف آنچه قرارداد جدید باید برای کامپایل کردن داشته باشد، میتواند به عنوان یک ضامن (failsafe) مورد استفاده قرار گیرد. این قراردادهای انتزاعی نیز به عنوان قراردادهای رابط (interface contract) شناخته میشوند.
این به آن معنی است که هر قرارداد توکن که یک نمونه ERC20 است بدون موارد زیر کامپایل نمیشود؛ به این معنی که توسعهدهندگان اتریوم اکنون میدانند که انتظار چه عملکرد و رفتارهایی را میتوانند در هنگام تعامل با هر توکن ERC20 داشته باشند.
استاندارد ERC20 یک قرارداد رابط است که شامل مجموعهای از ۶ تابع اجرایی و دو رویداد لاگینگ (logging) به سیستم است.
خرجی
تابع خرجی (Allowance) برای دو آدرس امکان انتقالهای یکسویه را فراهم میکند. این آدرسها عبارت از آدرس کیف پول صاحب توکن و آدرس کیف پول خریدار هستند که در تراکنش ها و معاملات تکراری شرکت خواهند داشت. به ویژه، کیف پول خریدار ،مبلغی را از کیف پول صاحب توکن در بعضی فواصل برداشت خواهد نمود. هر دوی اینها متغیرهایی هستند که بعدها تعیین خواهند شد.
تایید
برای تابع تایید (approve)، به تابع خرجی مراجعه میشود: این تابع این امکان را برای دو آدرس فراهم میسازد که مکررا و به صورت یکسویه وجه برداشت کنند. تابع تأیید، یک تابع استاندارد ساده است که صاحب کیف پول را به عنوان مرجع تأیید یک تراکنش میشناسد، تراکنشی که به زودی به نام او در بستر تابع خرجی انجام خواهد شد. این تابع به دو ورودی، یعنی آدرس خریدار (spender) و مقدار توکنهای ارسالی نیاز دارد. خروجی این تابع یک مقدار منطقی (boolean) است که این موضوع را بیان می کند که آیا قرارداد تایید شده است یا خیر.
موجودی
تابع موجودی (balanceOf) یک تابع شهودی است که پارامتر ورودی آن یک آدرس (آدرس صاحب توکن) است و خروجی آن یک ثابت عمومی واحد (موجودی uint ) است. موجودی ثابت دارای واحدی است که به عنوان خروجی بازگردانده میشود و نشاندهنده مقدار توکنهایی است که در آدرس مورد نظر نگهداری میشود. به یاد داشته باشید، تراکنشها در یک بلاک چین معمولا عمومی اتفاق میافتند و سیستم اتریوم نیز به همین حالت است.
عرضه کل
تابع عرضه کل (TotalSupply)، همان طور که احتمالا از نام آن می توانید حدس بزنید، یک تابع سازنده ناشناس است که تنها در زمان اولین بکارگیری در شبکه در حال کار اتریوم اجرا میشود. خروجی تابع یک عدد ثابت عمومی یعنی همان عرضه کل است که عددی صحیح و نامشخص است که به عنوان عرضه کلی توکنها در ادامه عمر این قراردادها عمل میکند. ثابت عرضه کل معمولا به یکی از دو روش هاردکدینگ (hardcoding) یک متغیر یا تامین بودجه از یک کیف پول تعریف میشود.
انتقال
تابع انتقال ، تابع اصلی هر توکن ERC20 است؛ این تابع این توکن را تعریف میکند و عمل انتقال از کیف پول صاحب توکن به شخص را انجام میدهد. از آنجایی که این درخواست از طرف صاحبان کیف پول است، فقط دو پارامتر مورد نیاز است: آدرس گیرنده و مقدار توکن های ارسالی. این دو پارامتر معمولا به عنوان (آدرس گیرنده) و (توکن های uint ) شروع به کار میکنند. خروجی تابع انتقال یک پارامتر منطقی ساده است که تأیید می کند که آیا گیرنده (آدرس گیرنده) توکن ارسال شده را دریافت کرده است یا خیر.
انتقالی
تابع انتقالی (TransferFrom) این امکان را برای یک قرارداد هوشمند فراهم میکند تا یک انتقال به نام صاحب کیف پول صورت گیرد. این تابع کاملا با تابع انتقال پیشین متفاوت است. تابع قبلی این امکان را فراهم میساخت که صاحب کیف پول به طور مستقیم توکنها را به آدرس ارسال کند؛ تابع انتقالی این امکان را برای یک قرارداد هوشمند فراهم میکند تا مثلاً با ایجاد پیشنهاد معاملاتی در یک صرافی و یا پرداخت جوایز برندگان یک بازی شانسی؛ توکنهای در نظرگرفته شده به نام صاحب کیف پول ارسال شوند.
تابع انتقالی دارای سه پارامتر ورودی، یعنی آدرس کیف پول صاحب توکن، آدرس کیف پول گیرنده، و مقدار توکنهای ارسالی میباشد. آنها اغلب به نحو زیر به کار می روند: (آدرس فرستنده، آدرس گیرنده، مبلغ واحد توکنها). خروجی این تابع دقیقا شبیه به خروجی تابع انتقال است که از یک مقدار منطقی عمومی و واحد تشکیل شده است که موفقیت یا شکست تراکنش را با جزییات مشخص میکند.
شش تابع مشخص شده در بالا، شش تابع اصلی موجود در ۹۹٪ از تمام توکن های ERC20 رایج هستند. با چند استثناء، توابع اصلی در هنگام ایجاد قراردادهای داخلی یا در تعامل با قراردادهای عمومی خارجی به طور کامل وجود دارند و توسعهدهندگان اتریوم با دانستن این موضوع، احساس امنیت خواهند کرد.