در سالهای اخیر، مشخصات رمز ERC20 به استاندارد دفاعی توکنهای Ethereum تبدیل شده است. به عبارت دیگر، بیشتر قراردادهای Ethereum سازگار با ERC20 هستند. این مقاله به طور دقیق آموزش ساخت توکن ERC20 در شبکه بلاکچین اتریوم را توضیح میدهد، اما قبل از شروع کار، نگاهی دقیقتر به استاندارد ERC20 میاندازیم.
چه عاملی باعث جذابیت و موفقیت توکنهای ERC20 میشود؟
عوامل مختلفی وجود دارد، همانطور که در این مقاله آموزشی مشاهده خواهید کرد، ایجاد توکنهای ERC20 ساده و آسان است.
استاندارد ERC20 یک مشکل قابل توجه را حل میکند: بازارهای مبتنی بر بلاکچین و کیف پولهای رمزنگاری برای برقراری ارتباط با توکنها، به یک دستورالعمل واحد و استاندارد نیاز دارند که شامل قوانین تعامل بین توکنهای مختلف و همچنین قوانین خرید توکن است.
دقیقاً مانند سایر توکنهای Ethereum، توکنهای ERC20 نیز به صورت قراردادهای هوشمند پیاده سازی میشوند و به صورت غیر متمرکز بر روی دستگاه مجازی Ethereum (EVM) اجرا میشوند.
Solidity: زبان برنامه نویسی قرارداد هوشمند
قراردادهای هوشمند Ethereum به صورت Solidid نوشته شده است. در حالی که زبان های مناسبتر و جایگزین برای این زبان برنامه نویسی وجود دارد، همچنان این زبان پر کاربردترین است. زبان Solidity مشابه JavaScript است، بنابراین اگر شما از JavaScript، یا حتی جاوا و سایر زبانهای C دانشی دارید، هیچ مشکلی برای فهمیدن اینکه چه اطلاعاتی در یک قطعه Solidid وجود دارد، حتی بدون داشتن اطلاعات کافی از زبان Solidid نخواهید داشت.
اینجا بخش جذاب شروع میشود، باید بتوانید در یک فرصت کم یک قرارداد ساده ERC20 را شروع به کدنویسی کنید. یک کار ساده است، به اندازه کافی ساده که این مقاله نشان میدهد چگونه میتوانید در کمتر از یک ساعت توکن ERC20 را بنویسید و در جای مخصوص آن قرار دهید.
آموزش ساخت توکن ERC20 | بررسی اجمالی استاندارد ERC20 Token
ERC20 چیست؟ به بیان ساده، استاندارد ERC20 مجموعهای از توابع را تعریف میکند که باید توسط همه توکنهای ERC20 اجرا شود تا امکان ادغام با سایر قراردادها، کیف پولها یا بازارها را فراهم کند. این مجموعه از توابع نسبتاً کوتاه و اساسی است.
function totalSupply() public view returns (uint256); function balanceOf(address tokenOwner) public view returns (uint); function allowance(address tokenOwner, address spender) public view returns (uint); function transfer(address to, uint tokens) public returns (bool); function approve(address spender, uint tokens) public returns (bool); function transferFrom(address from, address to, uint tokens) public returns (bool);
توابع ERC20 به یک کاربر اجازه میدهد توسط یک برنامه کیف پول رمزنگاری، از موجودی کاربر مطلع شود و با مجوز مناسب وجوه را از یک کاربر به کاربر دیگر انتقال دهد.
قرارداد هوشمند دو واقعه مشخص را تعریف میکند:
event Approval(address indexed tokenOwner, address indexed spender, uint tokens); event Transfer(address indexed from, address indexed to, uint tokens);
وقتی به کاربر اجازه داده شود توکن از حساب او خارج شود، پس از انتقال این رویدادها فراخوانی میشوند.
علاوه بر توابع استاندارد ERC20، بسیاری از توکنهای ERC20 دارای زمینههای اضافی هستند و برخی از آنها عملاً به بخشی از استاندارد ERC20 تبدیل شدهاند. در اینجا چند نمونه از این زمینه ها آورده شده است.
string public constant name; string public constant symbol; uint8 public constant decimals;
در اینجا چند نکته در مورد نامگذاری ERC20 و Solidity آورده شده است:
- view در اصل یعنی وضعیت داخلی قرارداد با عملکرد تغییر نمیکند
- اگر قبلاً مهارتهای اساسی Java / JavaScript را داشته باشید، باید کدهای زبان Solidity برایتان واضح باشد.
- نوشتن توکنهای ERC20 در Solidity
اکنون که اصول را بیان کردیم و توضیح دادیم که برای ایجاد رمز ERC20 چه چیزی لازم است، وقت آن است که شروع به نوشتن کنیم.
ابتدا باید دو اصل mapping (نقشه برداری) را تعریف کنیم. این مفهوم در Solidity برای نمایش یک مقدار است:
mapping(address => uint256) balances; mapping(address => mapping (address => uint256)) allowed;
عبارت mapping (آدرس => uint256) یک مجموعه انجمنی را تعریف میکند که کلیدهای آن از نوع آدرس است. عددی که برای نشان دادن آدرسهای حساب استفاده میشود و مقادیر آن از نوع uint256 است. یک عدد صحیح ۲۵۶ بیتی است که به طور معمول برای ذخیره باقی ماندههای رمز استفاده میشود.
اولین عدد در mapping نقشه برداری رمز و موجودی هر حساب مالک را نگه میدارد.
دومین عدد mapping نقشه برداری، شامل تمامی اطلاعات حسابهای تأیید شده برای برداشت از یک حساب معیین، همراه با مبلغ برداشت مجاز برای هر یک خواهد بود.
این اطلاعات به همراه سایر قسمتهای قرارداد در بلاکچین ذخیره و استخراج میشوند و در نتیجه تغییرات در همه درگاههای کاربر شبکه منتشر میشود.
فضای ذخیره سازی بلاکچین، گران قیمت است و کاربران باید برای آن یک هزینه اضافی پرداخت کنند. بنابراین همیشه باید سعی کنید اندازه فایلها را به حداقل برسانید و در بلاکچین حداقلترین میزان ممکن فضا اشغال کنید.
اکنون که ساختار دادههای مورد نیاز را در اختیار داریم، میتوانیم منطق ERC20 را در توابع بنویسیم.
آموزش ساخت توکن ERC20 | تنظیم تعداد توکنهای ICO
چگونه تعداد توکنهای ICO را تنظیم کنیم؟ خوب، چندین روش برای تعیین حداکثر تعداد توکنهای ICO وجود دارد و این موضوع به تنهایی یک بحث طولانی نیاز دارد.
برای اینکه با پایینترین سطح آگاهی از ECR20 بتوانید توکن بسازید، ما از سادهترین روش استفاده خواهیم کرد: مقدار کل توکنها را در زمان ایجاد قرارداد تنظیم کنید و در ابتدا همه آنها را به “مالک قرارداد” یعنی صاحب حساب هوشمند اختصاص دهید:
uint256 totalSupply_; constructor(uint256 total) public { totalSupply_ = total; balances[msg.sender] = _totalSupply; }
یک عملکرد خاص است که بلافاصله پس از اجرای قرارداد توسط Ethereum به طور خودکار فراخوانی میشود. به طور معمول برای اندازه گیری مقدار اولیه با استفاده از پارامترهای قرارداد استفاده میشود.
msg یک متغیر جهانی است که توسط خود Ethereum محاسبه و اعلام میشود. شامل دادههای مهم برای انجام قرارداد است. پوشهای که ما در اینجا از آن استفاده میکنیم: msg.sender حاوی حساب Ethereum است که عملکرد قرارداد فعلی را اجرا میکند.
فقط سازنده حساب میتواند این اطلاعات را وارد کند. هنگام شروع، این توکن، توکنهای موجود را به حساب “مالک قرارداد” اختصاص میدهد.
کل توکن را دریافت کنید
function totalSupply() public view returns (uint256) {return totalSupply_;}
این عملکرد بدون در نظر گرفتن مالک، کل توکنهای اختصاص یافته توسط این قرارداد را بر میگرداند.
Token Balance of Owner را دریافت کنید
function balanceOf(address tokenOwner) public view returns (uint) { return balances[tokenOwner]; }
موجودی فعلی یک حساب را که توسط آدرس صاحبان آن مشخص شده است، بر میگرداند. رمزها را به حساب دیگری منتقل کنید.
function transfer(address receiver, uint numTokens) public returns (bool) { require(numTokens <= balances[msg.sender]); balances[msg.sender] = balances[msg.sender] — numTokens; balances[receiver] = balances[receiver] + numTokens; emit Transfer(msg.sender, receiver, numTokens); return true; }
همانطور که از نام آن مشخص است، برای انتقال توکن numTokens از موجودی مالک به حساب گیرنده استفاده میشود. انتقال دهنده msg.sender است. عملکرد آن به این صورت است که فقط صاحب رمزها میتوانند آنها را به دیگران منتقل کنند.
در این حالت برای انجام انتقال، از باقی مانده حساب استفاده میکند. در صورت عدم موفقیت یک گذاره، معامله بلافاصله برگشت داده میشود و هیچ تغییری در بلاکچین اعمال نمیشود.
درست قبل از خروج، باعث انتقال ERC20 میشود و به دارندگان حساب اجازه میدهد تا نسبت به اتمام و تایید آن واکنش نشان دهند.
آموزش ساخت توکن ERC20 | تایید برای برداشتن توکنها
این عملکرد اغلب در سناریوی بازار استفاده میشود.
function approve(address delegate, uint numTokens) public returns (bool) { allowed[msg.sender][delegate] = numTokens; emit Approval(msg.sender, delegate, numTokens); return true; }
یک مالک یعنی msg را تایید میکند. برای برداشتن توکنها از حساب و انتقال آنها به حسابهای دیگر استفاده میشود.
همانطور که مشاهده میکنید، این کد برای سناریوهایی که مالکان در بازار توکن ارائه میدهند، استفاده میشود. به بازار امکان میدهد معامله را بدون انتظار برای تأیید قبلی نهایی کنند.
در پایان اجرای عملکرد، یک مرحله تایید دارد.
تعداد توکنهای تأیید شده برای برداشت را دریافت کنید
function allowance(address owner, address delegate) public view returns (uint) {return allowed[owner][delegate];}
این تابع تعداد مجاز توکن توسط یک مالک را به حساب خاصی بر میگرداند، همانطور که در عملکرد تنظیم شده است.
انتقال توکنها توسط نماینده
تابع transferFrom همان تابع تأیید است که قبلاً در مورد آن بحث کردیم. این اجازه را به نماینده تایید شده برای برداشت میدهد تا وجوه مالک را به یک حساب ثالث منتقل کند.
function transferFrom(address owner, address buyer, uint numTokens) public returns (bool) { require(numTokens <= balances[owner]); require(numTokens <= allowed[owner][msg.sender]); balances[owner] = balances[owner] — numTokens; allowed[owner][msg.sender] = allowed[from][msg.sender] — numTokens; balances[buyer] = balances[buyer] + numTokens; Transfer(owner, buyer, numTokens); return true; }
این دو مورد برای شروع عملکرد لازم هستند تا تأیید کنند که معامله قانونی است، یعنی مالک به اندازه کافی توکن برای انتقال دارد و نماینده numTokens را برای برداشت تأیید کرده است.
علاوه بر انتقال مقدار numTokens از مالک به خریدار، این عملکرد همچنین numTokens را از نماینده کم میکند. اساساً به یک نماینده اجازه میدهد تا آن را به چندین برداشت جداگانه تقسیم کند، که این رفتار معمول بازار است.
ما میتوانیم در اینجا کار را متوقف کنیم و یک پیاده سازی معتبر ERC20 داشته باشیم. با این حال ما میخواهیم یک گام جلوتر برویم، و یک رمز قدرتمند و ایمن داشته باشیم. این امر مستلزم این است که کدهای خود را کمی ایمنتر کنیم، البته هنوز هم قادر خواهیم بود که توکن را به صورت ساده حفظ کنیم.
آموزش ساخت توکن ERC20 | کتابخانه Solidid : SafeMath
SafeMath یک کتابخانه Solidity است که هدف آن برخورد با هکرهایی است که هدفشان شکستن قراردادها است. در چنین حملهای، هکر قرارداد را مجبور به استفاده از مقادیر عددی نادرست میکند.
SafeMath قبل از اتفاق افتادن، با آزمایش از حساب محافظت میکند، بنابراین خطر حمله را از بین میبرد. کتابخانه به قدری کوچک است که تقریبا جایی در بلاکچین اشغال نمیکند.
بیایید SafeMath را به کد خود اضافه کنیم:
library SafeMath { // Only relevant functions function sub(uint256 a, uint256 b) internal pure returns (uint256) { assert(b <= a); return a — b; } function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; assert(c >= a); return c; } }
SafeMath برای تأیید صحت پارامترها از عبارات assert استفاده میکند. در صورت عدم موفقیت، عملکرد بلافاصله متوقف میشود و کلیه تغییرات بلاکچین باید دوباره برگردانده شود.
در مرحله بعد، بیایید جمله زیر را در معرفی کتابخانه به Compiler Solidity اضافه کنیم:
using SafeMath for uint256;
سپس، محاسبات سادهای که در ابتدا استفاده کردیم را با توابع SafeMath جایگزین میکنیم:
balances[msg.sender] = balances[msg.sender].sub(numTokens); balances[receiver] = balances[receiver].add(numTokens); balances[buyer] = balances[buyer].add(numTokens); balances[owner] = balances[owner].sub(numTokens);
توسعه دهندگان Ethereum معمولا از ابزارهایی مانند Truffle استفاده میکنند. برای نیازهای محدود شما و با توجه به آموزشهای این مقاله تنها ابزار Remix کافی خواهد بود.
برای استفاده از آن، شما باید پلاگین Metamask را بر روی مرورگر خود نصب کنید و یک حساب کاربری Rinkeby (Ethereum test (Ethereum test) را با حداقل برخی از cheenkbery در آن نصب کنید. این مراحل نسبتا ساده هستند، بنابراین ما به جزئیات نخواهیم رفت.
در صورتی که این ابزارها را ندارید به وبسایت Metamask و Rinkeby برای دانلود بروید. حالا، ما به Remix میرویم و کدها را در آن وارد میکنیم، از جمله خط Pragma و کتابخانه Safemath. سپس، ما به برگه دوم به سمت راست به نام “Run” میرویم و روی «Deploy» کلیک کنید. یک پنجره Metamask ظاهر خواهد شد از ما درخواست میکند تا معامله را تأیید کنیم و در نهایت آن را تایید میکنیم.
تبریک! شما اولین توکن ERC20 خود را به حرفهایترین شیوه، بدون کمک شخص دیگری و توسط خودتان به تنهایی جایگذاری کردید. همانطور که گفته بودیم توکنها حجم بالایی ندارند، با این حال کاملا کاربردی هستند، با استانداردهای ERC20 سازگار هستند و از همه مهمتر امن هستند. حالا توکن شما آماده تایید بارگیری و استفاده در بلاکچین است.
حال که با آموزش ساخت توکن ERC20 آشنا شدید پیشنهاد میشود از دیگر خدمات سایت اول پرداخت استفاده کنید.
نظرات کاربران