
تست قراردادهای هوشمند با Hardhat و Truffle
مقدمه
در دنیای توسعه بلاکچین، قراردادهای هوشمند قلب بسیاری از اپلیکیشنهای غیرمتمرکز یا همان DAppها هستند. این قراردادها، که با زبانهایی مانند Solidity نوشته میشوند، به صورت خودکار منطق و قوانین اپلیکیشن را اجرا میکنند. اما یک نکته بسیار مهم وجود دارد: کوچکترین باگ یا خطای منطقی</strong در این کدها میتواند منجر به از دست رفتن داراییها یا آسیب امنیتی شود.
اینجاست که تستهای خودکار وارد عمل میشوند. ابزارهایی مانند Hardhat و Truffle امکانات قدرتمندی برای نوشتن، مدیریت و اجرای تست قراردادهای هوشمند ارائه میدهند. در این راهنما به صورت آموزشی و فنی با مثالهای عملی یاد میگیرید چگونه از این دو ابزار برای افزایش امنیت و اعتماد به کد خود استفاده کنید.
چرا تست خودکار قراردادهای هوشمند حیاتی است؟
- جلوگیری از باگها و آسیبپذیریها: اجرای تست قبل از دیپلوی مانع از رسیدن خطاها به محیط واقعی میشود.
- کاهش هزینههای اصلاح: پیدا کردن و رفع مشکل قبل از انتشار به شبکه اصلی، به مراتب ارزانتر و سریعتر است.
- افزایش اعتماد: هم اعضای تیم توسعه و هم سرمایهگذاران میتوانند بر اساس تستهای موفق، به پروژه اطمینان کنند.
معرفی ابزارها: Hardhat و Truffle
Hardhat چیست؟
Hardhat یک محیط توسعه مدرن برای قراردادهای هوشمند است که ویژگیهایی مانند شبکه محلی داخلی، پشتیبانی از Ethers.js و قابلیت خطایابی تعاملی را ارائه میدهد. نصب و راهاندازی آن بسیار ساده است و انعطاف بالایی برای پروژههای پیچیده دارد.
Truffle چیست؟
Truffle یکی از قدیمیترین و محبوبترین فریمورکهای توسعه بلاکچین است که شامل سیستم مهاجرت (Migration)، ادغام با Ganache و پشتیبانی مستقیم از Mocha و Chai برای تست است.
مقایسه سریع
| ویژگی | Hardhat | Truffle |
|---|---|---|
| سرعت اجرای تست | بسیار سریع | متوسط |
| پلاگینها | زیاد و در حال رشد | متوسط |
| یادگیری | منحنی سادهتر | دارای ابزارهای جانبی |
پیشنیازها قبل از شروع
- آشنایی پایه با زبان Solidity
- نصب Node.js و npm
- نصب Hardhat و Truffle
- ساخت یک پروژه نمونه و پوشه
contracts
آموزش تست با Hardhat — گام به گام
راهاندازی پروژه
mkdir my-hardhat-project
cd my-hardhat-project
npm init -y
npm install --save-dev hardhat ethers chai
npx hardhat
نوشتن قرارداد نمونه
به عنوان مثال، یک قرارداد ساده ذخیره داده:
// contracts/Storage.sol
pragma solidity ^0.8.0;
contract Storage {
uint256 private data;
function set(uint256 _data) public {
data = _data;
}
function get() public view returns (uint256) {
return data;
}
}
نوشتن تستها با Chai و Ethers.js
// test/storage-test.js
const { expect } = require("chai");
describe("Storage contract", function () {
it("should store and retrieve data correctly", async function () {
const Storage = await ethers.getContractFactory("Storage");
const storage = await Storage.deploy();
await storage.set(42);
const value = await storage.get();
expect(value).to.equal(42);
});
});
اجرای تستها
npx hardhat test
پس از اجرا، گزارشی از موفقیت یا شکست تستها نمایش داده میشود.
آموزش تست با Truffle — گام به گام
راهاندازی پروژه
mkdir my-truffle-project
cd my-truffle-project
truffle init
نوشتن قرارداد نمونه
همان قرارداد Storage را در مسیر contracts/Storage.sol قرار دهید.
نوشتن تستها با Mocha و Chai
// test/storageTest.js
const Storage = artifacts.require("Storage");
contract("Storage", accounts => {
it("should store and retrieve data correctly", async () => {
const storage = await Storage.new();
await storage.set(42);
const value = await storage.get();
assert.equal(value.toNumber(), 42, "Stored value should be 42");
});
});
اجرای تستها
truffle test
بهترین شیوهها در نوشتن تست قرارداد هوشمند
- تست واحد برای هر تابع به صورت مجزا
- تست یکپارچهسازی برای تعامل بین چند قرارداد
- شبیهسازی شرایط خطا و ورودیهای غیر معتبر
- استفاده از کتابخانههای
assertوexpectبرای وضوح بیشتر - جدا کردن تستهای کند یا وابسته به شبکه از تستهای سریع
نکات پیشرفته
- استفاده از شبکههای تست مانند Ropsten یا Goerli برای سنجش در محیط شبهواقعی
- اندازهگیری پوشش تست با ابزار
solidity-coverage - Mock کردن وابستگیها برای سادهسازی شرایط آزمایش
- اجرای تست در فرآیند CI/CD با پلتفرمهایی مانند GitHub Actions و GitLab CI
جمعبندی و منابع بیشتر
در این راهنمای فنی یاد گرفتید که چگونه قراردادهای هوشمند را با دو ابزار محبوب بلاکچین، یعنی Hardhat و Truffle، تست کنید. با اجرای این مراحل و رعایت بهترین شیوهها، امنیت و پایداری پروژه شما به طور قابل توجهی افزایش خواهد یافت.
برای مطالعه بیشتر:



