تست و دیباگ یکی از مراحل حیاتی در فرآیند توسعه قراردادهای هوشمند است. برخلاف برنامهنویسی سنتی، خطا در یک قرارداد هوشمند میتواند باعث از دست رفتن داراییها شود. به همین دلیل استفاده از ابزارهای تست و دیباگ مانند Hardhat، Mocha/Chai، Ganache و Mock Contracts در توسعه با سالیدیتی امری ضروری است. در این مقاله با این ابزارها و روش استفاده از آنها آشنا میشوید.
Hardhat یکی از محبوبترین محیطهای توسعه برای سالیدیتی است که امکان کامپایل، دیپلوی، تست و دیباگ قراردادهای هوشمند را در اختیار شما قرار میدهد.
npm install --save-dev hardhatnpx hardhat
سپس پروژه را ایجاد و ساختار فایلها را تنظیم کنید.
Hardhat بهصورت پیشفرض از Mocha (فریمورک تست) و Chai (ابزار assertion) استفاده میکند. تست واحد (unit test) برای بررسی عملکرد توابع بهصورت جداگانه کاربرد دارد.
مثال تست ساده برای یک توکن:
کد قرارداد:
// contracts/MyToken.solpragma solidity ^0.8.0;import "@openzeppelin/contracts/token/ERC20/ERC20.sol";contract MyToken is ERC20 {constructor() ERC20("TestToken", "TTK") {_mint(msg.sender, 1000);}}
کد تست:
const { expect } = require("chai");describe("MyToken", function () {it("Should assign total supply to deployer", async function () {const [owner] = await ethers.getSigners();const Token = await ethers.getContractFactory("MyToken");const token = await Token.deploy();const balance = await token.balanceOf(owner.address);expect(await token.totalSupply()).to.equal(balance);});});
نکات تست:
- هر تابع باید حداقل یک تست داشته باشد.
- از beforeEach برای تنظیم دادهها در هر تست استفاده شود.
- بررسی کنید که تمام مسیرهای منطقی پوشش داده شده باشند (Code Coverage).
در قراردادهای پیچیده، گاهی نیاز به شبیهسازی (mock) قراردادهای خارجی دارید تا رفتار تعامل با آنها را تست کنید.
کاربرد Mock:
- تست قراردادهایی که وابسته به اوراکل، توکن یا سرویسهای خارجی هستند.
- شبیهسازی پاسخ دلخواه از یک تابع خاص برای بررسی منطق داخلی قرارداد اصلی.
مثال با Waffle:
// MockPriceFeed.solpragma solidity ^0.8.0;contract MockPriceFeed {function getPrice() external pure returns (uint) {return 2000;}}
سپس میتوانید در تستها، بهجای قرارداد واقعی از MockPriceFeed استفاده کرده و تعامل قرارداد اصلی را بررسی کنید.
Ganache یک ابزار قدرتمند برای اجرای یک شبکه بلاکچین محلی است که توسط Truffle ارائه میشود. این ابزار برای تستهای پیچیده و بررسی وضعیت تراکنشها و گس بسیار کاربردی است.
ویژگیها:
- ارائه 10 آدرس با اتر تستی از ابتدا
- بررسی دقیق گس مصرفی و جزئیات تراکنش
- رابط گرافیکی برای مشاهده وضعیت شبکه
نصب و راهاندازی:
npm install -g ganacheganache
سپس در hardhat.config.js شبکه را به شکل زیر تنظیم کنید:
ganache: {url: "http://127.0.0.1:8545",accounts: ["PRIVATE_KEY"]}
با این تنظیمات، میتوانید تستها یا دیپلویها را مستقیماً در شبکه لوکال اجرا و بررسی کنید.
تست و دیباگ قراردادهای هوشمند یکی از ارکان حیاتی در توسعه امن و حرفهای Web3 است. با استفاده از ابزارهایی مانند Hardhat، Mocha/Chai، Ganache و Mock Contracts، میتوانید کد خود را در شرایط مختلف شبیهسازی، تست و بهینهسازی کنید. این فرآیند نه تنها باعث افزایش کیفیت محصول نهایی میشود، بلکه از وقوع مشکلات جدی در شبکه اصلی جلوگیری میکند.