آموزش بلاکچین

ساخت توکن ERC-20 در سال 2025: راهنمای گام‌به‌گام با استاندارد OpenZeppelin

آیا می‌دانستید که دیگر برای ساخت یک دارایی دیجیتال روی بزرگ‌ترین پلتفرم قرارداد هوشمند جهان، نیازی به تیمی از متخصصان بلاک‌چین و ماه‌ها کدنویسی نیست؟ در سال ۲۰۲۵، به لطف ابزارهای استاندارد و قدرتمندی مانند OpenZeppelin و Hardhat، این فرآیند از یک ماراتن فنی به یک اسپرینت استراتژیک تبدیل شده است. این راهنما شما را از صفر تا صدِ ساخت و انتشار اولین توکن ERC-20 خودتان همراهی می‌کند.

روند غالب: استانداردسازی و امنیت در دنیای توکن‌ها

در روزهای اولیه اتریوم، ساخت یک توکن جدید، میدانی پر از مین بود. توسعه‌دهندگان مجبور بودند همه چیز را از ابتدا بنویسند و هر اشتباه کوچکی در کد می‌توانست به فاجعه‌های امنیتی میلیون دلاری ختم شود. امروز، این پارادایم به کلی تغییر کرده است.

روند حاکم، استفاده از کتابخانه‌های استاندارد و حسابرسی‌شده مانند OpenZeppelin است. این کتابخانه‌ها مجموعه‌ای از قراردادهای هوشمند از پیش‌نوشته‌شده و تست‌شده را ارائه می‌دهند که بهترین شیوه‌های امنیتی در آن‌ها رعایت شده است. دیگر چرخ را از نو اختراع نمی‌کنیم؛ بلکه روی شانه‌های غول‌ها می‌ایستیم تا سریع‌تر و امن‌تر به هدف برسیم.

این مقاله به شما نشان می‌دهد چگونه با استفاده از این استانداردها، توکن خود را نه تنها بسازید، بلکه آن را با اطمینان خاطر در دنیای واقعی مستقر کنید.

مثال واقعی: موفقیت با استانداردسازی

بسیاری از موفق‌ترین توکن‌های DeFi و GameFi که امروز می‌شناسیم، بر پایه همین استانداردهای OpenZeppelin ساخته شده‌اند. توکن‌هایی مانند AAVE یا توکن حاکمیتی صرافی غیرمتمرکز Uniswap (UNI)، از پیاده‌سازی‌های پایه ERC-20 این کتابخانه برای اطمینان از عملکرد صحیح و امنیت خود بهره برده‌اند. این انتخاب به آن‌ها اجازه داد تا به جای درگیر شدن با جزئیات فنی پیاده‌سازی توکن، بر منطق کسب‌وکار و نوآوری‌های اصلی خود تمرکز کنند. نتیجه؟ پذیرش سریع‌تر و اعتماد بالاتر از سوی جامعه.

یک اشتباه رایج + راهکار استراتژیک

اشتباه: بسیاری از تیم‌های تازه‌کار، پس از کپی کردن یک کد نمونه، مستقیماً سراغ تغییر منطق اصلی قراردادهای OpenZeppelin می‌روند. آن‌ها سعی می‌کنند توابع `_transfer` یا `_mint` را “بهینه” کنند، غافل از اینکه هر تغییر کوچک در این هسته امنیتی، می‌تواند حفره‌های پیش‌بینی‌نشده‌ای ایجاد کند.

راهکار استراتژیک: به جای دستکاری هسته، از «قلاب‌ها» (Hooks) و الگوهای توسعه‌پذیر استفاده کنید. قراردادهای OpenZeppelin طوری طراحی شده‌اند که قابل ارتقا و توسعه باشند. به جای تغییر تابع اصلی، تابع `_beforeTokenTransfer` را بازنویسی (override) کنید تا منطق سفارشی خود (مثلاً اعمال کارمزد یا قرار دادن یک آدرس در لیست سیاه) را قبل یا بعد از هر انتقال، بدون دست زدن به کد اصلی و امن، پیاده‌سازی کنید. این رویکرد، هم امنیت را حفظ می‌کند و هم انعطاف‌پذیری را فراهم می‌آورد.

پیش‌نیازهای فنی برای شروع

قبل از نوشتن اولین خط کد، مطمئن شوید این ابزارها روی سیستم شما نصب شده‌اند:

  • Node.js و npm: برای مدیریت پکیج‌ها و اجرای اسکریپت‌ها. می‌توانید از وبسایت رسمی Node.js آن را دانلود کنید.
  • کیف پول MetaMask: برای تعامل با شبکه‌های تست و شبکه اصلی اتریوم.
  • کمی اتر تستی (Sepolia ETH): برای پرداخت هزینه گس (Gas) در شبکه تست. می‌توانید از Faucetهای آنلاین مانند Sepolia Faucet اتر رایگان دریافت کنید.

گام اول: راه‌اندازی محیط توسعه با Hardhat

Hardhat یک محیط توسعه قدرتمند برای اتریوم است که کامپایل، تست و دیپلوی قراردادهای هوشمند را ساده می‌کند. برای شروع، یک پوشه جدید برای پروژه خود بسازید و دستورات زیر را در ترمینال اجرا کنید:


mkdir my-erc20-token
cd my-erc20-token
npm init -y
npm install --save-dev hardhat

حالا Hardhat را در پروژه خود راه‌اندازی کنید:

npx hardhat

در مراحل نصب، گزینه `Create a JavaScript project` را انتخاب کرده و با تنظیمات پیش‌فرض موافقت کنید. این دستور ساختار پوشه لازم، شامل پوشه‌های `contracts`, `scripts`, و `test` را ایجاد می‌کند.

گام دوم: نصب کتابخانه OpenZeppelin

قلب تپنده توکن ما، قراردادهای استاندارد OpenZeppelin است. این کتابخانه را به پروژه خود اضافه کنید:

npm install @openzeppelin/contracts

این دستور، تمام قراردادهای هوشمند استاندارد، از جمله ERC20، ERC721 و ابزارهای کنترل دسترسی را در پوشه `node_modules` پروژه شما قرار می‌دهد.

گام سوم: کدنویسی قرارداد هوشمند توکن

زمان نوشتن کد است! فایل پیش‌فرض داخل پوشه `contracts` را حذف کرده و یک فایل جدید به نام `MyToken.sol` بسازید. کد زیر یک توکن ERC-20 ساده، قابل مینت (Mintable) و با کنترل دسترسی مالک (Ownable) ایجاد می‌کند.

```solidity
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;

import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/token/ERC20/extensions/ERC20Burnable.sol";

/**
 * @title MyToken
 * @dev Simple ERC20 token with minting controlled by the owner.
 * The owner can mint new tokens, and any user can burn their own tokens.
 */
contract MyToken is ERC20, Ownable, ERC20Burnable {
/**
* @dev Constructor that sets the token name and symbol.
* The initial supply is 0. The deployer of the contract is set as the initial owner.
*/
constructor(address initialOwner) ERC20("My Token", "MYT") Ownable(initialOwner) {
// The contract is initialized with the specified owner.
}

/**
* @dev Creates `amount` new tokens and assigns them to `to`.
* Can only be called by the owner.
* @param to The address that will receive the minted tokens.
* @param amount The amount of tokens to mint.
*/
function mint(address to, uint256 amount) public onlyOwner {
_mint(to, amount);
}
}

تحلیل کد:

  • `import`: ما سه قرارداد اصلی را از OpenZeppelin وارد می‌کنیم: `ERC20` (پیاده‌سازی پایه)، `Ownable` (برای محدود کردن دسترسی تابع `mint` به مالک قرارداد) و `ERC20Burnable` (به کاربران اجازه می‌دهد توکن‌های خود را بسوزانند).
  • `contract MyToken is ERC20, Ownable, ERC20Burnable`: قرارداد ما از این سه قرارداد ارث‌بری می‌کند و تمام قابلیت‌های آن‌ها را به دست می‌آورد.
  • `constructor`: هنگام دیپلوی قرارداد، نام توکن (“My Token”)، نماد آن (“MYT”) و آدرس مالک اولیه را تنظیم می‌کند.
  • `function mint`: این تابع عمومی به مالک قرارداد (و فقط مالک) اجازه می‌دهد تا توکن‌های جدیدی را به هر آدرسی ارسال کند. مکانیزم `onlyOwner` از کتابخانه `Ownable` این محدودیت را اعمال می‌کند.

گام چهارم: پیکربندی Hardhat برای دیپلوی

برای دیپلوی کردن قرارداد روی یک شبکه واقعی (حتی تستی)، باید فایل `hardhat.config.js` را ویرایش کنیم. این فایل باید شامل اطلاعات شبکه (مانند Sepolia) و کلید خصوصی حساب شما باشد.

ابتدا، پکیج `dotenv` را برای مدیریت امن کلید خصوصی نصب کنید:

npm install dotenv

سپس یک فایل به نام `.env` در ریشه پروژه بسازید و کلید خصوصی کیف پول MetaMask و URL نود RPC خود (که می‌توانید از سرویس‌هایی مانند Infura یا Alchemy دریافت کنید) را در آن قرار دهید:


# .env file
SEPOLIA_RPC_URL="YOUR_INFURA_OR_ALCHEMY_URL"
PRIVATE_KEY="YOUR_METAMASK_PRIVATE_KEY"

مهم: هرگز کلید خصوصی خود را در کدهای عمومی به اشتراک نگذارید! فایل `.env` را به `.gitignore` خود اضافه کنید.

حالا فایل `hardhat.config.js` را به شکل زیر به‌روزرسانی کنید:

javascript
require("@nomicfoundation/hardhat-toolbox");
require("dotenv").config();

/** @type import('hardhat/config').HardhatUserConfig */
module.exports = {
  solidity: "0.8.20",
  networks: {
sepolia: {
url: process.env.SEPOLIA_RPC_URL || "",
accounts:
process.env.PRIVATE_KEY !== undefined ? [process.env.PRIVATE_KEY] : [],
},
  },
};

گام پنجم: نوشتن اسکریپت دیپلوی

در پوشه `scripts`، یک فایل جدید به نام `deploy.js` بسازید. این اسکریپت مسئول کامپایل و ارسال قرارداد به شبکه بلاک‌چین است.

javascript
const hre = require("hardhat");

async function main() {
  const [deployer] = await hre.ethers.getSigners();
  console.log("Deploying contracts with the account:", deployer.address);

  const MyToken = await hre.ethers.getContractFactory("MyToken");
  // Pass the deployer's address as the initial owner
  const myToken = await MyToken.deploy(deployer.address);

  await myToken.waitForDeployment();

  const contractAddress = await myToken.getAddress();
  console.log("MyToken deployed to:", contractAddress);
}

main().catch((error) => {
  console.error(error);
  process.exitCode = 1;
});

این اسکریپت، قرارداد `MyToken` را با استفاده از حساب تعریف‌شده در فایل `.env` به عنوان مالک اولیه، دیپلوی می‌کند.

گام ششم: دیپلوی توکن در شبکه تست Sepolia

همه چیز آماده است! با اجرای دستور زیر، توکن خود را روی شبکه تست Sepolia منتشر کنید:

npx hardhat run scripts/deploy.js --network sepolia

اگر همه چیز درست پیش برود، ترمینال آدرس قرارداد هوشمند توکن شما را نمایش می‌دهد. تبریک می‌گویم! توکن شما اکنون روی بلاک‌چین اتریوم (شبکه تست) زنده است. می‌توانید این آدرس را در Sepolia Etherscan جستجو کرده و جزئیات آن را مشاهده کنید.

برای مشاهده توکن در MetaMask، گزینه “Import tokens” را انتخاب کرده و آدرس قرارداد را وارد کنید.


نکات کلیدی این مقاله (Key Takeaways)

  • امنیت با استاندارد: همیشه از کتابخانه‌های حسابرسی‌شده مانند OpenZeppelin استفاده کنید. اختراع مجدد چرخ در قراردادهای هوشمند، یک ریسک امنیتی بزرگ است.
  • محیط توسعه مدرن: فریم‌ورک Hardhat فرآیند کامپایل، تست و دیپلوی را به شدت ساده و بهینه می‌کند.
  • کنترل دسترسی حیاتی است: با استفاده از الگوهایی مانند `Ownable`، مشخص کنید چه کسی مجاز به انجام عملیات حساس مانند ساخت توکن‌های جدید (Minting) است.

برای مطالعه عمیق‌تر:

قراردادهای قابل ارتقا (Upgradable Contracts): چگونه توکن خود را در آینده آپدیت کنیم؟

یاد بگیرید چگونه با استفاده از الگوی پروکسی، منطق قرارداد هوشمند خود را بدون تغییر آدرس آن و از دست دادن داده‌ها، به‌روزرسانی کنید.

مدل‌های توزیع توکن: از ایردراپ (Airdrop) تا فروش عمومی (ICO/IDO)

اکنون که توکن خود را ساخته‌اید، استراتژی‌های مختلف برای توزیع آن بین کاربران و سرمایه‌گذاران اولیه را بررسی کنید.

سوالات متداول (FAQ)

هزینه ساخت و دیپلوی یک توکن ERC-20 چقدر است؟

هزینه به قیمت گس (Gas) شبکه اتریوم در لحظه دیپلوی بستگی دارد. در شبکه‌های تست مانند Sepolia رایگان است (فقط به اتر تستی نیاز دارید). در شبکه اصلی (Mainnet)، این هزینه می‌تواند از ده‌ها تا چند صد دلار متغیر باشد.

چگونه می‌توانم برای توکن خود عرضه کل (Total Supply) ثابت تعیین کنم؟

به جای استفاده از تابع `mint`، می‌توانید در `constructor` قرارداد، مقدار اولیه توکن‌ها را با استفاده از `_mint(msg.sender, initialSupply)` بسازید. برای این کار باید مقدار `initialSupply` را به عنوان ورودی به `constructor` اضافه کنید و تابع `mint` را حذف نمایید تا عرضه کل ثابت بماند.

آیا پس از دیپلوی می‌توانم نام یا نماد توکن را تغییر دهم؟

خیر. اطلاعاتی که در `constructor` تنظیم می‌شوند (نام و نماد) در بلاک‌چین ثبت شده و غیرقابل تغییر هستند. برای تغییر آن‌ها باید قرارداد جدیدی دیپلوی کنید، مگر اینکه از ابتدا قرارداد خود را به صورت قابل ارتقا (Upgradable) طراحی کرده باشید.

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا